[RESOLVIDO] Salvar Campo de outra Tabela em View (Smart)

Discussão em 'EMS , HCM e Totvs 11' iniciado por erickles, Setembro 10, 2009.

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

    erickles Membro Participativo

    Olá pessoal,

    Tenho uma view que contem os campos de uma determinada tabela, porém, foi preciso adicionar campos fill-in nessa view para que apartir dessas fill-in´s, sejam salvos os dados dessas fill-in´s em outra tabela. Alguém sabe como eu poderia fazer isso?
  2. Cobra.cne

    Cobra.cne Equipe de Suporte Moderador

    Na procedure "local-assign-record", após a execução do "RUN dispatch IN THIS-PROCEDURE ( INPUT 'assign-record':U ) .", pois após este ter sido executado com sucesso você pode gravar os registros em outra tabela com garantia.

    Dai o processo é manual, tipo :
    Código:
    create tabela.
    assign tabela.campo1 = fill-in1:screen-value in frame {&frame-name}
              tabela.campo2 = fill-in2:screen-value in frame {&frame-name}.
    
    Considerando que vc esta utilizando DDKGUI.

    Qualquer coisa avisa.
  3. erickles

    erickles Membro Participativo

    Cara, fiz bem isso, na "local-assign-record"...
    Código:
    /*------------------------------------------------------------------------------
      Purpose:     Override standard ADM method
      Notes:       
    ------------------------------------------------------------------------------*/
    
        /* Code placed here will execute PRIOR to standard behavior. */
    /*     {include/i-valid.i}  */
         RUN pi-validate.  
    
        if  not frame {&frame-name}:validate() then
          return 'ADM-ERROR':U.
        
        /*:T Ponha na pi-validate todas as validações */
        /*:T Não gravar nada no registro antes do dispatch do assign-record e 
           nem na PI-validate. */
        
        /* Dispatch standard ADM method.                             */
        RUN dispatch IN THIS-PROCEDURE ( INPUT 'assign-record':U ) .
        if RETURN-VALUE = 'ADM-ERROR':U then 
            return 'ADM-ERROR':U.
        
        /*:T Todos os assign´s não feitos pelo assign-record devem ser feitos aqui */  
        /* Code placed here will execute AFTER standard behavior.    */
    
        
        FIND FIRST docum-est
             WHERE docum-est.cod-emitente = INT(es-docum-est.cod-emitente:SCREEN-VALUE)
             AND   docum-est.serie        = es-docum-est.serie:SCREEN-VALUE
             AND   docum-est.nro-docto    = es-docum-est.nro-docto:SCREEN-VALUE
             AND   docum-est.nat-operacao = es-docum-est.nat-operacao:SCREEN-VALUE NO-LOCK NO-ERROR.
    
        IF AVAIL docum-est  THEN
        DO:
            FOR EACH item-doc-est OF docum-est NO-LOCK:
                FIND FIRST es-it-docum-est
                    WHERE es-it-docum-est.cod-emitente = item-doc-est.cod-emitente
                    AND   es-it-docum-est.serie-docto  = item-doc-est.serie-docto   
                    AND   es-it-docum-est.nro-docto    = INT(item-doc-est.nro-docto)
                    AND   es-it-docum-est.nat-operacao = item-doc-est.nat-operacao  
                    AND   es-it-docum-est.sequencia    = item-doc-est.sequencia 
                    AND   es-it-docum-est.it-codigo    = item-doc-est.it-codigo      NO-LOCK NO-ERROR.
                IF NOT AVAIL es-it-docum-est THEN DO:
                    CREATE es-it-docum-est.
                    ASSIGN es-it-docum-est.cod-emitente = item-doc-est.cod-emitente
                           es-it-docum-est.serie-docto  = item-doc-est.serie-docto
                           es-it-docum-est.nro-docto    = INT(item-doc-est.nro-docto)
                           es-it-docum-est.nat-operacao = item-doc-est.nat-operacao
                           es-it-docum-est.sequencia    = item-doc-est.sequencia 
                           es-it-docum-est.it-codigo    = item-doc-est.it-codigo
                           es-it-docum-est.quantidade   = item-doc-est.quantidade
                           es-it-docum-est.lote         = item-doc-est.lote
                           es-it-docum-est.cod-medida   = 0. 
                END.
            END.
            
            /*SD 2284/09 - Erick - Mudar Transportadora*/
            /*O que quero fazer é isto...*/
            FIND LAST devol-cli WHERE devol-cli.cod-estabel    = docum-est.cod-estabel 
                                    AND devol-cli.cod-emitente = docum-est.cod-emitente
                                    AND devol-cli.nat-operacao = docum-est.nat-oper
                                    AND devol-cli.serie-docto  = docum-est.serie-docto
                                    AND devol-cli.nro-docto    = docum-est.nro-docto 
                                    NO-LOCK NO-ERROR.
        
              IF AVAIL devol-cli THEN DO:
               
                  FIND FIRST nota-fiscal WHERE nota-fiscal.cod-estabel = devol-cli.cod-estabel
                                           and nota-fiscal.nr-nota-fis = devol-cli.nr-nota-fis
                                           AND nota-fiscal.serie       = devol-cli.serie 
                                           NO-LOCK NO-ERROR.
    
                  IF AVAIL nota-fiscal THEN do:                    
                      FIND FIRST transporte WHERE transporte.cod-transp = inte(fi-cod-transp:screen-value) 
                      NO-LOCK NO-ERROR.
                      
                      /*Quero gravar este campo...*/
                      if avail transporte then assign nota-fiscal.nome-transp = transporte.nome.
    
                  end.                                               
              end.
              /*SD 2284/09...*/
        END.                            
    
    END PROCEDURE.
    Será que fiz algo de errado?
  4. Cobra.cne

    Cobra.cne Equipe de Suporte Moderador

    Se você precisa desta lógica, este é o local.

    Só um detalhe, você esta buscando a nota-fiscal com NO-LOCK, na hora que for dar um assign irá apresentar erro.

    Não sei em que momento que você vai estar fazendo esta alteração em uma viewer, porém caso trabalhe com Nota Fiscal eletrônica, tome cuidado ao alterar os campos da nota que já foram enviados para a SEFAZ.
    Também não é recomendado efetuar ASSIGN direto nas tabelas Datasul sem API, se for detectado em algum problema, podem querer cobrar consultoria por ter específicos efetuando gravação direto na base.

    Pense na possibilidade de efetuar esta alteração em alguma BO de Cálculo da Nota Fiscal.

    Espero ter ajudado.
  5. erickles

    erickles Membro Participativo

    Bem, deu certo oque eu queria fazer, mas é verdade, não posso alterar nada na nota-fiscal, vou usar uma tabela especifica.

    Obrigado pela ajuda.
Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página