Importar dados XML NFe

Discussão em 'Progress 4GL' iniciado por alx_amorim, Junho 28, 2010.

  1. alx_amorim

    alx_amorim Membro Participativo

    Fala galera, gostaria que alguem pudesse me ajudar, estou com um pouco de dificuldade em desenvolver o que preciso:

    Tenho o arquivo XML de uma NFE preciso pegar os campos de chave, numero de nota, enfim, e importar estes campos para uma tabela, o meu problema é como pegar estes campos do xml, alguem tem algo que possa me ajudar?

    Abraçao,
  2. elyson

    elyson Membro Participativo

    Boa Noite,

    Tenho uma rotina que importa os dados apartir de um XML:

    Vai lá:


    /*****************************************************************************
    Rotina para Importar XML
    *****************************************************************************/
    DEFINE VARIABLE hDoc AS HANDLE.
    DEFINE VARIABLE hRoot AS HANDLE.

    CREATE X-DOCUMENT hDoc.
    CREATE X-NODEREF hRoot.

    DEFINE VARIABLE hBuf AS HANDLE NO-UNDO.
    DEFINE VARIABLE nome AS CHARACTER NO-UNDO.
    DEFINE VARIABLE c-campo AS CHARACTER NO-UNDO.
    DEFINE VARIABLE c-arquivo AS CHARACTER NO-UNDO.
    DEFINE VARIABLE c-log AS CHARACTER NO-UNDO.

    DEFINE TEMP-TABLE customer NO-UNDO
    FIELD cust-num AS INT
    FIELD NAME AS CHAR.

    hDoc:LOAD("file","c:\temp\sw-example.xml",FALSE).
    hDoc:GET-DOCUMENT-ELEMENT(hRoot).

    RUN GetChildren(hRoot, 1).

    FOR EACH customer:
    DISPLAY customer.
    END.

    DELETE OBJECT hDoc.
    DELETE OBJECT hRoot.

    PROCEDURE GetChildren:
    DEFINE INPUT PARAMETER hParent AS HANDLE.
    DEFINE INPUT PARAMETER level AS INTEGER.

    DEFINE VARIABLE i-cont AS INTEGER.
    DEFINE VARIABLE hNoderef AS HANDLE.
    DEFINE VARIABLE hDBFld AS HANDLE.

    DEFINE VARIABLE good AS LOGICAL.

    DEFINE VARIABLE texto AS CHARACTER NO-UNDO.

    CREATE X-NODEREF hNoderef.

    REPEAT i-cont = 1 TO hParent:NUM-CHILDREN:
    good = hParent:GET-CHILD(hNoderef,i-cont).
    IF NOT good THEN LEAVE.

    IF hNoderef:NAME <> '#Text' THEN
    nome = hNoderef:NAME.

    IF hNoderef:NAME = 'customer' THEN DO:
    CREATE customer.
    hBuf = BUFFER customer:HANDLE.
    END.

    IF hNoderef:SUBTYPE = "text" AND hParent:NAME = nome THEN DO:
    texto = hNoderef:NODE-VALUE.

    ASSIGN c-campo = STRING(hBuf:BUFFER-FIELD(nome)) NO-ERROR.

    IF c-campo <> ? THEN DO:
    hDBFld = hBuf:BUFFER-FIELD(nome).
    hDBFld:BUFFER-VALUE = hNoderef:NODE-VALUE.
    END.
    END.
    RUN GetChildren(hNoderef, (level + 1)).
    END.
    DELETE OBJECT hNoderef.
    END PROCEDURE.
  3. alx_amorim

    alx_amorim Membro Participativo

  4. elyson

    elyson Membro Participativo

    Este é o arquivo a ser importado no formato XML.

    <?xml version="1.0"?>
    <customers>
    <customer>
    <cust-num>99</cust-num>
    <NAME>TESTE</NAME>
    </customer>
    </customers>
  5. elyson

    elyson Membro Participativo

    Esta rotina gra o XML a partir de uma tabela do banco de dados:

    DEFINE TEMP-TABLE customer NO-UNDO
    FIELD cust-num AS INT
    FIELD NAME AS CHAR.

    DEFINE VARIABLE hSAXWriter AS HANDLE.
    DEFINE VARIABLE lok AS LOGICAL.
    DEFINE VARIABLE hBuf AS HANDLE NO-UNDO.
    DEFINE VARIABLE hBufField AS HANDLE NO-UNDO.
    DEFINE VARIABLE iCont AS INTEGER NO-UNDO.

    CREATE customer.
    ASSIGN customer.cust-num = 99
    customer.NAME = "TESTE".

    CREATE SAX-WRITER hSAXWriter.
    hSAXWriter:FORMATTED = TRUE.
    lok = hSAXWriter:SET-OUTPUT-DESTINATION("file", "c:\unibanco\sw-example.xml").
    lok = hSAXWriter:START-DOCUMENT().
    lok = hSAXWriter:START-ELEMENT("customers").

    ASSIGN hBuf = BUFFER customer:HANDLE.

    FOR EACH customer:

    lok = hSAXWriter:START-ELEMENT("customer").

    DO iCont = 1 TO hBuf:NUM-FIELDS:
    ASSIGN hBufField = hBuf:BUFFER-FIELD(iCOnt).
    lok = hSAXWriter:WRITE-DATA-ELEMENT(hBufField:NAME, STRING(hBufField:BUFFER-VALUE)).
    END.

    /* lok = hSAXWriter:WRITE-DATA-ELEMENT("Address", Address).
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Address2", Address2).
    lok = hSAXWriter:WRITE-DATA-ELEMENT("City", City).
    lok = hSAXWriter:WRITE-DATA-ELEMENT("State", State).
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Postal-Code", Postal-Code).
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Country", Country).
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Phone", Phone).
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Contact", Contact).
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Sales-Rep", Sales-Rep).
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Credit-Limit", STRING(Credit-Limit)).
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Balance", STRING(Balance)).
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Terms", Terms).
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Discount", STRING(Discount)).
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Comments", Comments). */

    lok = hSAXWriter:END-ELEMENT("customer").
    END.

    lok = hSAXWriter:END-ELEMENT("customers").
    lok = hSAXWriter:END-DOCUMENT().
    DELETE OBJECT hSAXWriter.
  6. alx_amorim

    alx_amorim Membro Participativo

    Valeu galera pela ajuda, consegui resolver com estas informaçoes e mais outra que tem em um post no forum, se alguem quiser o programa me manda um email.

    Abraços,

Compartilhe esta Página