Consultor Eletrônico



Kbase P108568: 4GL/ABL: How to dump a Progress Database using 4GL/ABL dynamic queries?
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   01/12/2008
Status: Verified

GOAL:

4GL/ABL: How to dump a Progress Database using 4GL/ABL dynamic queries?

GOAL:

How to programmatically dump a Progress Database using 4GL/ABL dynamic queries?

FACT(s) (Environment):

All Supported Operating Systems
Progress 9.x
OpenEdge 10.x

FIX:

The following code dumps the data of the connected database using dynamic queries:
/***************Define needed variables************/
DEFINE VARIABLE hBufferHandle AS HANDLE NO-UNDO.
DEFINE VARIABLE cTableName AS CHARACTER NO-UNDO.
DEFINE VARIABLE iFieldCounter AS INTEGER NO-UNDO.
DEFINE VARIABLE iExtentCounter AS INTEGER NO-UNDO.
DEFINE VARIABLE hFieldHandle AS HANDLE NO-UNDO.
DEFINE VARIABLE hQueryHandle AS HANDLE NO-UNDO.
/** Loop Through User Tables of the currently connected Database **/
FOR EACH _File NO-LOCK WHERE _Tbl-Type = "T":
RUN ExportCurrentTableData(INPUT _File-Name).
END.
PROCEDURE ExportCurrentTableData:
DEFINE INPUT PARAMETER cTableName AS CHARACTER.
DEFINE VARIABLE cFileName AS CHARACTER NO-UNDO.
/* Assign the name of the output file for the current table */

cFileName = cTableName + ".dat".
OUTPUT TO VALUE(cFileName).

/* Create dynamic query for the cTablename */
CREATE BUFFER hBufferHandle FOR TABLE cTableName.
CREATE QUERY hQueryHandle.
hQueryHandle:SET-BUFFERS(hBufferHandle).
hQueryHandle:QUERY-PREPARE("for each " + cTableName + " NO-LOCK").
hQueryHandle:QUERY-OPEN.

/* Iterate through all the records of the current table */
REPEAT:
hQueryHandle:GET-NEXT().
IF hQueryHandle:QUERY-OFF-END THEN LEAVE.
/* Iterate through all the fields of the current record */
DO iFieldCounter = 1 TO hBufferHandle:NUM-FIELDS:
hFieldHandle = hBufferHandle:BUFFER-FIELD(iFieldCounter).
IF hFieldHandle:EXTENT = 0 THEN DO:
IF iFieldCounter > 1 THEN PUT UNFORMATTED " ".
IF (hFieldHandle:DATA-TYPE = "CHARACTER") THEN
PUT UNFORMATTED '"' hFieldHandle:BUFFER-VALUE '"'.
ELSE
PUT UNFORMATTED hFieldHandle:BUFFER-VALUE.
END. /* hFieldHandle:EXTENT = 0 */
ELSE
DO iExtentCounter = 1 TO hFieldHandle:EXTENT:
IF iExtentCounter > 1 THEN PUT UNFORMATTED " ".
IF (hFieldHandle:DATA-TYPE = "CHARACTER") THEN
PUT UNFORMATTED '"' hFieldHandle:BUFFER-VALUE[iExtentCounter] '"'.R> ELSE
PUT UNFORMATTED hFieldHandle:BUFFER-VALUE[iExtentCounter].
END. /* DO iExtentCounter */
END. /* DO iFieldCounter */
PUT UNFORMATTED SKIP.
END. /* REPEAT */
OUTPUT CLOSE.
DELETE OBJECT hBufferHandle.
DELETE OBJECT hQueryHandle.
END PROCEDURE..