[RESOLVIDO] Codigo do emitente na criacao via cdapi366b

Discussão em 'EMS , HCM e Totvs 11' iniciado por reissobr, Junho 9, 2016.

Status do Tópico:
Não esta aberto para novas mensagens.
  1. reissobr

    reissobr Membro Ativo

    Bom dia Pessoal.

    Estou fazendo um customizado para a criação de emitente via customizado.

    A API nao gera código novo para o emitente quando é inclusão.
    Entao para gerar o codigo do emitente a ser incluido, coloquei um FIND LAST no programa, para ler o ultimo código de emitente e somei 1.
    Mas preciso ter um lock na tabela emitente, para garantir que entre criar o novo código do emitente e finalizar a gravação via API, um outro usuário concorrente não crie o mesmo código.
    E estou com duvida como colocar tanto o comando para o LOCK como para liberar o LOCK depois da efetivação da API.

    Segue abaixo parte do código desenvolvido.

    Att;

    Código:
    {cdp/cdcfgint.i}
    {qg/cdapi366b.i}   
    
    DEF VAR  h-cdapi366b          AS HANDLE NO-UNDO.
    
    DEF VAR  i-codigo-emitente    AS INTEGER  NO-UNDO.
    
    RUN   cdp/cdapi366b.p  PERSISTENT SET  h-cdapi366b.
    
    FIND LAST emitente USE-INDEX codigo NO-LOCK.
    
    ASSIGN i-codigo-emitente = emitente.cod-emitente + 1.
    
    CREATE tt_emitente_integr_new.
    
    ASSIGN tt_emitente_integr_new.Cod_emitente   = i-codigo-emitente
           tt_emitente_integr_new.Num_tip_operac = 1.                /*  Tipo de Operação a ser realizada:    */
                                                                     /*      1 - Inclusão/Modificação,        */
                                                                     /*      2 - Eliminação.                  */
    
    /*--  Executa Gravacao do Emitente  --*/
    
    RUN execute_evoluida_7 IN h-cdapi366b (INPUT TABLE         tt_emitente_integr_new,
                                           INPUT TABLE         tt_cont_emit_integr_new,
                                           INPUT-OUTPUT TABLE  tt_retorno_clien_fornec,
                                           INPUT               i-ep-codigo-empresa,
                                           INPUT-OUTPUT        c-arquivo-saida,
                                           INPUT TABLE         tt_cta_emitente).
    
    DELETE PROCEDURE h-cdapi366b.
    
    RETURN "OK":U.
  2. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Meu caro, usa sequence do banco de dados, se codigo já existe, pega de novo até ter um numero valido, assim vc garante que não haverá problemas e não precisa de lock
    reissobr curtiu isso.
  3. reissobr

    reissobr Membro Ativo

    Pessoal,
    Até onde entendo, preciso utilizar a mesma sequence do produto padrão para o controle do código do emitente, correto ?

    Mas não consegui localizar a sequence para o código do emitente.

    Alguém tem alguma dica ?

    Att;
  4. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    eu também procurei e não achei, acredito que seja o ultimo mais 1
  5. reissobr

    reissobr Membro Ativo

    Pessoal, somente compartilhando, abri chamado na consultoria sobre a criação do código para o emitente e a resposta foi utilizar o comando abaixo:

    run cdp/cd9960.p (output i-emitente).

    Ele devolve o numero do novo emitente, para ser utilizado na API para gravação.
    O suporte só nao esclareceu como o sistema controla este código.
    Att;
  6. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    ultimo mais um com certeza, o seu problema de duplicar codigo se rodar a rotina em 2 sessões vai continuar
Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página