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..