Variáveis no progress
Uma variável em PROGRESS é tratada como sendo uma entidade que possui atributos e eventos, ou seja, um objeto. Por exemplo, em uma variável do PROGRESS pode ser definido label, cor, formato, visualização e eventos.
DEFINE { [ [ NEW [ GLOBAL ] ] SHARED ] | [ PRIVATE | PROTECTED | PUBLIC ] [ STATIC ] } VARIABLE variable-name { { AS [ HANDLE TO ] primitive-type-name | AS [ CLASS ] { object-type-name } | LIKE field } [ EXTENT [ constant ] ] } [ BGCOLOR expression ] [ COLUMN-LABEL label ] [ CONTEXT-HELP-ID expression ] [ DCOLOR expression ] [ DECIMALS n ] [ DROP-TARGET ] [ FONT expression ] [ FGCOLOR expression ] [ FORMAT string ] [ INITIAL { constant | { [ constant [ , constant ] ... ] } } ] [ LABEL string [ , string ] ... ] [ MOUSE-POINTER expression ] [ NO-UNDO ] [ [ NOT ] CASE-SENSITIVE ] [ PFCOLOR expression ] { [ view-as-phrase ] } { [ trigger-phrase ] }
Pontos mais importantes da declaração:
NEW SHARED VARIABLE variable-name
Define e identifica uma variável a ser compartilhada com um procedimento direta ou indiretamente, pelo procedimento atual. O procedimento chamado deve nomear a mesma variável em uma declaração DEFINE SHARED VARIABLE variable-name.
NEW GLOBAL SHARED VARIABLE variable-name
Define e identifica uma variável que pode ser usada por qualquer procedimento que declare a mesma variavel seguindo a declaração DEFINE SHARED VARIABLE variable-name. O valor de uma variável global compartilhada permanece disponível durante toda uma sessão de ABL.
SHARED VARIABLE variable-name
Define e identifica uma variável que foi criado por outro procedimento que usou a declaração DEFINE NEW SHARED VARIABLE ou DEFINE NEW GLOBAL SHARED VARIABLE.
VARIABLE variable-name
Declara o nome da variável.
AS primitive-type-name
Especifica um tipo primitivo para a variável que está definindo. O tipo de dados (primitiva-type-name) pode ser um dos seguintes procedimentos:
CHARACTER | COM-HANDLE | DATE | DATETIME | DATETIME-TZ | DECIMAL| HANDLE | INT64 | INTEGER | LOGICAL | LONGCHAR | MEMPTR | RAW | RECID| ROWID
LIKE field
Indica o campo de uma tabela para referenciar as características da variável como tipo, label, initial, formato, extent e view-as.
EXTENT [ constant ]
Define a variável como um elemento array, onde podem ser armazenados uma cadeia de dados de acordo com o tipo primitivo definido, a cadeia sempre iniciará da posição 1.
DECIMALS n
Define o numero de casas após a “,” em variáveis do tipo DECIMAL.
FORMAT string
Define o formato que os dados da variável serão apresentados.
INITIAL { constant | [ constant [ , constant ] . . . ] }
Define um valor inicial para variável.
NO-UNDO
Quando o valor de uma variável é alterado durante uma operação e a operação é desfeita, o AVM restaura o valor da variável ao seu valor anterior. Se você não quer, ou se você não precisa, que o valor de uma variável seja desfeita, mesmo quando ele foi alterado durante uma transação, use a opção NO-UNDO. NO-UNDO torna as variáveis mais eficientes, use esta opção sempre que possível.
Exemplos:
Definindo novas variáveis compartilhadas:
Ex: Programa1.p
DEFINE NEW SHARED VARIABLE del AS LOGICAL NO-UNDO. DEFINE NEW SHARED VARIABLE nrecs AS INTEGER NO-UNDO.
Acessando variáveis compartilhadas em outros procedimentos (programas):
Ex: Programa2.p
DEFINE SHARED VARIABLE del AS LOGICAL NO-UNDO. DEFINE SHARED VARIABLE nrecs AS INTEGER NO-UNDO.
Variável do tipo data com array de 2 posições e iniciando com a data atual:
DEFINE VARIABLE var1 AS DATE INITIAL TODAY EXTENT 2 NO-UNDO. MESSAGE var1[1] SKIP var1[2] VIEW-AS ALERT-BOX INFO BUTTONS OK.
Qualquer duvida ou sugestão por favor comentem.
OUTPUT TO VALUE (“c:\\temp\xxx.txt”).
DEFINE VARIABLE termoPesqJson as CHAR INIT “Abadia de Goias” .
DEFINE VARIABLE iCity as CHAR INIT “cidade.cidade” .
//(1)assim não reconhece o conteudo da iCity como nome da tabela
//FOR EACH mgemp.cidade WHERE &iCity = STRING(termoPesqJson):
//(2)assim funciona, mas no lugar da “cidade.cidade” eu quero que seja uma variavél para poder trocar sempre que eu precisar
FOR EACH mgemp.cidade WHERE cidade.cidade = STRING(termoPesqJson) :
EXPORT DELIMITER “|”
“cidade” cidade.cidade
“sigla” cidade.sigla
“estado” cidade.estado
“pais” cidade.pais .
END .
/*
se no lugar da variavel iCity(1) eu escrevo o nome da tabela cidade.cidade(2) dá certo
e gera a saída correta:
“cidade”|”Abadia de Goias”|”sigla”|”GO001″|”estado”|”GO”|”pais”|”BRASIL”
*/
Olá Enio,
desculpe a demora em responder, eu estava de férias rsrsrs.
Se entendi bem você quer montar um WHERER dinamicamente.
Se for isso num FOR EACH convencional não vai ser possível a não ser que monte vários EACHs um para cada situação.
Outra solução é criar uma QUERY e montar seu FOR EACH dentro dela,
veja nesse exemplo da OpenEdge: https://knowledgebase.progress.com/articles/Article/P102491
no seu caso ficaria assim:
DEFINE VARIABLE qh AS WIDGET-HANDLE.
DEFINE VARIABLE cTabela as CHAR INIT "cidade" .
DEFINE VARIABLE cWhere as CHAR INIT "cidade.cidade" .
DEFINE VARIABLE cidade AS char initial "Londrina".
CREATE QUERY qh.
qh:SET-BUFFERS(BUFFER mgcad.cidade:HANDLE).
qh:QUERY-PREPARE("FOR EACH " + cTabela + " WHERE " + cWhere + " = '" + cidade + "'").
qh:QUERY-OPEN.
REPEAT WITH FRAME y:
qh:GET-NEXT().
IF qh:QUERY-OFF-END THEN LEAVE.
DISPLAY cidade
cidade FORMAT "x(30)"
estado FORMAT "X(20)".
END.
qh:QUERY-CLOSE().
DELETE OBJECT qh.