Página 1 de 2
Relatório com problemas
Enviado: 16 Dez 2005 07:26
por Gelson
Bom dia, pessoal
Seguinte fiz um relatório que me mostra o saldo devedores, porém preciso que quando o saldo for igual a 0.00 não seje impresso e que no caso de uma única conta seje levado em consideração o valor de 68.994.04 no momento do calculo do saldo. Não posso entrar com este valor no meu banco de dados, ou seja, não posso dar um crédito na conta, quero apenas remendar o relatório.
Explicação ; o select 1 pega minha meu cadastro de clientes, no qual pelos codigo 1,2, e 3 faço a destinção entre eles. No código abaixo o que está em letras minusculas são os teste que estou fazendo para tentar acertar o fonte.
Não está dando erro na compilação pore'm continua saindo os saldos igual a 0.00 e o saldo da conta continua não levando em consideração op valor de 68.994.04.
SELECT 1
do case
case mtipo = 3 .and. val(conta) = 30300
mSAL_ATU = SAL_INI + mvalor - (68.994,04)
endcase
mSAL_ATU = SAL_INI + mvalor
IF mSAL_ATU >= 0.00 // não quero que seje impresso conts com saldo = 0.00 //
SKIP
LOOP
ENDIF
IF mlinha > 50
@1,10 SAY '** ** - CONTA CORRENTE'
@1,65 SAY 'FOLHA'
@1,69 SAY mfolha PICTURE '999'
@2,20 SAY 'RELACAO DE SALDOS DEVEDORES ATE'
SET CENTURY ON
@2,54 SAY mdata
SET CENTURY OFF
DO CASE
CASE mtipo = 1
@2,75 SAY 'CARRETEIROS'
CASE mtipo = 2
@2,75 SAY 'CLIENTES'
OTHERWISE
@2,75 SAY 'FUNCIONARIOS'
ENDCASE
@4,4 SAY 'CONTA'
@4,14 SAY 'NOME'
@4,50 SAY 'TIPO'
@4,86 SAY 'SALDO'
mfolha = mfolha + 1
mlinha = 5
ENDIF
@mlinha,4 SAY CONTA
@mlinha,10 SAY NOME
@mlinha,44 SAY TIPO
@mlinha,82 SAY -mSAL_ATU PICTURE '9,999,999,999.99D'
mlinha = mlinha + 1
mtotsal = mtotsal + mSAL_ATU
SKIP
ENDDO
@mlinha,35 SAY 'T O T A L = >'
@mlinha,82 SAY -mtotsal PICTURE '9,999,999,999.99D'
EJECT
SET DEVICE TO SCREEN
SET CONSOLE OFF
SET PRINT ON
?? CHR(27) + '@'
SET PRINT OFF
SET CONSOLE ON
EJECT
USE
CLEAR
RETURN
Enviado: 17 Dez 2005 09:39
por Gelson
Pessoal,
Seguindo a apostila que peguei aqui no site Fiz os seguintes vários testes no meu fonte :
na linha IF mSAL_ATU > 0.00 ( saem valores iguais a 0.00 ) era para estar saindo apenas valores maiores que zero.
Se uso != 0.00 saem apenas as contas com valores iguais a 0.00.
Se uso < 0.00 saem valores iguais a 0.00 e - 0.00,
Se uso > 0.00 saem valores iguais a 0.00 e maiores que 0.00
Se uso = saem valores zerados, negativos e positivos.
Se alguem puder me dar uma dica, coloco meu fonte inteiro para verificação do meu erro.
Código: Selecionar todos
*
CLEAR
mlinha = 66
mfolha = 1
mtotsal = 0.00
mdata = CTOD(' / / ')
mtipo = 0
USE CLIENTES INDEX INCLIENT
SELECT 2
USE MOVIM INDEX IMOVIM
@10,01 SAY 'INFORME DATA LIMITE'
@10,21 GET mdata
@11,01 SAY 'INFORME TIPO'
@11,21 GET mtipo PICTURE '9'
@11,23 SAY '1 -> CARRETEIRO, 2 -> CLIENTES, 3 -> FUNCIONARIO'
READ
SET CONSOLE OFF
SET PRINT ON
?? CHR(27) + CHR(15)
SET PRINT OFF
SET CONSOLE ON
SET DEVICE TO PRINT
SELECT 1
DO WHILE .NOT. EOF()
IF CONTA = '99998'
SKIP
LOOP
ENDIF
mSAL_ATU = 0.00
DO CASE
CASE mtipo = 1
IF VAL(CONTA) > 19999
SKIP
LOOP
ENDIF
CASE mtipo = 2
IF VAL(CONTA) > 30000 .OR. VAL(CONTA) < 20000
SKIP
LOOP
ENDIF
OTHERWISE
IF VAL(CONTA) < 30000
SKIP
LOOP
ENDIF
ENDCASE
SELECT 2
mvalor = 0.00
SEEK CLIENTES->CONTA
DO WHILE CLIENTES->CONTA = CONTA .AND. .NOT. EOF()
IF DATA > mdata
SKIP
LOOP
ENDIF
IF CT < 10
mvalor = mvalor - VALOR
ELSE
mvalor = mvalor + VALOR
ENDIF
SKIP
ENDDO
SELECT 1
mSAL_ATU = SAL_INI + mvalor
[b]IF mSAL_ATU > 0.00[/b]
SKIP
LOOP
ENDIF
IF mlinha > 50
@1,10 SAY '** Relatorio ** - '
@1,65 SAY 'FOLHA'
@1,69 SAY mfolha PICTURE '999'
@2,20 SAY 'RELACAO DE SALDOS DEVEDORES ATE'
SET CENTURY ON
@2,54 SAY mdata
SET CENTURY OFF
DO CASE
CASE mtipo = 1
@2,75 SAY 'CARRETEIROS'
CASE mtipo = 2
@2,75 SAY 'CLIENTES'
OTHERWISE
@2,75 SAY 'FUNCIONARIOS'
ENDCASE
@4,4 SAY 'CONTA'
@4,14 SAY 'NOME'
@4,50 SAY 'TIPO'
@4,86 SAY 'SALDO'
mfolha = mfolha + 1
mlinha = 5
ENDIF
@mlinha,4 SAY CONTA
@mlinha,10 SAY NOME
@mlinha,44 SAY TIPO
@mlinha,82 SAY -mSAL_ATU PICTURE '9,999,999,999.99D'
mlinha = mlinha + 1
mtotsal = mtotsal + mSAL_ATU
SKIP
ENDDO
@mlinha,35 SAY 'T O T A L = >'
@mlinha,82 SAY -mtotsal PICTURE '9,999,999,999.99D'
EJECT
SET DEVICE TO SCREEN
SET CONSOLE OFF
SET PRINT ON
?? CHR(27) + '@'
SET PRINT OFF
SET CONSOLE ON
EJECT
USE
CLEAR
RETURN
Enviado: 17 Dez 2005 10:16
por Irineu
Voce esta colocado o sinal de maior ou igual, então con certeza sairá os valores zerados.
IF mSAL_ATU >= 0.00 // não quero que seje impresso conts com saldo = 0.00 //
SKIP
Deve ser Assim:
IF mSAL_ATU > 0.00 // não quero que seje impresso conts com saldo = 0.00 //
SKIP
Enviado: 17 Dez 2005 10:33
por Gelson
Bom dia, Irineu e amigos do forum
Estou usando justamente assim como vc disse , veja o fonte acima :
mSAL_ATU = SAL_INI + mvalor
IF mSAL_ATU > 0.00
SKIP
Só que continua sendo impresso as contas com valores zerados,
O mais engraçados e que se ponho para emitir as contas com valores diferentes de zero (!=) só saem as contas zeradas.
Enviado: 17 Dez 2005 11:42
por Irineu
Falha minha, não observei que quando vc faz a comparação vc não esta imprimindo e sim voltando para o topo do loop, então o que esta acontecendo é que quando o saldo vor > 0 vc esta voltando para o topo do loop.
Então vc tem que colocar assim:
IF mSAL_ATU == 0.00
SKIP
loop
Enviado: 19 Dez 2005 07:15
por Gelson
Olá, Irineu e amigos
Mesmo usando == (exatamente igual ) ainda assim continua sendo impresso as contas com valores zerados, e valores negativos.
Pela lógica e de acordo com a postila que peguei seria apenas usar :
If mSal_ATU > 0.00
skip
loop
para ser impresso apenas as contas com saldo maior que 0.00.
Mas não esta dando certo.
Enviado: 19 Dez 2005 09:09
por Irineu
Acho que vc esta comparando variavel errada, não deveria ser (SALDO) no lugar de (mSal_ATU)
Enviado: 19 Dez 2005 10:21
por Gelson
Olá, Irineu e amigos do forum
veja só, algumas partes do fonte acima.
@ 4,86 Say 'Saldo'
.
.
.
@mlinha, 82 Say -mSal_Atu Picture '9,999,999,999.99D'
No Relatório o meu saldo é meu saldo atual.
Não uso um variável para saldo e outra para saldo atual.
No meu banco de dados (clientes) a variável Sal_Atu é quem recebe e guarda os valores dos saldos.

