PROCEDURE PostProcessReportToAsciiOutput( prmFN ) LOCAL fp, vrida, outf, cFn cFN = m.TEMPDIR + SYS(2015)+'.txt' outf = fcreate( m.cFN ) if m.outf<0 ERROR 'Cannot create file ' + m.cFN return endif fp = fopen( m.prmFN ) if fp<0 ERROR 'Cannot open file ' + m.prmFN fclose( m.outf ) dele file (m.cFN) return endif do while !feof( m.fp ) vrida = fgets( m.fp, 8000 ) do case case '*:RAW' $ m.vrida && output uncahnged fputs( m.outf, strt(m.vrida, '*:RAW', '') ) CASE LEFT(m.vrida,LEN('*:PADR') )='*:PADR' * *:PADRnnn padding fputs( m.outf, PADR( ConvertPercent( SUBSTR(m.vrida,LEN('*:PADR')+3+1) ), ; VAL( SUBSTR(m.vrida,LEN('*:PADR')+1,3) ) )) case !empty(m.vrida) and alltr(m.vrida)#chr(12) fputs( m.outf, ConvertPercent( chrt( m.vrida, chr(12), '' ) ) ) endcase enddo fclose( m.outf ) fclose(m.fp) dele file (m.prmFN) rename (m.cFN) to (m.prmFN) ENDPROC * convert hex codes to special characters FUNCTION ConvertPercent( tcInput ) LOCAL lnPcntPos, lcOutput lcOutput="" DO WHILE !EMPTY( m.tcInput) lnPcntPos=AT("%%%", m.tcInput) IF lnPcntPos>0 lcOutput= m.lcOutput+LEFT( m.tcInput, ; lnPcntPos-1)+CHR(EVAL('0x'+SUBSTR(m.tcInput,m.lnPcntPos+1+2,2))) tcInput=SUBSTR( m.tcInput, m.lnPcntPos+3+2) ELSE lcOutput= m.lcOutput+ m.tcInput tcInput="" ENDIF ENDDO RETURN m.lcOutput>Good catch, Andrus. What I found there serves to avoid whole columns of data that become blank if they are not saved in that order, especially after migrating reports from DOS which results in overlaping report fields.
SELECT *, ; >> ICASE( INLIST(ObjType,1,2,3,4,9,10), ; >> '1'+TRANSFORM(RECNO(),'@L 999999'),; >> INLIST(ObjType,5,6,7,8), ; >> '2'+TRANSFORM(999999 - HPos,'@L 999999'), ; >> '3'+TRANSFORM(RECNO(),'@L 999999')) ; >> AS cOrder ; >> FROM oldreport.frx ; >> ORDER BY cOrder ; >> INTO TABLE newreport.frx ; >> WHERE platform='WINDOWS' >>