1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
  2. Anuncie Aqui
    Anuncie aqui você Também: fdantas@4each.com.br

Duvida for each condicão where usando variável

Discussão em 'Progress 4GL' iniciado por daniloapontes, Dezembro 12, 2013.

  1. daniloapontes

    daniloapontes Sem Pontuação

    Bom dia a todos. Sou novato em progress e estou aprendendo com apostilas e dicas do forum, gostaria de saber se alguém sabe me dizer se consigo de alguma forma deixar a condição do for each variavel, ou seja, antes que execute o for each a condicao where seja montada em uma variavel e ao executar eu possa informar somente esta varialvel. Por exemplo:

    DEF VAR teste AS CHARACTER.

    IF escolha = 1 THEN
    ASSIGN condicao = "dt-emissao >= DATE('12/12/2013')".
    END.

    IF escolha = 2 THEN
    ASSIGN condicao = "nr-pedido = 3".
    END.

    FOR EACH ped-vend WHERE condicao:
    DISP nr-pedido.

    END.
  2. noellen

    noellen Equipe de Suporte Moderador Equipe de Suporte

    Acho que vc consegue através de pré-processor, por exemplo *

    Programa.p
    Código:
    /**************************************
    Programa Exemplo de uso do Preprocessor
                
    By Frank Nascimento
    **************************************/
    DEFINE VARIABLE k  AS INTEGER    NO-UNDO.
    
    {V:\Clientes\Prg\include.i
        &tablela = "emitente"
        &campo1  = "cod-emit"
        &campo2  = "nome-abrev"
        &tela    = "with 10 down three-d center"
    }
    
    {V:\Clientes\Prg\include.i
        &tablela = "item"
        &onde    = "WHERE item.descricao-1 begins 'a'"
        &campo1  = "it-codigo"
        &campo2  = "descricao-1 + descricao-2 format 'x(60)'"
    }
    

    include.i
    Código:
    /**************************************
    Programa Exemplo de uso do Preprocessor
           
    By Frank Nascimento
    **************************************/
    
    ASSIGN k = 0.
    Bloco:
    FOR EACH {&tablela} NO-LOCK {&onde}.
        ASSIGN k = k + 1.
        DISPLAY k LABEL "Reg.Num."
                {&campo1}
                {&campo2} {&tela}.
        {&complemento}
        IF k GT 20 THEN LEAVE Bloco.
    
    END.

    * créditos do exemplo do Frank Nascimento
    Última edição: Dezembro 12, 2013
    fdantas curtiu isso.
  3. daniloapontes

    daniloapontes Sem Pontuação

    Noellen, boa tarde! Agradeço o retorno e a dica do uso do Preprocessor, fico conhecendo mais uma forma de trabalhar com condicões variaveis, mas meu problema era mais simples do que eu tinha pensado e consegui colocar as opção que eu queria de outra forma, veja abaixo as condições para ped-venda.cod-sit-ped.

    for each mgmov.ped-venda no-lock
    where mgmov.ped-venda.dt-emissao >= DATE (dt_emissao_ini:SCREEN-VALUE) and
    mgmov.ped-venda.dt-emissao <= DATE (dt_emissao_fim:SCREEN-VALUE) AND
    mgmov.ped-venda.dt-entrega >= DATE (dt_entrega_ini:SCREEN-VALUE) and
    mgmov.ped-venda.dt-entrega <= DATE (dt_entrega_fim:SCREEN-VALUE) AND
    log-cotacao = FALSE AND
    mgmov.ped-venda.no-ab-reppri >= f_representante_ini:SCREEN-VALUE AND
    mgmov.ped-venda.no-ab-reppri <= f_representante_fim:SCREEN-VALUE AND
    mgmov.ped-venda.user-impl >= f_user_ini:SCREEN-VALUE AND
    mgmov.ped-venda.user-impl <= f_user_fim:SCREEN-VALUE AND
    mgmov.ped-venda.cod-sit-ped <> 6 AND
    ((mgmov.ped-venda.cod-sit-ped = 2 and INPUT opc = "3") OR
    (mgmov.ped-venda.cod-sit-ped = 3 and INPUT opc = "3")OR
    (mgmov.ped-venda.cod-sit-ped = 1 and INPUT opc = "2") OR
    (mgmov.ped-venda.cod-sit-ped = 4 and INPUT opc = "2") OR
    (mgmov.ped-venda.cod-sit-ped = 5 and INPUT opc = "2")OR
    (mgmov.ped-venda.cod-sit-ped = 1 and INPUT opc = "1") OR
    (mgmov.ped-venda.cod-sit-ped = 2 and INPUT opc = "1") OR
    (mgmov.ped-venda.cod-sit-ped = 3 and INPUT opc = "1") OR
    (mgmov.ped-venda.cod-sit-ped = 4 and INPUT opc = "1") OR
    (mgmov.ped-venda.cod-sit-ped = 5 and INPUT opc = "1")) AND
    mgmov.ped-venda.cod-estabel = "RTI"
    by ped-venda.dt-emissao BY mgmov.ped-venda.nr-pedido:
  4. eugenio.marietti

    eugenio.marietti Consultor Progress Moderador Equipe de Suporte

    E aí, Danilo! Blza?
    Cara, como ficou a performance disso?
    Acho que vc estava no caminho certo... colocar o seu "where" em uma varável!
    Só que pra isso vc não vai poder utilizar o "For Each" simplesmente... terá que usar um recurso muuuito interessante do Progress: Query Dinâmica!
    Veja um exemplo:

    Código:
    /* Autor: Eugênio A. Marietti  */
    
        Def Temp-table ttRelat No-undo
            Like Item.
    
        Def Var iOpcao    As Int No-undo Init 1.
        Def Var iCount    As Int No-undo.
        Def Var qh        As Widget-handle No-undo.
        Def Var bhFile    As Widget-handle No-undo.
        Def Var fh        As Widget-handle No-undo Extent 2.
        Def Var cQuery    As Char          No-undo.
    
        For Each Item No-lock
            iCount = 1 To 15 :
    
            Create ttRelat.
    
            Buffer-copy Item
                    To ttRelat.
    
        End.
    
        Update iOpcao View-as Radio-set Vertical
                              Radio-buttons "Código", 1, "Descrição", 2
                              Tooltip 'Pressione F2'
                      Label 'Classificar itens por' 
              With View-as Dialog-box Three-d Side-labels Frame fOpcao Title 'Exemplo Query Dinâmica'.
    
        Assign cQuery = 'For Each ttRelat No-Lock Use-index'.
    
        Case iOpcao :
    
            When 1 Then Assign cQuery = cQuery + ' codigo'.
    
            When 2 Then Assign cQuery = cQuery + ' descricao'.
    
        End Case.
    
        Create Buffer bhFile For Table "ttRelat".
       
        Assign fh[1] = bhFile:Buffer-field('it-codigo')
              fh[2] = bhFile:Buffer-field('desc-item').
    
        Create Query qh.
       
        qh:Set-buffers(bhFile).
        qh:Query-prepare(cQuery).
        qh:Query-open.
        qh:Get-first.
    
        Repeat While Not qh:Query-off-end :
       
            Disp fh[1]:Buffer-value Format 'X(16)' Column-label 'Código'
                fh[2]:Buffer-value Format 'X(30)' Column-label 'Descrição'
                With Scrollable 15 Down.
    
            qh:Get-next().
    
        End.
    
        qh:Query-close().
       
        Delete Object qh. 
        Delete Object bhFile. 
    
  5. daniloapontes

    daniloapontes Sem Pontuação

    Eugenio, Blz sim, e você?
    Agradeço sua colaboração, esse exemplo que você me passou é exatamente que eu queria, estou acostumado trabalhar com query dinâmicas em outras linguagens, eu tinha certeza que em progress teria algo parecido, esse seu exemplo abriu um pouco mais minhas possibilidades, irei usar para outras soluções. Vou alterar meu código utilizando seu exemplo e te falo se melhorou o desempenho. Aproveito para perguntar se você sabe onde encontro alguma apostila de progress que explique os conceitos, propriedades e metodos para trabalhar com query, buffers, tabelas temporárias e geração de relatórios (arquivo txt, excel, word, etc).
    Obrigado,
    Danilo Pontes
  6. lwazevedo

    lwazevedo Membro Ativo

    Bom como todos postaram suas ideias, eu resolvi postar a minha....muito simples.

    /* Define a condicao do where usando pre-processador*/

    &scoped-define condicao cadastro.codigo = 1 and cadastro.nome = "fulano"


    FOR each cadastro where {&condicao} NO-LOCK.

    disp cadastro.codigo
    cadastro.nome.

    END.

    Valeu.

Compartilhe esta Página