Execução infinita em estrutura de controle

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Então vc esta falando da linha:

...
(SAL_LIMITE < 0.00 .and. abs(SAL_LIMITE) < LIMITE)
...

Veja que vc tem várias regras para não imprimir o registro. Aliás, eu estava vendo a regra anterior.
Não entendi direito o motivo desse valor absoluto. Se é para determinar o limite que o cliente pode ficar devendo, talvez seja melhor mudar o campo limite para negativo no cadastro e depois vc só colocaria:

...
sal_limite > limite
...

ou seja, o cliente não atingiu o limite que vc colocou no cadastro.
É claro que se vc usa esse campo para outra coisa ou eu não entendi direito, ignore o comentário.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem por Gelson »

Exatamente isto, pensei que no relatório fossem ser pulados os registros sal_limite == 0.00 e sal_limite > 0.00.

O valor absoluto é porque uso este campo sal_limite em outros lugares, então neste caso preciso que quando for negativo seje extraido o valor absoluto para comparar com o valor do campo limite, e vê se esta estourado.Se não tiver não imprime.

Neste caso, tenho de usar algum outro artifício para ser impresso apenas os registros que atendam a condição : (SAL_LIMITE < 0.00 .and. abs(SAL_LIMITE) < LIMITE) ?
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Com a regra sal_limite >= 0 vc já esta fazendo os dois.
A regra só deixa passar se o valor for negativo.

(SAL_LIMITE < 0.00 .and. abs(SAL_LIMITE) < LIMITE)
esta regra só permite imprimir se o saldo limite é negativo e o valor absoluto (módulo) estourou o limite do cadastro.

Elas estão certas. O quê não esta funcionando no sistema?
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem por Gelson »

Mesmo quando o sal_limite é igual a Zero, está sendo impresso todas .

Ex: conta 30002 tem sal_limite = 0.00 está saindo,
conta 30190 tem sal_limite = -10,00 , e limite de 390,00, e está sendo impressa,
conta 30033 tem sal_limite = -125,13 , e limite de 410,00, e está sendo impressa
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem por Gelson »

Testando consegui eliminar os valores negativos usando sal_limite >= 0,
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem por Gelson »

(SAL_LIMITE < 0 .and. (abs(SAL_LIMITE)) < LIMITE)

Assim parece que resolveu o problema.

Agora me explica uma coisa.

Neste caso a leitura do sinal ( < ) é invertida ?

seria valor absoluto maior que limite ?? mas este sinal é de menor.
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Nesta regra vc esta falando para o programa pular os registro que são negativos e que o sal_limite seja menor que o limite, independente do sinal de sal_limite.

Então se o sal_limite do cliente é -5000.00 ou 5000.00, com o ABS, os dois serão iguais (5000.00)

------------------------------------
sal_limite := -5000.00
limite := 1000.00

abs(sal_limite) < limite será igual a 5000.00 < 1000.00 (.F.)

Da forma que as regras estão montadas no seu programa, não será executado o IF. Então o registro será impresso. O cliente estourou o limite.

------------------------------------
sal_limite := -5000.00
limite := 10000.00

abs(sal_limite) < limite será igual a 5000.00 < 10000.00 (.T.)

Da forma que as regras estão montadas no seu programa, será executado o IF. Então o registro será impresso. O cliente não estourou o limite.

Lembrando que as regras foram montadas para verificar quais clientes não serão impressos. Tvz por isso, vc esteja com dúvidas sobre as regras.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem por Gelson »

Boa noite, gvc e amigos do fórum.

Quero agradecer a imensa ajuda do gvc, sem sua colaboração ainda estaria lutando com aquele loop até agora. Fico grato também ao dr. Spok e ao maligno pelas dicas. :))

Para finalizar, quero saber se o Clipper trata variáveis de memória de forma diferente do que quando usa campos de um dbf. Por exemplo:

No caso de somas entre variáveis de memória e valores de um campo,
ex:
mcampo = 0.00
sal_ini // campo de um dbf
mvalor = 0.00

mcampo = sal_ini + mvalor [ mvalor pode ser tanto debito quanto crédito] {-+}

if
mcampo > 0
skip
loop
end.

