Rotina itens faturados

Discussão em 'Progress 4GL' iniciado por turks, Janeiro 28, 2010.

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

    turks Membro Participativo

    Galera, estou com o seguinte problema:

    - Preciso de uma rotina que me mostre os itens que foram faturados de varios clientes, porem apenas de um estabelecimento, e uma unica serie de NF.
    fiz a seguinte rotina, mais dá erro na execução:

    Será que alguem pode me ajudar?

    Código:
    DEFINE STREAM saida.   
    OUTPUT STREAM saida TO c:\Rotina-comercialok.txt.  
    
    FOR EACH it-nota-fisc NO-LOCK:
        FIND FIRST nota-fiscal NO-LOCK WHERE nota-fiscal.nr-nota-fis = it-nota-fisc.nr-nota-fis
                                         AND nota-fiscal.cod-estabel = "101"
                                         AND nota-fiscal.serie = "1" 
                                         AND nota-fiscal.cod-emitente = 50050 
                                          OR nota-fiscal.cod-emitente = 50075 NO-ERROR.
    
        PUT STREAM saida
            it-nota-fisc.it-codigo       ";"
            it-nota-fisc.qt-faturada[1]  ";"
            it-nota-fisc.nr-nota-fis     ";"
            it-nota-fisc.dt-emis-nota    ";"
            it-nota-fisc.vl-preuni       ";"
            nota-fiscal.cod-estabel      ";"
            nota-fiscal.serie            ";"
            nota-fiscal.cod-emitente SKIP.
    
    END.
    Quando eu faço isso sai todos os itens que foram faturados e apenas com o codigo dos clientes que eu coloquei no WHERE.
  2. dudabrito

    dudabrito Membro Participativo

    Amigo, boa tarde, vê se é válida a minha ajuda.

    Código:
    DEFINE STREAM saida.   
        OUTPUT STREAM saida TO c:\temp\Rotina-comercialok.txt. /* verifique se vc tem acesso pra gravar no local onde indica */
    
        FOR EACH it-nota-fisc NO-LOCK:
            FIND FIRST nota-fiscal NO-LOCK WHERE nota-fiscal.nr-nota-fis = it-nota-fisc.nr-nota-fis
                                             AND nota-fiscal.cod-estabel = "101"
                                             AND nota-fiscal.serie = "1"
                                             AND nota-fiscal.cod-emitente = 50050
                                              OR nota-fiscal.cod-emitente = 50075 NO-ERROR.
    
            IF AVAIL nota-fiscal THEN DO: /* valide se o FIND é válido */
    
                PUT STREAM saida
                    it-nota-fisc.it-codigo       ";"
                    it-nota-fisc.qt-faturada[1]  ";"
                    it-nota-fisc.nr-nota-fis     ";"
                    it-nota-fisc.dt-emis-nota    ";"
                    it-nota-fisc.vl-preuni       ";"
                    nota-fiscal.cod-estabel      ";"
                    nota-fiscal.serie            ";"
                    nota-fiscal.cod-emitente SKIP.
    
            END.
    
        END.
        OUTPUT CLOSE. /* feche output */
    Abraços.
  3. jonas

    jonas Membro Participativo

    Se a quantidade de registros do for each for grande, você pode filtrar somente os campos que você precisa para a consulta:

    Exemplo:

    Código atual:
    Código:
     FIND FIRST nota-fiscal NO-LOCK WHERE nota-fiscal.nr-nota-fis = it-nota-fisc.nr-nota-fis
                                             AND nota-fiscal.cod-estabel = "101"
                                             AND nota-fiscal.serie = "1"
                                             AND nota-fiscal.cod-emitente = 50050
                                              OR nota-fiscal.cod-emitente = 50075 NO-ERROR.
    
    Código sugerido:
    Código:
     for FIRST nota-fiscal fields (nr-nota-fis cod-estabel serie cod-emitente) WHERE nota-fiscal.nr-nota-fis = it-nota-fisc.nr-nota-fis
                                             AND nota-fiscal.cod-estabel = "101"
                                             AND nota-fiscal.serie = "1"
                                             AND nota-fiscal.cod-emitente = 50050
                                              OR nota-fiscal.cod-emitente = 50075 NO-LOCK.
    
    
    O ganho de performance é considerável.
  4. petruzad

    petruzad Membro Participativo

    O exemplo abaixo utiliza o relacionamento da tabela ( pai x filho). O acesso fica mais rapido e evita o uso do FIND.
    Código:
    /**/
    DEFINE STREAM saida.   
    OUTPUT STREAM saida TO c:\Rotina-comercialok.txt.  
    FOR EACH nota-fiscal WHERE nota-fiscal.cod-estabel = "101" 
                           AND nota-fiscal.serie = "1"         
                       NO-LOCK,
            EACH it-nota-fisc OF nota-fiscal 
                         NO-LOCK:
        PUT STREAM saida                    
            it-nota-fisc.it-codigo       ";"
            it-nota-fisc.qt-faturada[1]  ";"
            it-nota-fisc.nr-nota-fis     ";"
            it-nota-fisc.dt-emis-nota    ";"
            it-nota-fisc.vl-preuni       ";"
            nota-fiscal.cod-estabel      ";"
            nota-fiscal.serie            ";"
            nota-fiscal.cod-emitente     ";"
          SKIP.  
    
    END.
    OUTPUT STREAM saida CLOSE.
    /**/
    
  5. turks

    turks Membro Participativo

    Olá galera, obrigado pelo retorno, então, no caso fiz os 3 testes pra ver se funcionavam a apenas o ultimo deu certo, que é esse código:

    Código:
        /**/
        DEFINE STREAM saida.   
        OUTPUT STREAM saida TO c:\Rotina-comercialok.txt. 
        FOR EACH nota-fiscal WHERE nota-fiscal.cod-estabel = "101"
                               AND nota-fiscal.serie = "1"         
                           NO-LOCK,
                EACH it-nota-fisc OF nota-fiscal
                             NO-LOCK:
            PUT STREAM saida                   
                it-nota-fisc.it-codigo       ";"
                it-nota-fisc.qt-faturada[1]  ";"
                it-nota-fisc.nr-nota-fis     ";"
                it-nota-fisc.dt-emis-nota    ";"
                it-nota-fisc.vl-preuni       ";"
                nota-fiscal.cod-estabel      ";"
                nota-fiscal.serie            ";"
                nota-fiscal.cod-emitente     ";"
              SKIP. 
    
        END.
        OUTPUT STREAM saida CLOSE.
        /**/
    
    Mais mesmo assim obrigado a todos pelo retorno....
    Os outros 2 também, estavam saindo a listagem, mais não estavam filtrando por Cliente.
    Estava saindo todos os cliente e mostrando apenas um código de cliente....
Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página