Duvida Display com múltiplas tabelas relacionadas

Discussão em 'Comandos Básicos' iniciado por Yasser Rachid, Janeiro 24, 2014.

  1. Yasser Rachid

    Yasser Rachid Sem Pontuação

    Boa tarde, estou estudando Progress há pouco mais de uma semana, e me deparei com o seguinte exercício:

    Escreva um programa l-disp7.p que para cada representante mostre o nome do representante, para cada cliente do representante mostre o número e o nome do cliente, para cada pedido do cliente mostre a data do pedido e para cada item do pedido mostre a quantidade e o nome do item. A tela deve assemelhar-se a que segue:

    [​IMG]
    https://www.dropbox.com/s/1lksiodwczplrm0/ex08.png

    O código que eu elaborei não se comporta como o esperado pelo exercício, e eu tenho quase certeza de que esta não é a melhor maneira de realizar este exercício:

    Código:
    PROMPT-FOR salesrep.rep-name.
     
    FIND salesrep WHERE salesrep.rep-name = INPUT salesrep.rep-name.
     
    FOR EACH customer OF salesrep:
        DISPLAY customer.cust-num
                customer.NAME.
        FOR EACH order OF customer:
            FOR EACH order-line OF order:
                FOR EACH ITEM OF order-line:
                    DISPLAY order.order-date
                            order-line.qty
                            ITEM.item-NAME.
    
    O código acima mostra apenas uma linha do relatório a cada vez que o usuário pressionar uma tecla, quando na verdade o exercício proposto pedia que todas as linhas fossem mostradas de uma só vez (como na foto).

    Qual seria a melhor forma de realizar este exercício?

    Desde já, agradeço a atenção.
  2. Agnaldo

    Agnaldo Membro Ativo

    Eu acho que seria algo assim:
    Código:
    FOR EACH SalesRep NO-LOCK:
        DISPLAY SalesRep.Sales-Rep SalesRep.Rep-Name.
        FOR EACH Customer WHERE Customer.Sales-Rep = SalesRep.Sales-Rep NO-LOCK:
            DISPLAY Customer.Cust-Num Customer.Name.
            FOR EACH Order WHERE Order.Cust-Num = Customer.Cust-Num NO-LOCK:
                DISPLAY Order.Order-Num Order.Order-Date.
                FOR EACH Order-Line WHERE Order-Line.Order-Num = Order.Order-Num NO-LOCK:
                    FIND Item WHERE Item.Item-Num = Order-Line.Item-Num NO-LOCK.
                    DISPLAY Order-Line.Item-Num Item.Item-Name.
                END.
            END.
        END.
    END.
    
    Mas se voce já tiver estudado a parte de "EACH EACH" e BREAK BY, e somente se já tiver visto mesmo, assim seria melhor:
    Código:
    FOR EACH SalesRep NO-LOCK:
        DISPLAY SalesRep.Sales-Rep SalesRep.Rep-Name.
        FOR EACH Customer WHERE Customer.Sales-Rep = SalesRep.Sales-Rep NO-LOCK:
            DISPLAY Customer.Cust-Num Customer.Name.
            FOR EACH Order WHERE Order.Cust-Num = Customer.Cust-Num NO-LOCK,
                EACH Order-Line WHERE Order-Line.Order-Num = Order.Order-Num NO-LOCK BREAK BY Order.Order-Num:
                IF FIRST-OF(Order.Order-Num)
                   THEN
                       DISPLAY Order.Order-Num Order.Order-Date.
                FIND Item WHERE Item.Item-Num = Order-Line.Item-Num NO-LOCK.
                DISPLAY Order-Line.Item-Num Item.Item-Name.
            END.
        END.
    END.
    
    brazjuniorgyn curtiu isso.
  3. Yasser Rachid

    Yasser Rachid Sem Pontuação

    Encontrei uma solução, o material pelo qual eu estava estudando não apresentava a solução de Join (each,each), encontrei a solução neste link:

    http://knowledgebase.progress.com/articles/Article/000035574

    Abaixo, segue o código para resolução do exercício:

    Código:
     
    PROMPT-FOR salesrep.rep-name.
     
    FIND salesrep WHERE salesrep.rep-name = INPUT salesrep.rep-name.
    IF AVAIL salesrep THEN DO:
        FOR EACH customer OF salesrep:
            DISPLAY customer.cust-num
                    customer.NAME
                    SKIP.
     
            FOR EACH order OF customer,
                EACH order-line of order,
                EACH ITEM OF order-line:
     
                DISPLAY order.order-date
                        order-line.qty
                        ITEM.item-name.
            END.
        END.
     
     
    END.
          
    acsj curtiu isso.
  4. Yasser Rachid

    Yasser Rachid Sem Pontuação

    Olá Agnaldo, obrigado por responder, testei os dois códigos que você mostrou e ambos funcionam corretamente, gostaria de agradecer pela ajuda.
  5. acsj

    acsj Membro Participativo

    Nesse exemplo como ficaria usando o mgcad pelo que vi não existe tabela salesrep no ems2.06 alguém pode dar um exemplo usando o banco mgcad?
  6. lwazevedo

    lwazevedo Membro Ativo

    Quanto a logica de usar each, each e of, é só você ver o relacionamento existente entre uma tabela e outra que exista no mgcad. o exemplo acima ele está usando um banco padrão do progress.
    acsj curtiu isso.

Compartilhe esta Página