/********************************************************/ /* table_to_xml.p */ /* written by: Mario Paranhos mxp@bravepoint.com */ /* written on: 7/2/01 */ /* last updated: 8/16/01 - Mario Paranhos */ DEFINE INPUT PARAMETER TABLE-HANDLE hInpTbl. DEFINE INPUT PARAMETER cOutFile AS CHARACTER. DEFINE VARIABLE hDoc AS HANDLE NO-UNDO. DEFINE VARIABLE hRoot AS HANDLE NO-UNDO. DEFINE VARIABLE hRow AS HANDLE NO-UNDO. DEFINE VARIABLE hField AS HANDLE NO-UNDO. DEFINE VARIABLE hText AS HANDLE NO-UNDO. DEFINE VARIABLE hBuf AS HANDLE NO-UNDO. DEFINE VARIABLE hDBFld AS HANDLE NO-UNDO. DEFINE VARIABLE hq AS HANDLE NO-UNDO. DEFINE VARIABLE i AS INTEGER NO-UNDO. /** XML Preparation **/ CREATE X-DOCUMENT hDoc. CREATE X-NODEREF hRoot. CREATE X-NODEREF hRow. CREATE X-NODEREF hField. CREATE X-NODEREF hText. /** Get a buffer handle from the input table handle **/ ASSIGN hBuf = hInpTbl:DEFAULT-BUFFER-HANDLE. CREATE QUERY hq. /** Set query to the buffer we just created **/ if not hq:set-buffers(hBuf) then do: message "Set buff failed " view-as alert-box. leave. end. /** Create the query predicate **/ if not (hq:query-prepare("for each " + hBuf:name )) then do: message "query prepare failed " view-as alert-box. leave. end. /** Open the query **/ if not hq:query-open() then do: message "query open failed " view-as alert-box. leave. end. /** Create the main node of the XML **/ hDoc:CREATE-NODE(hRoot, hBuf:name, "Element"). hDoc:APPEND-CHILD(hRoot). repeatLoop: REPEAT: /** Get next record from query **/ hq:GET-NEXT(). IF hq:QUERY-OFF-END THEN LEAVE repeatLoop. /** Create parent node in XML **/ hDoc:CREATE-NODE(hRow,"Customer", "Element"). hRoot:APPEND-CHILD(hRow). REPEAT i = 1 TO hBuf:NUM-FIELDS: hDBFld = hBuf:BUFFER-FIELD(i). hDoc:CREATE-NODE(hField, hDBFld:NAME, "Element"). hRow:APPEND-CHILD(hField). hDoc:CREATE-NODE (hText, "", "TEXT"). hField:APPEND-CHILD (hText). /* Take the string of the BUFFER-VALUE instead of the STRING-VALUE */ /* because STRING-VALUE uses DB format which my loose characters. */ hText:NODE-VALUE = STRING(hDBFld:BUFFER-VALUE). END. /** REPEAT i = 1 TO hBuf:NUM-FIELDS: **/ END. /** repeatLoop: **/ hq:QUERY-CLOSE(). DELETE OBJECT hq. hDoc:SAVE("file", cOutFile). DELETE OBJECT hDBFld. DELETE OBJECT hRoot. DELETE OBJECT hRow. DELETE OBJECT hField. DELETE OBJECT hText. DELETE OBJECT hDoc. /* Delete nodes before doc to avoid memory issues */ /* Set all handles to ? to avoid memory issues and handle reuse */ ASSIGN hq = ? hDBFld = ? hRoot = ? hRow = ? hField = ? hText = ? hDoc = ?. /********************************************************/