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.
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
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:
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.
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
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.