Enviado: 19 Dez 2005 10:57
por Irineu
Mande a rotina inteira que faz a impressão e a estrutura do arquivo com a descrição dos campos para :
iklosowski@gmail.com
Vou analizar e te informo o que esta acontecendo.
Enviado: 19 Dez 2005 14:31
por Gelson
Ok, já mandei.
Obrigado pela atenção.
Enviado: 19 Dez 2005 16:10
por Hasse
Boa tarde amigos.
Eu também já tive "arranca rabo" com este detalhe.
Depois de muitos testes cheguei às seguintes conclusões:
1)- 0 (zero) não é igual a 0.00, pois 0 é inteiro e 0.00 é fração, e as frações são analisadas como sendo exponenciais. A exponencial de 0.00 pode ser algo como 0.000000000001 ou sei lá.
2)- Da mesma forma 8 não é igual a 8.00 pelo mesmo motivo.
Quando preciso comparar valores deste tipo uso n_valor > 0 quando são inteiros, e quando são fracionários uso n_valor > "0.0000001" ou algo semelhante, sempre levando em consideração a aproximação que deve ser respeitada.
Quem sabe os nossos mestres podem esclarecer este tópico, pois já ví esta mesam dúvida várias vezes neste Fórum.
Hasse.
Enviado: 22 Dez 2005 13:53
por Gelson
Bem pessoal,
Quanto ao relatório tentei usar como If nSal_ATU <=0 e também não deu certo. mas ainda tô tentando.
agora quanto ao remendo do saldo daquela conta, iz o seguinte : depois de tentar o proprio valor diretamente no fonte e não dar certo, criei uma variável recebendo o bendito valor de 68994,04 e acrescentei no meu Do While para verificar se a conta é igual ou diferente da que quero que o valor seje considerado no calculo do saldo. Conf. abaixo:
O problema é de esta dando tipo imcopativel como o operador (+) erro Base 1081
Aproveitando, gostaria de saber se este meu procedimento está correto, ou seja, usar um Do While e logo em seguida outro. ou se tenho que arrumar um jeito de criar uma única condição que satisfaça o que preciso.
Código: Selecionar todos
mlinha = 7
mresp = ' '
mconta = SPACE(5)
wvalor="68994,04"
msal_ini = 0.00
mdat_ini = CTOD(' / / ')
mdata = CTOD(' / / ')
mdat_sal = CTOD(' / / ')
USE CLIENTES INDEX ICLIENTE
SELECT 2
USE MOVIM INDEX IMOVIM
SELECT 3
USE HISTOR INDEX IHISTOR
DO WHILE .T.
mconta = SPACE(5)
CLEAR
@3,10 SAY 'CONSULTA DE CONTA CORRENTE'
@4,10 SAY ' E X T R A T O'
@08,08 TO 15,43 DOUBLE
@10,10 SAY 'INFORME CONTA'
@18,10 SAY '99999 PARA ENCERRAR'
@10,34 GET mconta
READ
IF mconta = '99999'
CLOSE ALL
CLEAR
RETURN
ENDIF
SELECT 1
SEEK mconta
IF EOF()
@22,1 SAY 'CONTA NAO CADASTRADA'
WAIT ', ENTER'
LOOP
ELSE
EXIT
ENDIF
ENDDO
SELECT 2
SEEK mconta
IF EOF()
@22,1 SAY 'CONTA SEM MOVIMENTO'
WAIT ', ENTER PARA CONTINUAR'
ELSE
@12,10 SAY 'INFORME DATA DE INICIO'
@12,34 GET mdata
READ
ENDIF
SELECT 1
CLEAR
@1,01 SAY '*** *** - c/c
@2,09 SAY 'CONTA :'
@2,17 SAY CONTA
@2,23 SAY '-'
@2,25 SAY NOME
@3,02 SAY ' DATA'
@4,02 SAY 'EMISSAO'
@4,11 SAY 'HISTORICO'
@4,23 SAY 'DOCUMENTO'
@4,37 SAY 'V A L O R'
@4,55 SAY 'SALDO ATUAL'
@5,1 SAY REPLICATE('-',78)
msal_ini = SAL_INI
mdat_sal = DAT_INI
SELECT 2
DO WHILE mconta = CONTA .AND. DATA < mdata .AND. .NOT. EOF() .and. mconta#"30300"
IF CT < 10
msal_ini = msal_ini - VALOR
ELSE
msal_ini = msal_ini + VALOR
ENDIF
mdat_sal = DATA
SKIP
ENDDO
SELECT 2
DO WHILE mconta = CONTA .AND. DATA < mdata .AND. .NOT. EOF() .and. mconta="30300"
IF CT < 10
msal_ini = msal_ini - VALOR + wvalor
ELSE
msal_ini = msal_ini + VALOR + wvalor
ENDIF
mdat_sal = DATA
SKIP
ENDDO
Bem é isto ai, qualquer ajuda é bem vinda.
Obrigado a todos.
Enviado: 22 Dez 2005 14:24
por Hasse
Veja que "vvalor" é string, atribuída logo no início da
rotina, e que não pode ser somada a valor numérico, e
por este motivo dá pau com erro 1081 "+".
É necessário usar VAL(vvalor).
No caso ainda precisa tomar cuidado pois usa a vírgula como
separador decimal, que o Clipper vê como milhar.
Hasse.
Enviado: 22 Dez 2005 14:51
por Gelson
Bem,
Mudei meu Banco de dados e crei um campo novo Chamado SAL_ACERTO
coloquei lá o vr. 68994,04, que representa o meu remendo no relatório de saldo.
defini a variável ( mSAL_ACERTO = 0,00 ) e mudei meu fonte para :
[/code]SELECT 2
DO WHILE mconta = CONTA .AND. DATA < mdata .AND. .NOT. EOF() .and. mconta="30300"
IF CT < 10
msal_ini = msal_ini - VALOR + mSAL_ACERTO
ELSE
msal_ini = msal_ini + VALOR + mSAL_ACERTO
ENDIF
mdat_sal = DATA
SKIP
ENDDO
Código: Selecionar todos
Mesmo lançando o vr. 68994,04 com data de 01/01/02 e pedindo meu saldo em 14/12/2005 ainda mosta o valor errado, ou seja ele não está considerando este valor lançado neste novo campo.
Enviado: 22 Dez 2005 14:52
por Gelson
Se algum moderador ver esta minha bagunça e puder arrumar fico grato.