Kbase P101308: How to serialize a ProDataSet to a CLOB
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  28/05/2005 |
|
Status: Unverified
GOAL:
How to serialize a ProDataSet to a CLOB
GOAL:
How to serialize a Temp Table to a CLOB
FACT(s) (Environment):
OpenEdge 10.0x
FIX:
The following code can be used as a starting point. It should be modified as required.
/*---------------------------------------------------------------------------
Call TTtoClob directly to serialize single temp-tables,
or call PDStoClob to serialize an entire ProDataSet at once.
---------------------------------------------------------------------------*/
PROCEDURE PDStoClob:
/* Serialize ProDataSet.
Relies on TTtoClob to serialize individual tables.
Table delimiter is CHR(3) */
DEFINE INPUT PARAMETER DATASET-HANDLE hDS.
DEFINE OUTPUT PARAMETER lcPDS AS LONGCHAR.
DEFINE VARIABLE lcTemp AS LONGCHAR NO-UNDO.
DEFINE VARIABLE hTemp AS HANDLE NO-UNDO.
DEFINE VARIABLE iTableCount AS INTEGER NO-UNDO.
DO iTableCount = 1 TO hDS:NUM-BUFFERS:
hTemp = hDS:GET-BUFFER-HANDLE(iTableCount):TABLE-HANDLE.
RUN TTtoClob(INPUT TABLE-HANDLE hTemp, OUTPUT lcTemp).
lcPDS = lcPDS + (IF iTableCount > 1 THEN CHR(3) ELSE "" ) + lcTemp.
END.
END PROCEDURE.
/*-------------------------------------------------------------------------*/
PROCEDURE TTtoClob:
/* serialize individual temp-tables
field delimiter is CHR(1), record delimiter is CHR(2) */
DEFINE INPUT PARAMETER TABLE-HANDLE hTT.
DEFINE OUTPUT PARAMETER lcTable AS LONGCHAR.
DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.
DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO.
DEFINE VARIABLE iFieldCount AS INTEGER NO-UNDO.
hBuffer = hTT:DEFAULT-BUFFER-HANDLE.
CREATE QUERY hQuery.
hQuery:SET-BUFFERS(hBuffer).
hQuery:QUERY-PREPARE("FOR EACH " + hTT:NAME).
hQuery:QUERY-OPEN().
DO WHILE hQuery:GET-NEXT():
IF LENGTH(lcTable) > 0 THEN lcTable = lcTable + CHR(2).
DO iFieldCount = 1 TO hBuffer:NUM-FIELDS:
/* this would need to be expanded to account for extent fields
and 'problematic' datatypes:
clob -> append to lcTable directly to avoid 32k limit in STRING() function.
raw and blob -> run through base64-encode() function (10.0B and up) and
append returned longchar as is.
date, decimal -> temporarily force numeric decimal .and seperator,
date format etc. to fixed values to avoid trouble
(should actually do so outside of the loop to save processing)
*/
lcTable = lcTable + (IF iFieldCount > 1 THEN CHR(1) ELSE "" )
+ STRING(hBuffer:BUFFER-FIELD(iFieldCount):BUFFER-VALUE).
END.
END.
DELETE OBJECT hQuery.
END PROCEDURE.
/*-------------------------------------------------------------------------*/.