neste campo os valores resultantes das operações matemáticas de sal_ini + mvalor quando forem iguais a zero jamais serão impressas ?
ou por ser variável de memória e outro não tenho de usar um set filter to, ou outra comando qualquer para eliminar os registros iguais a zero.
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Com isso, o IF só será executado se o mcampo for MAIOR que ZERO.
Para que o mesmo seja executado, coloque [IF MCAMPO >= 0].
Assim só serão impressos os registros que MCAMPO for negativo.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem por Gelson »

Pensei que houvesse algum tratamento diferente pois neste caso aqui:

https://pctoledo.org/forum/viewto ... highlight=

O relatório usa duas variáveis de memória e um campo do dbf clientes.

Incluse mudei a variável mvalor = 0.00 para mvalor = 0 e mSAL_ATU = 0.00 para mSAl_ATU = 0, coforme observação do Hasse, e mesmo assim os valores zerados são impressos, não importando que sinais uso:
mSAL_ATU = SAL_INI + mvalor
IF mSAL_ATU > 0.00
SKIP

ou

mSAL_ATU = SAL_INI + mvalor
IF mSAL_ATU > 0
SKIP
..
..

Por isso pensei que quando houvesse a mistura de campo de variável houve algum procedimento diferente.
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem por Gelson »

Skip move o ponteiro de registro para uma nova posição em um arquivo de dados.

Neste caso variável de memória também é entendida como arquivo de dados, ou o clipper entende como sendo arquivo de dados somente os dados que existem fisicamente ?
Pergunto isto porque quando uso

IF msal_atu != 0
skip
loop
end

São impressos somente os valores iguais a zero, então o skip neste caso não esta funcionando. Certo ?
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

A variável é uma região da memória do computador que contém um determinado valor.
Os registros de um arquivo são transportado do disco para uma região da memória do computador.

Quando vc altera o valor de uma variável, o Clipper só altera o valor dessa determinada região.

Com o registro em arquivo é um pouco diferente. Essa região tem um tratamento especial. Quando o Clipper altera o valor de um registro, deve verificar se pode alterar. Se puder, essa informação alterada deve ser gravada no arquivo em disco.

Veja que vc esta fazendo:
...
mSAL_ATU = SAL_INI + mvalor
IF mSAL_ATU != 0.00
SKIP
...

Vc esta somando o valor do campo sal_ini mais o valor da variável mvalor. Se vc estive "correndo" o arquivo, todos os registros serão, na sua vez, somados com a variável e atribuido a msal_atu. Depois msal_atu é comparado se não é zero.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem por Gelson »

Então neste caso deveria estar dando certo, quando coloquei msal_atu != 0 deveria estar sendo gerado txt com qualquer valor diferente de Zero.
já usei <>, com qualquer sinal seja < ou > sempre o saldo Zerados saem.

Estas variáveis que são gravadas na memória tem como apaga-las antes da geração do txt ? assim poderia deletar as variáveis que tivessem msal_atu == 0 antes de gerar o txt.
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

"IF msal_atu != 0
skip
loop
end

São impressos somente os valores iguais a zero, então o skip neste caso não esta funcionando. Certo ?"

No caso acima, vc esta mandando pular os valor diferentes de zero. Os valores impressos serão somente os que msal_atu (variável de memória) for igual a zero.
SE vc quer imprimir somente os registros cujo resultado seja diferente de zero, vc deve inverter a regra.

Ah! Vc pode fazer tb:
[if msal_atu <> 0] ou [if msal_atu # 0]
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem por Gelson »

viajei na maionese quando disse esta besteira que colocando !=ó saem valores iguais a zero. é que já gerei o txt com !=, com >, com <, com <>. e em todos os saldos zerados saem, por isso devo ter me confudido ao postar esta mensagem.
já usei <>, com qualquer sinal seja < ou > sempre o saldo Zerados saem.


Pensei um gerar um txt, e fiz usando sdf, porém como disse o maligno em um post que achei aqui no forum, é um dureza pois os campos não batem de jeito nenhum, nem mexendo e re-mexendo. É o pior que mesmo gravando avacalhado observei que um valor de 1234,00 foi gravado como 1,00 e outro valor de 413,99 foi gravado certo então não dá para ter confiança exatidão da gravação.

Diante dos teste feitos e re-feitos uma infinidadede vezes, pensei nesta possibilidade.Que para ser sincero não sei é loucura minha ou se realmente tem executa-la na clipper 5.0
Responder