Consultor Eletrônico



Kbase P4410: How to EXPORT a record dynamically.
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   5/18/2011
Status: Verified

GOAL:

How to EXPORT a record into a variable

GOAL:

How to EXPORT a record dynamically

GOAL:

How to EXPORT a record via a buffer-object handle

GOAL:

How to export / dump a table dynamically

GOAL:

How to achieve a kind of dynamic export with a given record buffer handle?

FACT(s) (Environment):

Progress 9.x
OpenEdge 10.0x
All Supported Operating Systems

FIX:

The following piece of code emulates a dynamic EXPORT statement, which is currently missing from the 4GL.

FUNCTION dynExport RETURNS CHARACTER
(INPUT hRecord AS HANDLE,
INPUT cDelim AS CHARACTER):

DEF VAR hFld AS HANDLE.
DEF VAR iCnt AS INTEGER.
DEF VAR iExtnt AS INTEGER.
DEF VAR cTmp AS CHARACTER.
DEF VAR cArray AS CHARACTER.
DEF VAR cResult AS CHARACTER.

IF hRecord:TYPE <> "BUFFER" THEN
RETURN ?.
DO iCnt = 1 TO hRecord:NUM-FIELDS:
ASSIGN hFld = hRecord:BUFFER-FIELD(iCnt).
IF hFld:EXTENT = 0 THEN DO:
ASSIGN cTmp = (IF hFld:BUFFER-VALUE = ? THEN "?"
ELSE
(IF hFld:DATA-TYPE = "character" THEN
QUOTER(hFld:BUFFER-VALUE)
ELSE IF hFld:DATA-TYPE = "raw" THEN
'"' + STRING(hFld:BUFFER-VALUE) + '"'
ELSE STRING(hFld:BUFFER-VALUE)))
cResult = (IF iCnt = 1 THEN cTmp
ELSE cResult + cDelim + cTmp).
END.
ELSE DO:
DO iExtnt = 1 TO hFld:EXTENT:
ASSIGN cTmp = (IF hFld:BUFFER-VALUE(iExtnt) = ? THEN "?"
ELSE
(IF hFld:DATA-TYPE = "character" THEN
QUOTER(hFld:BUFFER-VALUE(iExtnt))
ELSE IF hFld:DATA-TYPE = "raw" THEN
. '"' + STRING(hFld:BUFFER-VALUE(iExtnt)) + '"'
ELSE STRING(hFld:BUFFER-VALUE(iExtnt))))
cArray = (IF iExtnt = 1 THEN cTmp
ELSE cArray + cDelim + cTmp).
END.
ASSIGN cResult = (IF iCnt = 1 THEN cArray
ELSE cResult + cDelim + cArray).
END.
END.
RETURN cResult.
END.


The function can be invoked to:

1. Export the record content to a variable:

DEF VAR myVar AS CHARACTER.

FIND FIRST customer.
ASSIGN myVar = dynExport(INPUT BUFFER customer:HANDLE, " ").
MESSAGE myVar VIEW-AS ALERT-BOX.


2. Emulate a dynamic EXPORT statement for a single record:

FIND FIRST customer.
OUTPUT TO test.txt.
PUT UNFORMATTED dynExport(INPUT BUFFER customer:HANDLE, " ") SKIP.
OUTPUT CLOSE.


3. Dynamically dump an entire table, when the table name is unknown at design time:

DEFINE VARIABLE f-table AS CHARACTER FORMAT "X(30)":U. /* table name */
DEFINE VARIABLE f-folder AS CHARACTER FORMAT "X(30)":U. /* directory name */

DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.
DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO.

CREATE BUFFER hBuffer FOR TABLE f-table.
CREATE QUERY hQuery.
hQuery:SET-BUFFERS(hBuffer).
hQuery:QUERY-PREPARE("FOR EACH " + f-table).
hQuery:QUERY-OPEN().

OUTPUT TO VALUE(f-folder + "\" + f-table + ".csv").

hQuery:GET-FIRST().
DO WHILE NOT hQuery:QUERY-OFF-END:
cExportData = dynExport(INPUT hBuffer, INPUT ",").
PUT UNFORMATTED cExportData SKIP.
hQuery:GET-NEXT().
END.

OUTPUT CLOSE.

hQuery:QUERY-CLOSE()..