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

Dica JOIN com FOR EACH

Discussão em 'Progress 4GL' iniciado por jc01, Abril 14, 2015.

  1. jc01

    jc01 Membro Participativo

    Eu acho que é interessante mostrar pro pessoal, principalmente os novatos como eu que antes estavam mais acostumados a usar comandos SQL, como utilizar JOIN com FOR EACH. A imagem abaixo demonstra os tipos de JOIN existentes em SQL. Gostaria que alguém experiente pudesse representar cada tipo de JOIN usando FOR EACH. Sem querer pedir demais, apenas acredito que este tópico será bastante útil.[​IMG]
  2. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    bem, de uma tabela localizar registros semelhantes pro chave estrangeira, é simples:
    Código:
    /* um pra muitos */
    
    for each tabela a no-lock
        ,
        each tabela b of tabela a no-lock:
    end.
    
    /* um pra um */
    for each tabela a no-lock
        ,
        first tabela b of tabela a no-lock:
    end.
    
    O grande problema do progress é que não tem o outer join, ou seja, se achar o registro mostra, se não achar mostra a tabela principal assim mesmo.
    mas existe o outer join se vc usar queries.
  3. jc01

    jc01 Membro Participativo

    Tu quis dizer que isso:

    Código:
    for each tabela a no-lock
        ,
        each tabela b of tabela a no-lock:
    end.
    
    Traria os registros da tabela A mesmo não tendo ligação com a tabela B? Pensei que dessa forma seria o "INNER JOIN", ou seja, pensei que traria apenas o que tivesse relação.
  4. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    não, eu quis dizer que traz so o que acha, se vc quer fazer ao contrario através de queries vc consegue usar um outer join.
  5. Ricardo Trindade de Souza

    Ricardo Trindade de Souza Sem Pontuação

    Prezados,
    Gostaria de acrescentar (corroborando com o colega BootStrapMaster), que o Progress possui, no comando "for", em sua "record phrase", uma cláusula para utilização do "outer-join". O "inner-join" seria obtido automaticamente através do relacionamento direto com "OF record" ou "WHERE". Entretanto, quase nunca é utilizado, porque é muito raro durante o raciocínio de um relacionamento entre tabelas, contar com registros não encontrados.
    Vejam um exemplo tirado do manual Progress 4GL Reference (Versão 10):

    OPEN QUERY q1 PRESELECT EACH customer,
    FIRST order OUTER-JOIN OF customer WHERE order.order-num < 50
    FIRST order-line OUTER-JOIN OF order WHERE order-line.item-num < 15.


    No exemplo acima, mesmo que não se encontre um registro da tabela "order" relacionado à tabela "customer", o registro de "customer" permanecerá visível. (FIRST order OUTER-JOIN OF customer).
    E, na última linha, mesmo que não exista um registro de "order-line" relacionado à tabela "order", o registro de "order" permanecerá visível. (FIRST order-line OUTER-JOIN OF order).

    Sei que cada caso é um caso. Mas, em 26 anos de Desenvolvimento Progress, nunca passei por essa necessidade.

    Maiores detalhes, veja no manual OpenEdge Development - Progress 4GL Reference (Progress 10), página 1.113, referente à RECORD PHRASE
    OUTER-JOIN.​
  6. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Eu sou bem sincero em dizer que prefiro fazer, se fosse um caso como o seu exemplo, montar for each dentro do outro, tem mais controle sobre a rotina, podendo fazer testes e tomar decisões.

Compartilhe esta Página