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

Mensagem por Gelson »

Bem pessoal,

Com relação ao "remendo" no relatório de saldos devedores, descobri meu erro.

Eu estava usando : mSal_ATU = SAL_INI + mvalor + mSAL_ACERTO , sendo que o correto é :


SELECT 1
mSAL_ACERTO = 0.00
mSAL_ATU = SAL_INI + mvalor + SAL_ACERTO

Quanto a impressão dos saldos zerados, ainda continuo tentando..
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, pessoal

Ápos resolver a duras penas o problema do relatório anterios, no qual havia a necessidade de um “remendo”
no saldo de uma conta em especifico, continuo na peleja com meu relatório de saldo devedores.

Gostaria de tirar uma dúvida, a única coisa que creio eu possa estar fazendo com que saia valores zerados no meu relatório seja meu indice (incliente.ntx)

no meu relatório uso o banco da dados chamado clientes com a seguinte estrutura:

conta......C
nome......C
endereco.......C
cidade......C
tipo........C
cnpjcpf.......N
folha.........N
Sal_INI......N
Dat_INI......date
Sal_ATU......N
Dat_ATU......date
Sal_ATU2......N
Desativada......C
Sal_Acerto.....N

Uso um indice chamado incliente.ntx com key = nome; e outro arquivo chamado movim.dbf ( os campos : conta,ct,doc,data,dat_lanc,valor) com um indice imovim.ntx com e key = conta + str(year(data),4) + str(month(data),2) + str(day(data),2) é nele que ficam os lançamentos diários dos clientes cadastrados no banco de dados clientes.

Mudei meu indice incliente.ntx para : Key = nome+str(SAL_ATU) e continua sendo impresso os clientes com saldo zerado.
Já li e re-li a apostila que peguei aqui no site, mas não estou conseguindo descobrir onde estou errando.

Este meu indice está correto ?

Estou pedindo para indexar pelo nome e pelo valor do saldo atual e no meu fonte peço p/ que sejam impressos apenas os clientes com saldo > 0.

Código: Selecionar todos

*PROGRAMA :   CCOP19
*AUTOR    :   GVL
*DATA     :   01/12/2005
*OBJETIVO :   EMITIR RELACAO DE SALDOS DEVEDORES
*
SET DATE BRITI
SET CENTURY ON
SET EPOC TO 1990
CLEAR
mlinha = 66
mfolha = 1
mtotsal = 0.00
mdata   = CTOD('  /  /  ')
mtipo   = 0
sele 1
USE CLIENTES INDEX INCLIENT
SELECT 2
USE MOVIM INDEX IMOVIM
do while .t.
   @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
   if lastkey() == 27
      exit
   endif
   m_op := [ ]
   @ 24,5 say [Confirma ? ] get m_op pict [!] valid(m_op$"SN")
   read
   if m_op == [S]
      ipr1(mdata,mtipo)
      exit
   endif
enddo
SET CENTU OFF
CLOSE ALL
return

*----------------------------------------------------
function ipr1(mdta,mtpo)
local filtro := ""
if mtpo == 1
   filtro := [CONTA >= "]+"00001"+[" .AND. CONTA <= "]+"19999"+["]
   m_texto := "CARRETEIROS"
elseif mtpo == 2
   filtro := [CONTA >= "]+"20000"+[" .AND. CONTA <= "]+"29999"+["]
   m_texto := "CLIENTES"
else
   filtro := [CONTA >= "]+"30000"+[" .AND. CONTA < "]+"99998"+["]
   m_texto := "FUNCIONARIOS"
