Página 1 de 1

verificar se uma variavel existe

Enviado: 18 Fev 2007 16:13
por Edmo
Caro colegas, boa tarde!

Estou com problemas em uma função, pois em determinado local do programa, quando chamo a função, a variavel existe e em outro local do programa ela ainda não existe, pois depende da digitação de alguma informação, porem a função também pode ser acionada.

O que eu desejo é saber se existe alguma função que verifique se a variavel "xTotVda", por exemplo, existe!

Eu não quero saber de que tipo ela é, somente se ela naquele momento já existe ou não.

Ela também não pode ser criada antes, pois depende de digitação de outras informações.

Obrigado

Edson
Edson

Enviado: 18 Fev 2007 17:19
por rochinha
Amiguinho

Ao usar variaveis que devam ser vistas em outras partes de seu programa voce deve PUBLICa-las:

Código: Selecionar todos

PUBLIC xTotVda
Ou passa-la como parametro para a função que também irá utiliza-la.

Um exemplo de variavel PUBLICa é aquele em que armazenamos o nome do sistema e que aparece no cabeçalho de nossos programas e sai impressa no rodape dos relatorios, pura suposição.

Se a variavel não definida em local algum voce pode tentar saber a sua existencia com:

Código: Selecionar todos

if ValType(xTodVda) = "U" // Undefined
Mas esta pratica não é boa pois voce deve conhecer e criar as variáveis antes de usa-las.

O erro que ocorre é para lembra-lo de programar, sem erros.

Neste tópico voce encontra mais informações sobre o uso de variaveis:

https://pctoledo.org/forum/viewto ... +variaveis

Enviado: 21 Fev 2007 13:49
por gvc
verifique se xTotVda = nil // Não foi declarada

Enviado: 21 Fev 2007 21:35
por Stanis Luksys
Olá,

Neste caso não tem como realmente saber se uma variável existe ou não, a menos que você seja organizado e declare todas as suas variáveis, de preferência inicializando com algum valor. Acredito que a melhor opção ainda seja com ValType().

Veja só, testa-la para saber se o valor é nulo não significa que ela não exista, pois se eu declarar:

Local cVar, nVar

Ambas são nulas e ambas existem.

Com o tempo e com um pouco de vício que eu já tinha com C e Pascal, eu peguei o costume de sempre declarar variáveis, e assim para saber se existe basta ir ao início da função e ver se tem ela lá... Mas em tempo de execução acho que não da...

Falou!

Enviado: 21 Abr 2007 22:56
por carlos_dornelas
Pessoal, estou precisando saber se uma determinada variável existe ou não. Encontrei este tópico e tentei utilizar o comando abaixo, mas de cara, já dá erro, dizendo que a variável xtodVda não existe. Alguém conseguiu alguma forma de determinar se a variável existe ou não?

[]s

Antonio Carlos



if ValType(xTodVda) = "U" // Undefined

verificar se uma variavel existe

Enviado: 22 Abr 2007 02:33
por Maligno
Acho que a melhor forma é usar a função abaixo, que funciona muito bem.

Código: Selecionar todos

function ExistVar(cName)
local lFound := .T.
local bError := ErrorBlock({|o|Break(o)})
begin sequence
    &cName := &cName
recover
    lFound := .F.
end
ErrorBlock(bError)
return lFound
Basta passar o nome da variável, como uma string.

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 22 Abr 2007 12:28
por vagucs
Se fizer assim

Código: Selecionar todos

IF VAR=NIL
...
...
END IF
ou

Código: Selecionar todos

IF VALTYPE(VAR)="U"
...
...
END IF
Quando VAR nao foi declarada vai causar erro.

A forma correta seria esta abaixo.

Código: Selecionar todos

IF TYPE("VAR")="U"
...
...
END IF
Pois TYPE atua diferente de VALTYPE, TYPE seria como se executasse a expressão e te desse o resultado, assim variaveis com conteudo NIL e não declaradas~/existentes retornam "U".

Faça o teste e veja.

Enviado: 22 Abr 2007 16:55
por Pablo César
Esta questão, é um clássico. Eu tinha visto isso a bastante tempo, só que eu não lembrava mais. Confesso que gostei do tratamento da função do ExistVar() do Maligno, mas você Wagner mostrou que o TYPE() tem diferença do VALTYPE() de uma forma simples e correta. Se bem que não sempre importa quais são os caminhos que levam a Roma, importante são os resultados. Espero que sirva este tópico como mais um clássico sobre variáveis não declaradas e inexistentes.

Foi show de bola essas duas opções. Se bem que antecipar o erro seria o mesmo que declará-la antecipadamente (seria mais conveniente, não ?). Mas tá aí serve de exemplo para muito poucos casos (acho eu).

Um clip-abraço :{ -:] :)Pos

