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

RECURSIVIDADE

Discussão em 'Progress 4GL' iniciado por decio, Maio 28, 2010.

  1. decio

    decio Sem Pontuação

    Boa tarde Pessoal,

    Sou iniciante em PROGRESS, porem, preciso aprender o mais rapido possível uauhaha

    Seguinte:

    Estou tentando fazer um relatório, que, ao buscar o item na tabela estrutura, verifico quais são os componentes deste item, e caso algum COMPONENTE deste item tem outro componente, preciso buscar e inserir no relatório.

    Quem puder me ajudar... por favor!!!

    Abraços....
  2. mcarril

    mcarril Membro Participativo

    Estude o comando FIND ou CAN-FIND junto com IF AVAIL , IF NOT AVAIL e FOR EACH

    Quando você quer buscar um item de uma tabela é o comando find. Se for mais que um ítem é o comando for each.

    Se a chave das tabelas são iguais usamos o "find tabela of" , caso contrário utilizamos a cláusula "where".

    ABraços
  3. jalegria

    jalegria Membro Participativo

    Saudações
    Não sei se entendi bem o q vc quer
    Mas ve se isso ajuda...

    Monta 2 programas + ou - assim:

    Código:
    Programa 1:
    
    for each estrutura no-lock:
      /*Comandos para exibir alguma informação da tabela estrutura no relatorio*/
    
      for each componente of estrutura no-lock:
        run programa2(recid(componente)).
      end.
    end.
    
    Código:
    Programa 2:
    
    def input param id as recid.
    def buffer bf-componente for componente.
    
    find componente where recid(componente) = id no-lock no-error.
    if not avail componente then return.
    
    /*Comandos para exibir alguma informação da tabela componente no relatorio*/
    
    for each bf-componente of componente no-lock:
      run programa2(recid(bf-componente)).
    end.
    
  4. decio

    decio Sem Pontuação

    e aeee galera!!

    desculpe pela demora de responder... mais consegui fazer!!

    obrigado pela ajuda!!!

    segue codigo..

    Código:
    DEF VAR dec-cod-compon LIKE estrutura.cod-lista-compon.
    DEF VAR codigo LIKE estrutura.it-codigo.
    DEF buffer b-estrutura FOR estrutura. /*faz uma "cópia" da tabela estrutura */
    DEF STREAM saida.
    
    OUTPUT STREAM saida TO "C:\Documents and Settings\brjpt\Desktop\Decio\27.05.2010.txt" NO-CONVERT.
    
    PUT STREAM saida "RELATÓRIO DE COMPONENTES POR PRODUTOS" SKIP
                     "----------------------------------------------------------------" SKIP(4).
    
    FOR EACH estrutura
         NO-LOCK    
        BREAK BY estrutura.it-codigo: 
        
        
    
       
        IF FIRST-OF (estrutura.it-codigo) THEN
        DO:
        
        FIND item WHERE item.it-codigo = estrutura.it-codigo NO-LOCK.
        
        PUT STREAM saida SKIP(3) "Cod: " estrutura.it-codigo SPACE(3)
                          "Produto: " item.descricao-1 SPACE(5)SKIP
                          "-------------------------------------------------------------" 
                          SKIP SPACE(5)
                          "Seq" SPACE(4) "Componente" SPACE(5) "Descricao" SPACE(4) SKIP
                          "-------------------------------------------------------------"
                          SKIP.
        END.
        
    
    
        FIND item WHERE item.it-codigo = estrutura.es-codigo NO-LOCK.
        
        
       
        PUT STREAM saida SPACE(3) estrutura.sequencia SPACE(5)
                                  estrutura.es-codigo SPACE(1)
                                  item.descricao-1 SKIP. 
                                  
        ASSIGN dec-cod-compon = estrutura.es-codigo.
        
     
        RUN pi-componente(INPUT dec-cod-compon). 
        
    
    
    END. 
    
    
    PROCEDURE pi-componente:
    DEFINE INPUT PARAMETER codcomp LIKE dec-cod-compon.
    
    
    
        FOR EACH b-estrutura
            WHERE b-estrutura.it-codigo = codcomp
            NO-LOCK:
            
          
                         
               FIND item WHERE item.it-codigo = b-estrutura.es-codigo. 
            
               PUT STREAM saida SPACE(12) b-estrutura.sequencia SPACE(3)
                                          b-estrutura.es-codigo SPACE(1)
                                          item.descricao-1 SKIP
                                SPACE(12) "---------------------------------------------------" SKIP. 
                                
                RUN pi-componente(INPUT b-estrutura.es-codigo).                             
                          
        END. 
      
    END PROCEDURE.
    
    OUTPUT STREAM saida CLOSE.
    
    
  5. mcarril

    mcarril Membro Participativo

    Oi Décio, Tudo bem ?

    Você esta utilizando o comando FIND sem a instrução NO-ERROR.

    Se a procura falhar vai dar erro.

    Normalmente utilizamos assim:

    Código:
    /* PROGRAMA DO DÉCIO IMPLEMENTADO COM NO-ERROR *************/
    
    DEF VAR dec-cod-compon LIKE estrutura.cod-lista-compon.
    DEF VAR codigo LIKE estrutura.it-codigo.
    DEF buffer b-estrutura FOR estrutura. /*faz uma "cópia" da tabela estrutura */
    DEF STREAM saida.
    
    OUTPUT STREAM saida TO "C:\Documents and Settings\brjpt\Desktop\Decio\27.05.2010.txt" 
    NO-CONVERT.
    
    PUT STREAM saida "RELATÓRIO DE COMPONENTES POR PRODUTOS" SKIP
                     "----------------------------------------------------------------" SKIP(4).
    
    FOR EACH estrutura
         NO-LOCK    
        BREAK BY estrutura.it-codigo: 
          
        IF FIRST-OF (estrutura.it-codigo) THEN
        DO:
        
           FIND item WHERE item.it-codigo = estrutura.it-codigo NO-LOCK NO-ERROR.
     
           IF AVAIL item THEN DO: 
              PUT STREAM saida SKIP(3) "Cod: " estrutura.it-codigo SPACE(3)
                          "Produto: " item.descricao-1 SPACE(5)SKIP
                          "-------------------------------------------------------------" 
                          SKIP SPACE(5)
                          "Seq" SPACE(4) "Componente" SPACE(5) "Descricao" SPACE(4) SKIP
                          "-------------------------------------------------------------"
                          SKIP.
    
           END. /* if avail */
           ELSE DO:
    
                /* aqui você pode colocar uma mensagem de que não encontrou a tabela - por exemplo */
                MESSAGE "Tabela Item não encontrada" VIEW-AS ALERT-BOX.
    
            END.
    
        END. /* first of */
        
        FIND item WHERE item.it-codigo = estrutura.es-codigo NO-LOCK NO-ERROR.
        
        IF AVAIL item THEN DO: 
           PUT STREAM saida SPACE(3) estrutura.sequencia SPACE(5)
                                  estrutura.es-codigo SPACE(1)
                                  item.descricao-1 SKIP.             
           ASSIGN dec-cod-compon = estrutura.es-codigo.
           RUN pi-componente(INPUT dec-cod-compon). 
        END. /* IF AVAIL */
    
    END. /* FOR EACH */ 
    
    PROCEDURE pi-componente:
    DEFINE INPUT PARAMETER codcomp LIKE dec-cod-compon.
    
    FOR EACH b-estrutura
            WHERE b-estrutura.it-codigo = codcomp
            NO-LOCK:
     
       FIND item WHERE item.it-codigo = b-estrutura.es-codigo NO-LOCK NO-ERROR. 
            
       IF AVAIL item THEN DO:
    
               PUT STREAM saida SPACE(12) b-estrutura.sequencia SPACE(3)
                                          b-estrutura.es-codigo SPACE(1)
                                          item.descricao-1 SKIP
                                SPACE(12) "---------------------------------------------------" SKIP. 
                                
                RUN pi-componente(INPUT b-estrutura.es-codigo).                             
       END.                      
    END. 
      
    END PROCEDURE.
    
    OUTPUT STREAM saida CLOSE.
    Espero ter ajudado.

    Abraços
  6. decio

    decio Sem Pontuação

    Realmente Marly...

    não tinha me atentado!!

    Muito obrigado...

Compartilhe esta Página