endif
sele 1  
set filter to &filtro
goto top
SET CONSOLE OFF
set device to print
SET PRINT ON
?? CHR(27) + CHR(15)
DO WHILE .NOT. EOF()
 SELECT 2
 mvalor = 0.00 
 SEEK CLIENTES->CONTA
 DO WHILE CLIENTES->CONTA = CONTA .AND. .NOT. EOF()
  IF DATA <=  mdta
     IF CT < 10
         mvalor = mvalor - VALOR
     ELSE
         mvalor = mvalor + VALOR
     ENDIF
  ENDIF
  SKIP
 ENDDO
 SELECT 1
 mSAL_ATU := SAL_INI + mvalor 
 IF mSAL_ATU > 0
    IF mlinha > 50
       @1,10 SAY '** RELATORIO **  -  CONTA CORRENTE'
       @1,65 SAY 'FOLHA'
       @1,69 SAY mfolha PICTURE '999'
       @2,20 SAY 'RELACAO DE SALDOS DEVEDORES ATE '+DTOC(mdta)
       @2,75 SAY m_texto
       @4,4  SAY 'CONTA'
       @4,14 SAY 'NOME'
       @4,50 SAY 'TIPO'
       @4,86 SAY 'SALDO'
       mfolha++
       mlinha = 5
    ENDIF
    @mlinha,4   SAY CONTA
    @mlinha,10  SAY NOME
    @mlinha,44  SAY TIPO
    @mlinha,82  SAY mSAL_ATU PICTURE '@E 9,999,999,999.99'
    mlinha++
    mtotsal := mtotsal + mSAL_ATU
 ENDIF
 SKIP
ENDDO
@mlinha,35 SAY 'T O T A L    = >'
@mlinha,82 SAY mtotsal PICTURE '9,999,999,999.99D'
?? CHR(27) + '@'     
EJECT
SET DEVICE TO SCREEN
SET PRINT TO
SET PRINT OFF
SET PRINT ON
RETURN
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Como postado por um colega forense anteriormente voce deve modificar o IF variavel > 0.00 para if variavel > 0.

Se voce realemten deseja tirar da apresentacao os calores zerados e/ou negativos tente usar um SET FILTER apos a abertura do banco de dados.

SET FILTER TO variavel/campo > 0

Ira filtrar todos os valores maiores que zero.

Em suas criticas voce deve usar

If variavel/campo <= > 0
skip
loop
endif

Voce podera também idexar o seu arquivo retirando os valores zerados da amostra.

INDEX ON campo TO indice FOR campo > 0

Nao use 0.00, pois como foi dito 0 não é igual a 0.00.

@braços :?)
Se voce usar o seu comando de critica como
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, Rocinha e amigos do forum

Bem desde o dia 08 quando viu sua resposta estou tentado resolver o problema deste relatório. Fiz conforme abaixo,

*** testes com o selt filter ****

SELECT 1 (( banco de dados clientes ))
Usando um indice ntx (( chamado -> incliente)) que é indexado pelo NOME

set filter to mSAL_ATU/SAL_ATU >0
mSAL_ACERTO = 0.00
mSAL_ATU = SAL_INI + mvalor
IF mSAL_ATU/SAL_ATU >0
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'

Foram impressos valores : -160,00, -258,00 e 690,00

Usando :

Set Filter to SAL_ATU >0
..
..
If SAL_ATU > 0

Foi impresso apenas valor : -160,00

Usando :

Set Filter to mSAL_ATU >0
..
..
If mSAL_ATU > 0

Foi impresso : apenas uma conta com valor = 0.00

Usando

Set Filter to SAL_ATU >0
..
..
If SAL_ATU < 0

Foram impressos : 05 contas com valores negativos e uma zerada.

Usando

Set Filter to mSAL_ATU >0
..
..
If mSAL_ATU < 0

Foram impressos 04 contas com valores negativos.

Usando

Set Filter to mSAL_ATU/SAL_ATU >0
..
..
If mSAL_ATU/SAL_ATU < 0

Foram impressos 03 contas, sendo duas com valores negativos e 01 com valor positivo.

Usar o indice seria bem mais fácil, porém uso indices ntx, e pesquisando aqui no site descobri que indices ntx não funcionam com clausulas condicionais. Tenho intenção de mudar meus indices para cdx, mas quando terminar de migrar para o harbour.
A não ser que tenha como usar os dois indices no programa, ai eu poderia criar um indice cdx apenas para liberar este relatório.

Olhando os retornos impressos não vejo nenhuma lógica, pois sendo > ou < saem valores + e -.
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem por Gelson »

Pessoal,

Mudei meus indices para cdx, já que aceitam clausulas condicionais, e tem outras
Vantagens que não vou mencionar aqui para não gerar nenhuma discução.


Código: Selecionar todos