Enviado: 22 Abr 2007 17:33
por Maligno
Taí o tipo de coisa que nunca deveria ser necessário utilizar. Da minha parte, esta função nunca foi usada. Se você precisa saber se uma variável ou símbolo qualquer existe é porque tem algo errado no seu programa. Aliás, isso é típico de linguagem fracamente tipada: XBase.

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 22 Abr 2007 20:30
por carlos_dornelas
Pessoal, obrigado pelas respostas! Acabei resolvendo de uma outra forma bem simples. Foi só pensar um pouquinho. Bastou definir a varriável no início do programa principal com o valor zerado.

O problema inicial era causado porque eu carregava um arquivo .mem gerado por outro aplicativo e após eu precisava atualizar/salvar esse mesmo .mem adicionando uma nova variável. Com a solução acima, ficou tudo certo pois se eu carrego o arquivo .mem pela primeira vez a variável em questão sempre estará definida com valor zerado e não causará qualquer erro no get de atualização. Quando carregar o arquivo .mem novamente eu terei a referida variável já atualizada e obtida do próprio .mem.

[]s

Antonio carlos

Enviado: 22 Abr 2007 20:39
por Poka
Olá a todos


Vagner ou Maligno, poderia me explicar
a diferenca de retorno desse teste de variavel.
Sei que a declaração como local vale somente
para a rotina, mas nesse caso eu estou na mesma rotina?


LOCAL VAR:="POKA"

? type("VAR")="U"

// RETORNA T


/////////////////


VAR:="POKA"

? type("VAR")="U"

// RETORNA F


Um abraço

Poka

Enviado: 22 Abr 2007 23:56
por Maligno
Poka escreveu:a diferenca de retorno desse teste de variavel.
Provavelmente porque no primeiro teste VAR é uma variável local e o nome desse tipo de variável não reside na tabela de símbolos criada pelo compilador. No segundo teste VAR é um nome que existe. Daí o teste pode ser feito.

A função Type() serve apenas para variáveis. Ela não funciona com funções. A função que apresentei funciona em todos os casos.

Claro que ainda fica aquele problema que comentei. Se o programa precisa disso é porque foi mal estruturado. Mesmo que seja para saber se um arquivo .MEM contém ou não certa variável. É melhor entrar num FoxBase qualquer e copiar os nomes das variáveis e declará-las explicitamente.

Fora isso, quero lembrar também, há uma exceção: a remota possibilidade de alguém criar um procedimento armazenado em arquivo, para ser interpretado e executado em run-time. Daí sim, saber se um símbolo existe é uma tarefa que se justifica. Mas isso é muito raro e nem acho que compensa tanto.

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 23 Abr 2007 18:22
por Poka
Eu já declaro as variaveis antes, não utilizo esse tipo de teste, foi apenas curiosidade mesmo, mas valeu pela informação.

Obrigado Maligno

Um abraço

Poka

Enviado: 23 Abr 2007 18:28
por Pablo César
É isso aí Poka !. Quem utiliza arquivos.MEM, as vezes vê a necessidade de saber se a variável existe antes de editar um novo GET. Mas de todas as formas, mais vale declarar (nem que seja ela com valor DEFAULT) e depois abrir o arquivo.MEM

Fica mais seguro e mais certo, mas é como você disse, vale como experiência e eu gostei também da solução apresentada pelo Wagner, você não ?

Um clip-abraço :)Pos

Enviado: 24 Abr 2007 10:40
por Poka
Olá a todos


Oi Pablo, eu gostei sim, por isso que até fiz um teste, lembro que no começo gostava de usar arquivos, .mem, relatorios utilizava .prn, as telas utilizava tambem um tipo de arquivo que não me recordo a extensao, mas com o tempo, eu preferi mesmo fazer tudo "na unha", tenho alguns relatorios de custo que nao acredito que dê para fazer utilizando esses arquivos, por isso nunca me interessei por esses programas tipo MIRO, que ja faz o sistema pra gente, mas fica sempre aquela rotina que voce tem que fazer manualmente mesmo. Lembro que tinha um cliente que dominava o Miro, mas no final eu precisava dar o retoque final, e era uma luta, já teve cliente que me pediu para alterar codigos fontes de terceiros, e isso realmente eu tô fora, só se for pra ganhar muito e eles e querem de graça, entao...


Quando surgiu o clipper 5.3 , fiz um curso em SP, ( só gastei dinheiro )
, mas no final depois de uns 3 meses o professor mandou um disquete com um pequeno sistema de telas e graficos de todos os tipos PIZZA,COLUNAS etc, muito bonitos por sinal, só utilizando os recusrsos do 5.3. Já procurei esse disquete e não achei, assim que achar vou disponibilizar, mas eu mesmo nunca utilizei. As telas desse sistema foram feitas no WORKBENCH do clipper, recurso que eu tambem nunca utilizei , mas o interessante é que eu nunca vi nenhum topico relacionado com o WORKBENCH, será que ninguem utiliza. ?

Até mais

Um abraço
Poka