[RESOLVIDO] Duvidas ao montar um for each

Discussão em 'EMS , HCM e Totvs 11' iniciado por jsinobilino, Abril 7, 2011.

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

    jsinobilino Sem Pontuação

    Bom dia.

    Estou montando um relatório para o módulo de recebimento, este realatório busca informações de varias tabelas, gostaria de saber como faço para buscar as informações de varias tabelas? Eu já sei os campos que são chaves estrangeira de cada tabela. Veja o que eu fiz


    FOR EACH it-requisicao,
    EACH recebimento,
    EACH sub-conta
    WHERE it-requisicao.numero-ordem = recebimento.numero-ordem AND it-requisicao.sc-codigo = sub-conta.sc-codigo.
    DISP recebimento.dat-trans
    it-requisicao.ct-codigo
    it-requisicao.sc-codigo
    recebimento.numero-nota
    recebimento.cod-emitente
    recebimento.valor-total.



    END.


    Até aqui roda beleza, mas quando eu tento buscar informação em mais uma tabela ele entre em um loop. Exemplo:

    Já fiz três pesquisas nas tabelas it-requisicao, recebimento e sub-conta. Agora preciso buscar informação da tabela fornecedores para isso eu usaria:
    recebimento.cod-emitente = fornecedores.cod-emitente. Mas não sei como e ande usar essa sintaxe.

    Agradeço desde já.

    Juan Sinobilino
  2. LFBuozi

    LFBuozi Membro Participativo

    Para facilitar a visualização, use o WHERE de relacionamento logo após a tabela, mas da forma que estava não dá problema.
    O único problema que vi aí é que a tabela IT-REQUISICAO não tem COD-EMITENTE, mas você usa o NOME-ABREV, veja o código:

    Código:
    FOR EACH it-requisicao,
        EACH recebimento
            WHERE it-requisicao.numero-ordem = recebimento.numero-ordem,
        EACH sub-conta
            WHERE it-requisicao.sc-codigo = sub-conta.sc-codigo,
        EACH emitente WHERE it-requisicao.nome-abrev = emitente.nome-abrev.
        DISP recebimento.dat-trans
            it-requisicao.ct-codigo
            it-requisicao.sc-codigo
            recebimento.numero-nota
            recebimento.cod-emitente
            recebimento.valor-total
            emitente.cod-emitente
            emitente.nome-emit WITH STREAM-IO WIDTH 300.
    END.
    
  3. jsinobilino

    jsinobilino Sem Pontuação

    muito obrigado.

    Ajudou bastante.
  4. eduardo.leite

    eduardo.leite Equipe de Suporte Moderador Equipe de Suporte

    Só um detalhe importante para não impactar no desempenho da rotina, sempre que for usar o FOR EACH para somente leitura (neste caso) coloque no NO-LOCK depois de cada leitura de tabela, pois assim a rotina não irá travar o registro e a leitura será bem mais rápida:

    Código:
    
    FOR EACH it-requisicao NO-LOCK,
        EACH recebimento NO-LOCK
       WHERE recebimento.numero-ordem = it-requisicao.numero-ordem,
       FIRST sub-conta NO-LOCK
       WHERE sub-conta.sc-codigo = it-requisicao.sc-codigo,
       FIRST emitente NO-LOCK
       WHERE emitente.nome-abrev = it-requisicao.nome-abrev.
    
        DISP recebimento.dat-trans
            it-requisicao.ct-codigo
            it-requisicao.sc-codigo
            recebimento.numero-nota
            recebimento.cod-emitente
            recebimento.valor-total
            emitente.cod-emitente
            emitente.nome-emit 
            WITH STREAM-IO WIDTH 300.
        
    END.
    
Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página