1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

Integração Datasul X E-millennium via API OData/REST

Discussão em 'EMS , HCM e Totvs 11' iniciado por Neivaldo, Janeiro 30, 2020.

  1. af.dums

    af.dums Membro Ativo

    Legal que deu certo, só uma sugestão, não sei se é um ambiente sandbox ou de produção já, mas pede para alterarem a sua senha, nas trocas de mensagens ela acabou sendo exibida.
    Abraços e qualquer coisa dá um toque, trabalho bastante com integrações.
    rohis curtiu isso.
  2. Neivaldo

    Neivaldo Membro Participativo

    Boa tarde Anderson,

    Muito obrigado pelo apoio, sem este não conseguiria ter avançado.

    Apenas uma ultima duvida (acredito que seja a ultima kkk) como faço para acessar os arrays internos? Verificando o arquivo, há mais de um nível de acesso, por exemplo, dentro do arrayCliente há o arrayEndereco_Entrega e neste mesmo nível tem o arrayEndereço. Estes arrray de endereços não estou conseguindo acessar, mas os de nível superior consigo.

    Desde já agradeço seu apoio.

    upload_2020-2-7_13-53-37.png

    upload_2020-2-7_13-54-12.png

    /*------------------------------------------------------------------------
    File : restConsumer.p
    Purpose :
    Syntax :
    Description : Exemplo de codigo para consumir WebServices Rest
    Author(s) : Zaraklin
    Created :
    Notes :
    ----------------------------------------------------------------------*/

    block-level on error undo, throw.

    /** Carrega bibliotecas necessarias **/
    using OpenEdge.Net.HTTP.IHttpClientLibrary.
    using OpenEdge.Net.HTTP.ConfigBuilder.
    using OpenEdge.Net.HTTP.ClientBuilder.
    using OpenEdge.Net.HTTP.Credentials.
    using OpenEdge.Net.HTTP.IHttpClient.
    using OpenEdge.Net.HTTP.IHttpRequest.
    using OpenEdge.Net.HTTP.RequestBuilder.
    using OpenEdge.Net.URI.
    using OpenEdge.Net.HTTP.IHttpResponse.

    using Progress.Json.ObjectModel.JsonObject.
    using Progress.Json.ObjectModel.JsonArray.

    def var oClient as IHttpClient no-undo.
    def var oUri as URI no-undo.
    def var oReq as IHttpRequest no-undo.
    def var oResp as IHttpResponse no-undo.
    def var oCreds as Credentials no-undo.

    def var oJsonRespObj as JsonObject no-undo.
    def var oJsonRespArray as JsonArray no-undo.
    def var oJsonObj_Notas as JsonObject no-undo.
    def var oJsonArray as JsonArray no-undo.

    def var oJsonObj_Produto AS CLASS JsonObject NO-UNDO.
    def var oJsonObj_Clientes AS CLASS JsonObject NO-UNDO.
    def var oJsonObj_Endereco_Entrega AS CLASS JsonObject NO-UNDO.
    def var oJsonObj_Lancamento AS CLASS JsonObject no-undo.



    define variable oJson as JsonObject no-undo.

    DEFINE VARIABLE oJsonArrayProdutos AS JsonArray NO-UNDO.
    DEFINE VARIABLE oJsonArrayClientes AS JsonArray NO-UNDO.
    DEFINE VARIABLE oJsonArrayEndereco_Entrega AS JsonArray NO-UNDO.
    DEFINE VARIABLE OJsonArrayLancamento AS jsonArray NO-UNDO.

    DEF VAR i_produtos AS INTEGER NO-UNDO.
    DEF VAR i_notas AS INTEGER NO-UNDO.
    def var i_cliente as integer no-undo.
    def var i_Endereco_Entrega as integer no-undo.
    DEF VAR I_Lancamento as integer no-undo.

    oClient = ClientBuilder:Build():Client.

    oCreds = new Credentials('aplicattion', 'integracao', '9yFTe1CF').

    oUri = new URI('http', '191.233.25.152', 6017).
    oUri:path = '/api/millenium_eco/pedido_venda/listafaturamentos?data_atualizacao=2020-01-01&vitrine=84&trans_id=3410&$format=json'.
    oReq = RequestBuilder:Get(oUri,oJson)
    :AcceptJson()
    :UsingBasicAuthentication(oCreds)
    :Request.

    oResp = oClient:Execute(oReq).

    DEF VAR c-caminho AS CHAR NO-UNDO.
    ASSIGN c-caminho = "c:\temp\".

    IF TYPE-OF(oResp:Entity, JsonObject) THEN DO:

    oJsonRespObj = CAST(oResp:Entity, JsonObject).
    CAST(oResp:Entity, JsonObject):WriteFile(c-caminho + 'Notas-Saida-E-Millennium.json', true).
    oJsonArray = oJsonRespObj:getJsonArray('value') NO-ERROR.

    IF oJsonArray = ? OR oJsonArray:LENGTH <= 0 THEN DO:
    MESSAGE "Arquivo: " + c-caminho + 'teste-neivaldo-objeto.json' + " está Vazio !!!"
    VIEW-AS ALERT-BOX INFO BUTTONS OK.
    END.
    ELSE DO:

    MESSAGE "Total de Notas encontradas no arquivo: " oJsonArray:LENGTH
    VIEW-AS ALERT-BOX INFO BUTTONS OK.

    /* Converte de Json para Registros na temp-table */

    Loop1:
    do i_notas = 1 to oJsonArray:length on error undo, next:

    oJsonObj_Notas = oJsonArray:GetJsonObject(i_notas).

    oJsonArrayClientes = oJsonObj_Notas:getJSONArray("cliente") NO-ERROR.

    oJsonArrayEndereco_Entrega = oJsonObj_Notas:getJSONArray("endereco_entrega") no-error.

    oJsonArrayProdutos = oJsonObj_Notas:getJSONArray("produtos") NO-ERROR.

    oJsonArrayLancamento = oJsonObj_Notas:getJSONArray("lancamentos") NO-ERROR.

    loop2:
    do i_cliente = 1 to oJsonArrayClientes:LENGTH ON ERROR UNDO, NEXT:
    oJsonObj_Clientes = oJsonArrayClientes:GetJsonObject(i_cliente).

    loop3:
    do i_Endereco_Entrega = 1 to oJsonArrayEndereco_Entrega:LENGTH ON ERROR UNDO, NEXT:
    oJsonObj_Endereco_Entrega = oJsonArrayEndereco_Entrega:GetJsonObject(i_Endereco_Entrega).

    Loop4:
    DO i_produtos = 1 TO oJsonArrayProdutos:LENGTH ON ERROR UNDO, NEXT:
    oJsonObj_Produto = oJsonArrayProdutos:GetJsonObject(i_produtos).

    Loop5:
    DO i_lancamento = 1 TO oJsonArrayLancamento:LENGTH ON ERROR UNDO, NEXT:


    oJsonObj_Lancamento = oJsonArrayLancamento:GetJsonObject(i_lancamento).


    MESSAGE "NUM NF: " oJsonObj_Notas:GetCharacter("nf") SKIP
    "TIPO NOTA: " oJsonObj_Notas:GetCharacter("tipo_operacao") SKIP
    "NUM ROMANEIO: " oJsonObj_Notas:GetCharacter("romaneio") SKIP
    "DATA: " oJsonObj_Notas:GetCharacter("data") SKIP
    SKIP(2)
    "CLiente" skip
    "--------" SKIP
    "Cod Cliente: " oJsonObj_Clientes:GetCharacter("cod_cliente") SKIP
    "Nome : " oJsonObj_Clientes:GetCharacter("nome") SKIP
    "rg : " oJsonObj_Clientes:GetCharacter("rg") SKIP
    SKIP(2)
    "ENDERECO ENTREGA" SKIP
    "--------" SKIP
    /* "Logradouro : " oJsonObj_Endereco_Entrega:GetCharacter("logradouro") SKIP */
    "PRODUTOS" SKIP
    "--------" SKIP
    "COD. PRODUTO : " oJsonObj_Produto:GetCharacter("cod_produto") SKIP
    "NCM : " oJsonObj_Produto:GetCharacter("ncm") SKIP
    "DESC. PRODUTO : " oJsonObj_Produto:GetCharacter("desc_produto") SKIP
    SKIP(2)
    "Lancamentos : " skip
    "Data_vencimento : " oJsonObj_Lancamento:GetCharacter("data_vencimento") skip
    "valor_inicial : " oJsonObj_Lancamento:GetDecimal("valor_inicial") skip
    "tipo_pgto : " oJsonObj_Lancamento:GetInt64("tipo_pgto") skip
    VIEW-AS ALERT-BOX INFO BUTTONS OK.


    END.

    end.
    end.
    end.
    end.
    END.
    END.
  3. af.dums

    af.dums Membro Ativo

    Opa, vamos lá...
    Neste caso é array dentro de array, criei um para o endereco_entrega dentro do cliente, para o endereco é só fazer o mesmo, dentro do cliente também, aparentemente só terá 1 endereço de entrega e 1 endereço, mas como é um array na estrutura do Json o correto é tratarmos como se fossem mandado mais endereços de cada tipo, fiz um teste aqui e deu certo

    Código:
    block-level on error undo, throw.
    
    using OpenEdge.Net.HTTP.ClientBuilder.
    using OpenEdge.Net.HTTP.Credentials.
    using OpenEdge.Net.HTTP.IHttpClient.
    using OpenEdge.Net.HTTP.IHttpRequest.
    using OpenEdge.Net.HTTP.RequestBuilder.
    using OpenEdge.Net.URI.
    using OpenEdge.Net.HTTP.IHttpResponse.
    using Progress.Json.ObjectModel.JsonObject.
    using Progress.Json.ObjectModel.JsonArray.
    
    
    
    /* ***************************  Main Block  *************************** */
    define variable oClient as IHttpClient no-undo.
    define variable oUri as URI no-undo.
    define variable oReq as IHttpRequest no-undo.
    define variable oResp as IHttpResponse no-undo.
    define variable oCreds as Credentials no-undo.
    define variable oJson as JsonObject no-undo.
    define variable oJsonArray as JsonArray no-undo.
    define variable oJsonObj as JsonObject no-undo.
    
    def var oJsonRespObj   as JsonObject         no-undo.       
    
    DEF VAR i AS INTEGER NO-UNDO.
    DEF VAR i2 AS INTEGER NO-UNDO.
    DEF VAR i3 AS INTEGER NO-UNDO.
    
    DEFINE VARIABLE oJsonArrayProdutos AS JsonArray NO-UNDO.
    DEFINE VARIABLE oJsonProduto AS CLASS JsonObject NO-UNDO.
    
    DEFINE VARIABLE oJsonArrayClientes AS JsonArray NO-UNDO.
    DEFINE VARIABLE oJsonCliente AS CLASS JsonObject NO-UNDO.
    
    DEFINE VARIABLE oJsonArrayEnderecosEntrega AS JsonArray NO-UNDO.
    DEFINE VARIABLE oJsonEnderecoEntrega AS CLASS JsonObject NO-UNDO.
    
    oClient = ClientBuilder:Build():Client.
    
    
    
    oCreds = new Credentials('aplicattion', 'integracao', '9yFTe1CF').
    
    oUri = new URI('http', '191.233.25.152', 6017).
    oUri:Path = '/api/millenium_eco/pedido_venda/listafaturamentos?data_atualizacao=2020-01-01&vitrine=84&trans_id=3410&$format=json'.
         oReq = RequestBuilder:Get(oUri,oJson)
                :AcceptJson()
                :UsingBasicAuthentication(oCreds)
                :Request.
    
    oResp = oClient:Execute(oReq).
    
    DEF VAR c-caminho AS CHAR NO-UNDO.
    ASSIGN c-caminho = "X:\milleniun-neivaldo\".
    
    IF TYPE-OF(oResp:Entity, JsonObject) THEN DO:
        MESSAGE "jsonObject"
            VIEW-AS ALERT-BOX INFO BUTTONS OK.
        oJsonRespObj = CAST(oResp:Entity, JsonObject).
    
        CAST(oResp:Entity, JsonObject):WriteFile(c-caminho + 'teste-neivaldo-objeto.json', true).
    
        oJsonArray = oJsonRespObj:getJsonArray('value') NO-ERROR.
       
        MESSAGE 'achou: ' oJsonArray <> ?
            VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
        IF oJsonArray = ? OR oJsonArray:LENGTH <= 0 THEN DO:
            MESSAGE "vaziooo"
                VIEW-AS ALERT-BOX INFO BUTTONS OK.
        END.
        ELSE DO:
    
            MESSAGE "Registros: " oJsonArray:LENGTH
            VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
            /* Converte de Json para Registros na temp-table */
            Loop1:
            do i=1 to oJsonArray:length on error undo, next:
                oJsonObj = oJsonArray:GetJsonObject(i).
    
                oJsonArrayClientes = oJsonObj:getJSONArray("cliente").
    
                LoopCliente:
                DO i2 = 1 TO oJsonArrayClientes:LENGTH ON ERROR UNDO, NEXT:
    
                    oJsonCliente = oJsonArrayClientes:GetJsonObject(i2).
    
                    MESSAGE "nome cliente: " string(oJsonCliente:GetCharacter("nome")) SKIP
                            "email cliente: " oJsonCliente:GetCharacter("e_mail") 
                    VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
    
                    oJsonArrayEnderecosEntrega = oJsonCliente:getJSONArray("endereco_entrega").
    
                    LoopEnderecoEntrega:
                    DO i3 = 1 TO oJsonArrayEnderecosEntrega:LENGTH ON ERROR UNDO, NEXT:
    
                        oJsonEnderecoEntrega = oJsonArrayEnderecosEntrega:GetJsonObject(i3).
    
                        MESSAGE "lagradouro endereco entrega: " string(oJsonEnderecoEntrega:GetCharacter("logradouro")) SKIP
                                "cidade endereco entrega: " oJsonEnderecoEntrega:GetCharacter("cidade") 
                        VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
                    END.
    
    
    
                END.
    
               
                oJsonArrayProdutos = oJsonObj:getJSONArray("produtos").
               
                LoopProdutos:
                DO i2 = 1 TO oJsonArrayProdutos:LENGTH ON ERROR UNDO, NEXT:
    
                    oJsonProduto = oJsonArrayProdutos:GetJsonObject(i2).
    
                    MESSAGE "produto: " string(oJsonProduto:GetInt64("produto")) SKIP
                        "sku: " oJsonProduto:GetCharacter("sku") 
                    VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
                END.
    
       
                MESSAGE "saida: " string(oJsonObj:GetInt64("saida")) SKIP
                        "tipo_operacao: " oJsonObj:GetCharacter("tipo_operacao") SKIP
                        "romaneio: " oJsonObj:GetCharacter("romaneio") SKIP
                        "nf: " oJsonObj:GetCharacter("nf") skip 
                        "cancelado:" oJsonObj:GetLogical("cancelado") skip
                        //"Produtos: " oJsonProdutos 
                    VIEW-AS ALERT-BOX INFO BUTTONS OK.
               
            end.
        END.
    
    
    END.
    
    
  4. Neivaldo

    Neivaldo Membro Participativo

    Anderson,

    Já montamos o arquivo aqui. ;)

    Muito obrigado pelo apoio.

    Abs.
    rohis e af.dums curtiram isso.
  5. rohis

    rohis Membro Ativo

    Prezados, boa tarde!
    Uma dúvida: os detalhes deste post também serviria para integrar o Datasul (ou outro sistema Progress) a outros sistemas que usam REST API? Muito interessante! Parabéns, vocês brilham!
  6. rohis

    rohis Membro Ativo

    Prezados, boa tarde!
    Uma dúvida: os detalhes deste post também serviria para integrar o Datasul (ou outro sistema Progress) a outros sistemas que usam REST API? Muito interessante! Parabéns, vocês brilham!

Compartilhe esta Página