DEFINE VARIABLE cDir AS CHARACTER NO-UNDO.
DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.
DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO.
DEFINE VARIABLE iTmp AS INTEGER NO-UNDO.
DEFINE VARIABLE iTmp2 AS INTEGER NO-UNDO.
DEFINE VARIABLE cFieldList AS CHARACTER NO-UNDO.
/* These fields will be exported if SomeFields preprocessor is defined comment preprocessor if you want to dump all fields */
ASSIGN cFieldList = 'custnum,name'.
&SCOPED-DEFINE SomeFields *
/* comment/uncomment eiter of next two statements to put in the first row fieldnames or fieldlabels*/
/* if you don't want either of them comment both */
/* So if you want a header with the fieldnames then comment FieldLabel */
/* If you want a header with Field Labels then comment FileNames */
/* If you dont want header comment both */
/* &SCOPED-DEFINE FieldNames * */
&SCOPED-DEFINE FieldLabels *
/* change this if you want different Delimiter then semi-colon */
&SCOPED-DEFINE Delim ~';~'
/* comment this line to dump all tables or change tablename to dump another table */
&Scoped-define TABLE-NAME customer
/* output directory change this to antoher output directpry if needed */
ASSIGN cDir = 'C:\temp\'.
DEFINE STREAM sOut.
FOR EACH _file WHERE &IF DEFINED(TABLE-NAME)
&THEN
_file._file-name = '{&TABLE-NAME}' AND
&endif
_file._hidden = NO NO-LOCK:
OUTPUT STREAM sOut TO VALUE(cDir + _file._file-name + '.csv').
CREATE BUFFER hBuffer FOR TABLE _file._file-name.
CREATE QUERY hQuery.
hQuery:ADD-BUFFER(hBuffer).
hQuery:QUERY-PREPARE("FOR EACH " + hBuffer:NAME + " NO-LOCK").
hQuery:QUERY-OPEN().
hQuery:GET-FIRST().
&IF DEFINED(FieldNames) > 0 &THEN
DO iTmp = 1 TO hBuffer:NUM-FIELDS:
&IF DEFINED (Somefields) > 0 &THEN
IF LOOKUP(hBuffer:BUFFER-FIELD(iTmp):NAME,cFieldList) > 0 THEN
&ENDIF
PUT STREAM sOut UNFORMATTED hBuffer:BUFFER-FIELD(iTmp):NAME {&Delim}.
END.
PUT STREAM sOut SKIP.
&ELSEIF DEFINED(FieldLabels) > 0 &THEN
DO iTmp = 1 TO hBuffer:NUM-FIELDS:
&IF DEFINED (Somefields) > 0 &THEN
IF LOOKUP(hBuffer:BUFFER-FIELD(iTmp):NAME,cFieldList) > 0 THEN
&ENDIF
PUT STREAM sOut UNFORMATTED hBuffer:BUFFER-FIELD(iTmp):LABEL {&Delim}.
END.
PUT STREAM sOut SKIP.
&ENDIF
DO WHILE NOT hQuery:QUERY-OFF-END:
DO iTmp = 1 TO hBuffer:NUM-FIELDS:
&IF DEFINED(SomeFields) > 0 &THEN
IF LOOKUP(hBuffer:BUFFER-FIELD(iTmp):NAME,cFieldList) > 0 THEN DO:
&ENDIF
IF hBuffer:BUFFER-FIELD(iTmp):EXTENT = 0
THEN DO:
IF hbuffer:BUFFER-FIELD(iTmp):DATA-TYPE = "CHARACTER"
THEN PUT STREAM sOut UNFORMATTED '"' hBuffer:BUFFER-FIELD(iTmp):BUFFER-VALUE '"' {&Delim}.
ELSE PUT STREAM sOut UNFORMATTED hBuffer:BUFFER-FIELD(iTmp):BUFFER-VALUE {&Delim}.
END.
ELSE DO iTmp2 = 1 TO hBuffer:BUFFER-FIELD(iTmp):EXTENT: /* it is an extent field so we walk through the extents */
IF hBuffer:BUFFER-FIELD(iTmp):DATA-TYPE = "CHARACTER"
THEN PUT STREAM sOut UNFORMATTED '"' hBuffer:BUFFER-FIELD(iTmp):BUFFER-VALUE(iTmp2) '"' {&Delim}.
ELSE PUT STREAM sOut UNFORMATTED hBuffer:BUFFER-FIELD(iTmp):BUFFER-VALUE(iTmp2) {&Delim}.
END.
&IF DEFINED(SomeFields) > 0 &THEN
END.
&ENDIF
END.
PUT STREAM sOut SKIP.
hQuery:GET-NEXT().
END.
/* cleanup and close */
hQuery:QUERY-CLOSE().
DELETE OBJECT hBuffer.
DELETE OBJECT hQuery.
OUTPUT STREAM sOut CLOSE.
END.