FUNCTION CCOP34()

 run del c:\contacor\*.CDX
 select 1
 use movim
  if !file ("CONTADAT.CDX")
  if !file ("IMOVCON.CDX")  .or. !file ("IMOVDOC.CDX")
  if !file ("IMOVIM.CDX")
  index on CONTA+DTOS(DATA) TAG indice1 TO CONTADAT
  index on CONTA+STR(CT,3)  TAG indice1 TO IMOVCON
  index on STR(YEAR(DAT_LANC),4) + STR(MONTH(DAT_LANC),2) + STR(DAY(DAT_LANC),2) + DOC TAG indice1 TO IMOVDOC
  index on CONTA + STR(YEAR(DATA),4) + STR(MONTH(DATA),2) + STR(DAY(DATA),2) TAG indice1 TO IMOVIM


  select 2
  use clientes
  if !file ("ICLIENTE.CDX") .or. !file ("INCLIENT.CDX")
  if !file ("INCLIENT_SAL_ATU.CDX")
  index on CONTA TAG indice1 TO ICLIENTE
  index on NOME  TAG indice1 TO INCLIENT
  index on CONTA + STR(SAL_ATU,14,2) + STR(SAL_INI,14,2) TAG indice1 TO SAL_ATU FOR  SAL_ATU >0index on CONTA + STR(SAL_ATU,14,2) + STR(SAL_INI,14,2) TAG indice1 TO SAL_ATU FOR  SAL_ATU >0  

  select 3
  use histor
  if !file ("HISTOR.CDX") 
  index on CT TAG indice1 TO IHISTOR

 endif
  endif
   endif  
    endif   
     endif   
     endif
CLEAR
RETURN NIL
Todos os indices estão funcionando, sei que vão pensar porque ele não usou sub-indices, bem ainda não estou preparado para isto. mais a frente faço isto. A proveitei o mudei meu executável para 32bits minha compilação com o harbou esta um pouco dramatica devido aos arquivos .rc e .res que pelo que me disseram são arquivos de icones, porém não uso este tipo de aplicação em meu programa, com isto por hora estou usando o mymake,.bem esta é outra questão é vou coloca-la no lugar certo.

A questão é a seguinte:

Quero saber como gerar um indices usando informacões de dois banco de dados. no meu caso clientes.dbf e movim.dbf,
Isto porque meu relatório usa informações destes dois arquivos.

Seria clientes : conta+Sal_ATU+SAl_INI e
Movim : valor

Preciso juntar tudo e criar um indice cdx.

Obrigado a todos pela ajuda até aqui.
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem por Gelson »

Só uma correção este meu ultimo indice no select 2 é :

index on CONTA + STR(SAL_ATU,14,2) + STR(SAL_INI,14,2) TAG indice1 TO SAL_ATU FOR SAL_ATU >0

ficou bagunçado nahora de copiare colar.

até breve.
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, amigos do forum

Tentei criar um indice temporário mas não tive sucesso com isso voltei para meus ntx Se algum puder gostaria de um exemplo de filtragem de dados para uma variável de memória, que é resultado da soma de dois campos pertencentes a bancos diferentes. Quero que seje impresso somente os SAL_ATU maiores que zero.

Select 1 // abre banco clientes que possue o campo Sal_INI

Select 2 // abre o banco movim que possue o campo Valor

MSAL_ATU = 0 // variável de memória
mvalor =0 // encontra-se no banco movim

mSAL_ATU = SAL_INI + valor

..
...
....
SELECT 1
mSAL_ATU = SAL_INI + mvalor
set filter to mSAL_ATU > 0 { Não funciona }
IF mSAL_ATU > 0
SKIP
LOOP
ENDIF
..
...
....
Avatar do usuário
digitom
Usuário Nível 2
Usuário Nível 2
Mensagens: 93
Registrado em: 06 Abr 2006 13:52
Localização: Anápolis-Go
Contato:

Mensagem por digitom »

Você já experimentou usar o DEBUG ?

Com ele você poderá testar sua variavel mSAL_ATU
Fui :)
Gelson
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 16 Abr 2005 17:04

Mensagem por Gelson »

Boa tarde, Digitom

Peguei as orientações aqui no forum de como usar o CLD, já compilei os prg's só que não tenho o CLD.exe

Vc tem ele ai, tem como me mandar por e-mail ?

obrigado por sua atenção.
Responder