Consultor Eletrônico



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.

/*-------------------------------------------------------------------------*/.