1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
  2. Anuncie Aqui
    Anuncie aqui você Também: fdantas@4each.com.br

Rest API Datasul - Empresa em BDs mono-empresa

Discussão em 'EMS , HCM e Totvs 11' iniciado por rohis, Abril 27, 2023.

  1. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Tem um programa que faz a troca de empresa, mas tem que validar se o usuário tem acesso a empresa que vc está tentando trocar (sec\sec000aa.r).

    Vou verificar aqui e retorno.
  2. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Tenta enviar a empresa que vc deseja conectar e usa o código abaixo pra trocar de empresa, mas antes de trocar, verifica se você já está conectada
    nela antes, através das variáveis globais:

    Obs.: Código extraído do tópico https://www.4each.com.br/threads/rotina-trocar-empresa-datasul-12.26494/page-2#post-48136
    Código:
    {utp/ut-glob.i}
    {include/i-prgvrs.i CHAMADOR 1.00.00.000}
    {include/i_dbinst.i}
    {include/i_dbtype.i}
        DEFINE TEMP-TABLE ttErrosConexao NO-UNDO
        FIELD i-sequen AS INTEGER
        FIELD cd-erro  AS INTEGER
        FIELD mensagem AS CHARACTER FORMAT "x(255)".
        DEF NEW GLOBAL SHARED VAR v_cod_usuar_corren AS CHAR NO-UNDO.
        DEFINE VARIABLE i-ep-codigo-usuario   AS CHARACTER  NO-UNDO.
        DEF VAR novaEmpresa AS CHAR INIT "1".
       RUN getVariable IN hSPContexto(INPUT "i-ep-codigo-usuario", OUTPUT i-ep-codigo-usuario).
       MESSAGE i-ep-codigo-usuario SKIP v_cod_usuar_corren
           VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
       find first fnd_usuar_univ exclusive-lock
             where fnd_usuar_univ.cod_usuario = v_cod_usuar_corren
                   no-error.
        if not avail fnd_usuar_univ then do:
            create fnd_usuar_univ.
            assign fnd_usuar_univ.cod_usuario = v_cod_usuar_corren.
        end.
        assign fnd_usuar_univ.cod_empresa = novaEmpresa
               fnd_usuar_univ.cod_livre_1 = i-ep-codigo-usuario.
        RUN utp/ut-memoryclear.p.
       
        EMPTY TEMP-TABLE ttErrosConexao.
        run piEmpresa  in hSPContexto.
        run getTTErros in HSPContexto (output table ttErrosConexao).
        if can-find(first ttErrosConexao) then do:
            message substitute('Erro conexÆo empresa &1', novaEmpresa)
                view-as alert-box info buttons ok.
            return 'NOK'.
        end.
        //ELSE RUN fwk\utils\diProgress.r.
    
    
    rohis curtiu isso.
  3. rohis

    rohis Membro Ativo

    Entendo. Ocorre que acredito ser necessário informar a empresa. Não posso correr o risco de fazer pesquisa apenas na última empresa, entende? Tenho umas 10 empresas aqui. E se sempre requisitar na empresa 3 porque foi a última conectada e não requisitar na 10? Como vou 'forçar' logar e pesquisar na empresa 10 via AppServer?
    Eu preciso garantir que irá logar na empresa correta via AppServer.
    Eu pensei em algumas soluções:
    1.1 Pesquisar o título baixado no APB (EMS 5) - assim garanto a empresa conectada por último
    1.2 Pesquisar o documento fiscal deste titulo, neste caso a pesquisa irá considerar as tabelas da empresa conectada.
    Eu quero dados apenas da doc-fiscal e it-doc-fisc. Ir no EMS 5 para depois no EMS 2 pode afetar a performance de execução.

    Outra solução seria este post:
    CRATE Server - link : https://www.4each.com.br/threads/trabalhando-com-appserver.26876/page-2

    Vocês já fizeram isto? O que acham?
    Pensando bem... pesquisar no EMS 5 não vai funcionar rs
  4. rohis

    rohis Membro Ativo

    Olá! Descobri a solução. Para executar o AppServer de determinada empresa e trabalhar com as tabelas do EMS2 - (mono-empresa) e a premissa que é datasul-rest.

    Verificar a documentação:
    https://tdn.totvs.com/display/public/LDT/Desenvolvimento de APIs para o produto Datasul informa:
    Especialmente Tópico: Acesso a Diferentes Empresas

    'A partir do momento que se sabe qual empresa se deseja enviar na requisição e que a mesma está associada ao usuário, é possível fazer a chamada da API que desejar, passando o código como parâmetro dentro do atributo companyId, esse especificado dentro do Header.'

    1) Executei a API do produto padrão: http://<server>.com:<porta>/api/btb/v1/companies
    2) Identifiquei a empresa a partir do campo companyId. Exemplo companyId = 910

    3) Na chamada da API específica, Headers eu informei companyId = 910
    Exemplo: http://<server>.com:<porta>/api/esg/v1/ProcurementSpend
    upload_2023-4-28_18-23-7.png

    Ou seja, a empresa é tratada automaticamente pelo serviço datasul-rest via Header da requisição. Não é necessário codificar mais nada via via específico Progress ABL.
    Fiz um teste com as empresas e no log do AppServer da respectiva empresa aparece a consulta
    Para confirmar, eu também utilizei a variável global i-ep-codigo-usuario dentro do específico. Coloquei uma mensagem. A mágica aconteceu!
    upload_2023-4-28_18-39-33.png
    Melhor do que imaginávamos. Não é necessário fazer um troca empresa :)

    Ainda assim agradeço o apoio de todos!

    Arquivos Anexados:

    v.marinh e rafael.andrade curtiram isso.
  5. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Excelente, obrigado pela contribuição
    rohis curtiu isso.

Compartilhe esta Página