Relatório com problemas

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Relatório com problemas

Mensagem 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
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem 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
Irineu
Usuário Nível 2
Usuário Nível 2
Mensagens: 61
Registrado em: 13 Ago 2003 22:01
Localização: Curitia-PR
Contato:

Mensagem 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
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem 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.
Irineu
Usuário Nível 2
Usuário Nível 2
Mensagens: 61
Registrado em: 13 Ago 2003 22:01
Localização: Curitia-PR
Contato:

Mensagem 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
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem 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.
Irineu
Usuário Nível 2
Usuário Nível 2
Mensagens: 61
Registrado em: 13 Ago 2003 22:01
Localização: Curitia-PR
Contato:

Mensagem por Irineu »

Acho que vc esta comparando variavel errada, não deveria ser (SALDO) no lugar de (mSal_ATU)
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem 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.




:(
Irineu
Usuário Nível 2
Usuário Nível 2
Mensagens: 61
Registrado em: 13 Ago 2003 22:01
Localização: Curitia-PR
Contato:

Mensagem 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.
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem por Gelson »

Ok, já mandei.

Obrigado pela atenção.
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Mensagem 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.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem 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.
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Mensagem 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.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem 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.
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem por Gelson »

Se algum moderador ver esta minha bagunça e puder arrumar fico grato.
Responder