Kbase P115920: Sample code to make a dynamic dump with a distinct array delimiter character?
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  09/05/2006 |
|
Status: Unverified
GOAL:
Sample code to make a dynamic dump with a distinct array delimiter character?
FIX:
DEFINE VARIABLE hBuf AS HANDLE.
/* list of fields in the buffer */
DEFINE VARIABLE flist AS CHARACTER INIT ?.
/* buffer table name */
DEFINE VARIABLE tname AS CHARACTER INIT ?.
/* field delimiter */
DEF VAR fielddelim AS CHARACTER.
fielddelim = ",".
/* array delimiter */
DEF VAR arraydelim AS CHARACTER.
arraydelim = ";".
OUTPUT TO "cust.d".
FOR EACH customer NO-LOCK :
hBuf = BUFFER customer:HANDLE.
RUN dumpBuffer( INPUT hBuf ).
END.
OUTPUT CLOSE.
/* Note dumpBuffer uses a buffer handle as input parameter */
/* it doesn't have to know the table name or field names */
PROCEDURE dumpBuffer:
DEFINE INPUT PARAMETER hbuf AS HANDLE.
DEF VAR vi AS INT.
DEF VAR vj AS INT.
DEFINE VARIABLE hFld AS HANDLE.
DEF VAR fdelim AS CHARACTER.
/* init table name and field list */
/* one time only operation */
IF tname = ? THEN
DO:
tname = hbuf:NAME.
FIND FIRST _file WHERE _file-name = tname NO-LOCK NO-ERROR.
flist = "".
FOR EACH _field OF _file NO-LOCK:
flist = flist + "," + _field-name.
END.
flist = SUBSTRING( flist, 2 ).
END.
fdelim = fielddelim.
REPEAT vi = 1 TO NUM-ENTRIES( flist ):
/* if last field don't output the delimiter */
IF( vi = NUM-ENTRIES( flist ) ) THEN fdelim = ''.
hFld = hbuf:BUFFER-FIELD( ENTRY( vi, flist ) ).
IF hFld:EXTENT = 0 THEN
/* non array field */
PUT UNFORMATTED
hFld:BUFFER-VALUE
fdelim.
ELSE DO:
/* output array extents */
DO vj = 1 TO hFld:EXTENT:
PUT UNFORMATTED
hFld:BUFFER-VALUE(vj)
( IF vj = hFld:EXTENT THEN fdelim ELSE arraydelim ).
END.
END.
END.
/* move to the next line */
PUT SKIP.
END PROCEDURE.