XML in Dynamic Temp Tables

creates dynamic temp-table and fills data from xml file.

define input parameter filename as character.
define output parameter TABLE-HANDLE TableData.

DEFINE VARIABLE cSourceType AS CHARACTER NO-UNDO.
DEFINE VARIABLE cReadMode AS CHARACTER NO-UNDO.
DEFINE VARIABLE lOverrideDefaultMapping AS LOGICAL NO-UNDO.
DEFINE VARIABLE cFile AS CHARACTER NO-UNDO.
DEFINE VARIABLE cEncoding AS CHARACTER NO-UNDO.
DEFINE VARIABLE cSchemaLocation AS CHARACTER NO-UNDO.
DEFINE VARIABLE cFieldTypeMapping AS CHARACTER NO-UNDO.
DEFINE VARIABLE cVerifySchemaMode AS CHARACTER NO-UNDO.
DEFINE VARIABLE retOK AS LOGICAL NO-UNDO.
DEFINE VARIABLE httCust AS HANDLE NO-UNDO.

CREATE TEMP-TABLE TableData.
ASSIGN cSourceType = "file"
cFile = filename
cReadMode = "empty"
cSchemaLocation = ?
lOverrideDefaultMapping = ?
cFieldTypeMapping = ?
cVerifySchemaMode = ?.
retOK = TableData:READ-XML(cSourceType, cFile, cReadMode, cSchemaLocation, lOverrideDefaultMapping, cFieldTypeMapping, cVerifySchemaMode).
 
readdataset = read table.

In this example i am reading dataset from file, compare incoming data with t_accplan temptable, and update acc-plan table with new records from xml file
Code:
run src/transfer/XmlReadDataset.p (FileName, OUTPUT DATASET-HANDLE hDSnew).

DO i = 1 TO hDSnew:NUM-BUFFERS:
  hBuffer = hDSnew:GET-BUFFER-HANDLE(i).

  tn = hBuffer:NAME.
  CREATE QUERY qBuf.
  qBuf:SET-BUFFERS(hBuffer).
  qBuf:QUERY-PREPARE("FOR EACH " + tn + " NO-LOCK").
  qBuf:QUERY-OPEN().
  qBuf:GET-FIRST().
  repeat:
    IF NOT hBuffer:AVAILABLE then LEAVE.

    if tn = "t_accplan" then
    do:
      buf2 = BUFFER acc-plan:handle.
      find first t_accplan where t_accplan.plan = hBuffer:BUFFER-FIELD("plan"):BUFFER-VALUE NO-ERROR.
      if not available t_accplan then
      do:
        create acc-plan.
        acc-plan.rid-ent = rid-ent.
        buf2:BUFFER-COPY(hBuffer,"rid-ent").
      end.
      else 
      do:
        buf3 = BUFFER t_accplan:handle.
        isEqual = buf3:BUFFER-COMPARE (hBuffer, "binary", "rid-ent").
        if not isEqual then 
        do:
          find first acc-plan where acc-plan.plan = hBuffer:BUFFER-FIELD("plan"):BUFFER-VALUE and acc-plan.rid-ent = rid-ent NO-ERROR.
          if available acc-plan then
            buf2:BUFFER-COPY(hBuffer, "rid-ent").
        end.
      end.
    end.
....

    qBuf:GET-NEXT().
  end.
  qBuf:QUERY-CLOSE().
  delete object qBuf.
end.
 
Top