Página 2 de 4

Enviado: 04 Jul 2007 17:08
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.

Enviado: 04 Jul 2007 17:20
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) ?

Enviado: 04 Jul 2007 19:10
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?

Enviado: 04 Jul 2007 19:23
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

Enviado: 04 Jul 2007 19:26
por Gelson
Testando consegui eliminar os valores negativos usando sal_limite >= 0,

Enviado: 04 Jul 2007 19:32
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.

Enviado: 04 Jul 2007 20:45
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.

Enviado: 04 Jul 2007 21:56
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.

Enviado: 05 Jul 2007 10:01
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.

Enviado: 05 Jul 2007 17:39
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.

Enviado: 05 Jul 2007 20:39
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 ?

Enviado: 06 Jul 2007 10:53
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.

Enviado: 06 Jul 2007 22:01
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.

Enviado: 08 Jul 2007 09:29
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]

Enviado: 08 Jul 2007 16:58
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