Página 1 de 2
criando relatorio de pesquisa
Enviado: 16 Abr 2005 17:33
por Gelson
Boa tarde, pessoal
Estou tentando criar meu primeiro relatório em clipper coisa simples mas estou apanhando não sei onde. tenho um banco de dados movim(conta,data,ct,dat_lanc,valor) clientes(conta,nome,endereço) preciso que o relatório saia apenas as contas com os nomes dos clientes com o saldo devedor no periodo solicitado.Antes até imprimia só que tudo errado, mas agora de tanto mexer e re-mexer no fonte o papel fica parado perto da cabeça de impressão e não imprime nada, andei pesquisando aqui no site e vi uma serie de tipos de filtragem, confesso que ainda estou meio perdido, se alguém puder me mostar onde estou errando, fico grato. segue abaixo meu fonte (só não reparem a simplicidade do mesmo).
Código: Selecionar todos
*PROGRAMA : CCOP33
*AUTOR : GELSON
*DATA : 04/04/2005
*OBJETIVO : EMITIR RELACAO DE SALDOS DEVEDORES
*
CLEAR
mlinha = 66
mfolha = 1
mtotsal = 0.00
mdat_ini = CTOD(' / / ')
mdata = CTOD(' / / ')
mdatfim = CTOD(' / / ')
mdata = CTOD(' / / ')
mtipo = 0
USE CLIENTES INDEX INCLIENT
SELECT 2
USE MOVIM INDEX IMOVIM
SELECT 3
USE HISTOR INDEX IHISTOR
@12,10 SAY 'INFORME DATA INICIAL:'
@12,34 GET mdat_ini PICTURE '99'
@13,10 SAY 'INFORME DATA FINAL:'
@13,34 GET mdatfim
@14,01 SAY 'INFORME O TIPO:'
@14,21 GET mtipo PICTURE '9'
@14,23 SAY '1 -> CARRETEIRO'
@15,23 SAY '2 -> CLIENTES'
@16,23 SAY '3 -> FUNCIONARIOS'
@17,23 SAY '4 -> TODOS'
@24,11 SAY DAY(DATE())
@24,16 SAY CMONTH(DATE())
@24,25 SAY YEAR(DATE())
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
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
CASE mtipo = 3
IF VAL(CONTA) < 30000
SKIP
LOOP
ENDIF
CASE mtipo = 4
IF VAL(CONTA) < 1 .OR. VAL(CONTA) > 99998
SKIP
LOOP
ENDIF
ENDCASE
SELECT 2
mvalor = 0.00
SEEK CLIENTES->CONTA
DO WHILE CLIENTES->CONTA = CONTA .AND. DATA <= mdatfim;
.AND. .NOT. EOF()
* SET FILTER TO CT = 01 //tentei usar não deu certo
IF CT = 01
mvalor = mvalor + VALOR
ENDIF
SKIP
ENDDO
IF mlinha > 50
@1,10 SAY '** xxxxxxxxxxxxxxxx ** - xxxxxxxxxxx'
@1,65 SAY 'FOLHA'
@1,69 SAY mfolha PICTURE '999'
@2,20 SAY 'RELACAO DE SALDOS DEVEDORES ATE'
SET CENTURY ON
@2,48 SAY mdat_ini
@2,61 SAY mdatfim
SET CENTURY OFF
DO CASE
CASE mtipo = 1
@2,75 SAY 'CARRETEIROS'
CASE mtipo = 2
@2,75 SAY 'CLIENTES'
CASE mtipo = 3
@2,75 SAY 'FUNCIONARIOS'
CASE mtipo = 4
@2,75 SAY 'TODOS'
ENDCASE
@4,4 SAY 'CONTA'
@4,14 SAY 'NOME'
@4,50 say 'SALDO'
mfolha = mfolha + 1
mlinha = 5
ENDIF
SELECT 1
@mlinha,4 SAY CONTA
@mlinha,10 SAY NOME
IF mvalor < 0.00
@mlinha,44 SAY -mvalor PICTURE '9,999,999,999.99D'
mlinha = mlinha + 1
SKIP
ENDIF
ENDDO
@mlinha,35 SAY 'T O T A L = >'
EJECT
SET DEVICE TO SCREEN
SET CONSOLE OFF
SET PRINT ON
?? CHR(27) + '@'
SET PRINT OFF
SET CONSOLE ON
EJECT
USE
CLEAR
RETURN
me desculpem pelas letras em maiúsculo, sei que é falta de educação, tenho que mudar meu fonte.
Rotina de pesquisa
Enviado: 17 Abr 2005 12:13
por marbio
Bom dia!!!
Ainda nao termineio a minha rotina, mas aqui vc pode colar filtro por periodo, com arquivo temporario,
o arquivo CREDITO.DBF -> contas a receber
o arquivo CLIENTE.DBF -> e a onde que sistema pega o codigo para buscar no banco CREDITO.DBF para ficar mais facil.
:xau
Código: Selecionar todos
#include "common.ch"
#include "inkey.ch"
save screen to screen
close all
box3dr2(07,13,41,54)
box3df2(05,20,04,75)
setcolor(cor4)
@03,15 say empresa
@01,05 say 'Usuario.: ' +user
@05,07 say ' Relatorio de Convenios atrazado '
setcolor(cor2)
select 1
if netuse("credito",.f.,10)
set index to cre001, cre002
else
msgab()
return
endif
select 2
if netuse("cliente",.f.,10)
*set index to pro002,pro001, pro003
else
msgab()
return
endif
letragrande(08,07,"AGUARDE",219)
l=1
set device to print
@prow()+00,00 say chr(15)
@prow()+01,00 say '---------------------------------------------------------'
@prow()+01,00 say date()
@prow()+00,30 say time()
@prow()+01,00 say '---------------------------------------------------------'
@prow()+01,13 say chr(15)+chr(14)+'Contas a Receber'
@prow()+01,00 say chr(18)+chr(15)+'---------------------------------------------------------'
@prow()+01,00 say 'Cliente Valor R$'
@prow()+01,00 say '---------------------------------------------------------'
set device to screen
xtotal6=0
do while .t.
select 2
aa=reccount()
select 2
for xx=1 to aa
xcli=codigo
xnome=nome
select 1
set order to 1
seek xcli
prow=1
if found()
xtotal5=0
select 1
set device to print
preco()
set device to screen
endif
select 2
skip
next
set device to print
@prow()+01,01 say 'Total R$' + Transform(xtotal6, "@e 999,999.99")
set device to screen
restore screen
*exit
do rpro001
enddo
************************************
function preco
do while (.T.)
GO TOP
do while (!EOF())
if xcli=codcl
xtotal5+=venda
endif
skip
enddo
@prow()+01,01 say xnome + ' - ' + Transform(xtotal5, "@e 999,999.99")
xtotal6+=xtotal5
if (EOF())
exit
endif
enddo
*do principa
vc pode tirar uma ideia verto
:*
Enviado: 17 Abr 2005 12:17
por Gelson
Pessoal,
Fiz a seguinte mudança no meu fonte aproveitando as dicas deixadas neste forum no topico "filtro por data e codigo"
agora ficou assim :
select 2
mvalor = 0.00
seek clientes
Do while clientes->conta = conta .and. .not. eof()
set filter to CT=001 .and. DATA >=dat_ini .and. DATA <= datfim
mvalor = mvalor + VALOR
só que agora a impressora nem puxa o papel.
de uma olha
Enviado: 17 Abr 2005 12:22
por marbio
Ola Gelson,
Vc deu uma olha no fonte acima, se vc usar o set filter vai ficar muito lento, se vc trabar em rede entao nem si fala,
Em baixo o SET FILTER colocar GO TOP, vc se da certo ok.
:* -:] :xau
Enviado: 17 Abr 2005 12:33
por Gelson
ok, vou testar agora mesmo.
Antes tenho que desligar o micro pois estou usando o XP, e o sistema ainda não esta entrando no XP, tenho que ficar trocando de HD para abrir o sistema.
obrigado pela ajuda, já já eu volto.
Enviado: 17 Abr 2005 12:58
por Gelson
blz, Marbio
Depois que coloquei GO TOP abaixo do set filter, a impressora voltou a dar sinal de vida. Até que o set filter foi rápido
Porém tem algo de errado com meu filtro, foram impressas 12 contas sem saldo nenhum no periodo selecionado, deveria sair apenas uma conta com valor de 950,00,
Na teoria seria assim: data inicial - data final, tipo de cliente (1,2,3..) somando apenas os valores dos respectivos clientes quando o campo CT for exatamente igual a 001, quem não tiver nenhuma movimentação com este codigo no periodo não pode sair no relatório.
Enviado: 17 Abr 2005 16:05
por marbio
Ola Gelson,
Vc deu uma olha na minha rotina eu acho que fica mais faciel, de vc usar de uma olha outra vez, vc nao tera esse tipo de problema.
Pega a funcao que eu fiz, vc tera o seguinte a impresso de todos os cliente, vc melhora a funcao para trabalar em periodo, pode ser indice temporario,
t+
:-Y
Enviado: 17 Abr 2005 16:44
por Gelson
Olá. Marbio blz ?
Eu já vi o seu fonte, não queria confessar mas estou todo perdido nele, não sei se serve como desculpa mas este é meu primeiro relatório até suas linhas de programação são muito mais arrojadas do que as minhas.
tô até envergonhado. :-O Se você tiver alguma apostila maneira ai manda para mim, olhei aqui no site e não achei na net só achei uma peguei e já estou usando.
Quanto ao relatório ainda tento descobrir minha mancada.
obrigado pelo apoio.
Enviado: 17 Abr 2005 19:14
por Toledo
Gelson,
Alterei algumas linhas de comandos no seu fonte, veja as anotações no próprio fonte.
Código: Selecionar todos
*PROGRAMA : CCOP33
*AUTOR : GELSON
*DATA : 04/04/2005
*OBJETIVO : EMITIR RELACAO DE SALDOS DEVEDORES
*
CLEAR
mlinha = 66
mfolha = 1
mtotsal = 0.00
mdat_ini = CTOD(' / / ')
mdata = CTOD(' / / ')
mdatfim = CTOD(' / / ')
mdata = CTOD(' / / ')
mtipo = 0
*** SELECIONAR A AREA DE ABERTURA DO ARQUIVO ***
SELECT 1
USE CLIENTES INDEX INCLIENT
SELECT 2
USE MOVIM INDEX IMOVIM
SELECT 3
USE HISTOR INDEX IHISTOR
@12,10 SAY 'INFORME DATA INICIAL:'
*** A MASCARA PARA DATA E "@D" E NAO "99" ***
@12,34 GET mdat_ini PICTURE '@D'
@13,10 SAY 'INFORME DATA FINAL:'
@13,34 GET mdatfim PICT '@D'
@14,01 SAY 'INFORME O TIPO:'
@14,21 GET mtipo PICTURE '9'
@14,23 SAY '1 -> CARRETEIRO'
@15,23 SAY '2 -> CLIENTES'
@16,23 SAY '3 -> FUNCIONARIOS'
@17,23 SAY '4 -> TODOS'
@24,11 SAY DAY(DATE())
@24,16 SAY CMONTH(DATE())
@24,25 SAY YEAR(DATE())
READ
*** PARA ENVIAR PARA A IMPRESSORA USE APENAS ***
*** OS COMANDOS ABAIXO ***
SET PRINTER TO LPT1
SET DEVICE TO PRINT
?? CHR(27) + CHR(15)
SELECT 1
DO WHILE .NOT. EOF()
IF CONTA = '99998'
SKIP
LOOP
ENDIF
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
CASE mtipo = 3
IF VAL(CONTA) < 30000
SKIP
LOOP
ENDIF
CASE mtipo = 4
IF VAL(CONTA) < 1 .OR. VAL(CONTA) > 99998
SKIP
LOOP
ENDIF
ENDCASE
SELECT 2
mvalor = 0.00
*** O CORRETO AQUI SERIA DAR UM SEEK NA CONTA E ***
*** DATA INICIAL INFORMADA, MAS PRA ISTO, VOCE TEM ***
*** QUE CRIAR UM INDICE CUJO CAMPOS CHAVES SEJAM ***
*** CONTA+DTOS(DATA). ***
SEEK CLIENTES->CONTA
DO WHILE CLIENTES->CONTA = CONTA .AND. !EOF()
IF CT = 01 .AND. (DATA >=mdat_ini .AND. DATA <= mdatfim)
mvalor = mvalor + VALOR
ENDIF
SKIP
ENDDO
IF mlinha > 50
@1,10 SAY '** xxxxxxxxxxxxxxxx ** - xxxxxxxxxxx'
@1,65 SAY 'FOLHA'
@1,69 SAY mfolha PICTURE '999'
@2,20 SAY 'RELACAO DE SALDOS DEVEDORES ATE'
SET CENTURY ON
@2,48 SAY mdat_ini
@2,61 SAY mdatfim
SET CENTURY OFF
DO CASE
CASE mtipo = 1
@2,75 SAY 'CARRETEIROS'
CASE mtipo = 2
@2,75 SAY 'CLIENTES'
CASE mtipo = 3
@2,75 SAY 'FUNCIONARIOS'
CASE mtipo = 4
@2,75 SAY 'TODOS'
ENDCASE
@4,4 SAY 'CONTA'
@4,14 SAY 'NOME'
@4,50 say 'SALDO'
mfolha = mfolha + 1
mlinha = 5
ENDIF
SELECT 1
@mlinha,4 SAY CONTA
@mlinha,10 SAY NOME
IF mvalor < 0.00
@mlinha,44 SAY -mvalor PICTURE '9,999,999,999.99D'
mlinha = mlinha + 1
*** ESTE SKIP TEM QUE ESTAR FORA DO ENDIF ***
* SKIP
ENDIF
SKIP
ENDDO
@mlinha,35 SAY 'T O T A L = >'
EJECT
?? CHR(27) + '@'
SET PRINTER TO
SET DEVICE TO SCREEN
*** PARA FECHAR TODOS OS ARQUIVOS ***
*** VOCE DEVE USAR O CLOSE DATABASES ***
CLOSE DATA
CLEAR
RETURN
Caso no arquivo MOVIM você crie um novo arquivo de índice com os campos chaves CONTA+DTOS(DATA), selecione este novo índice na abertura do arquivo MOVIM e altere o seu fonte da seguinte maneira:
Procure as seguintes linhas no seu fonte:
Código: Selecionar todos
SEEK CLIENTES->CONTA
DO WHILE CLIENTES->CONTA = CONTA .AND. !EOF()
IF CT = 01 .AND. (DATA >=mdat_ini .AND. DATA <= mdatfim)
e troque por:
Código: Selecionar todos
SET SOFTSEEK ON
SEEK CLIENTES->CONTA+DTOS(mdat_ini)
SET SOFTSEEK OFF
DO WHILE CLIENTES->CONTA = CONTA .AND. DATA <= mdatfim;
.AND. !EOF()
IF CT = 01
Abraços,
Enviado: 18 Abr 2005 00:03
por Gelson
Boa noite, Toledo - blz ?
Fiz as alterações e cirei um arquivo de indice contadat com os campos chaves CONTA+DTOS(DATA), o select 2 ficou assim:
use movim index contadat
Porém na impressão ainda sae errado deveria sair apenas a conta 30300 com saldo de 950,00, não está saindo nenhum saldo e o nome, a conta e total geral estão sendo impresso na mesma linha, um emcima do outro, nem dá pra ler, não sei se tem algo ha ver mas estou usando uma impressora Apollo (jato de tinta).
Enviado: 18 Abr 2005 07:31
por Toledo
Gelson,
Estou com uma dúvida, no seu fonte original você está somando o campo VALOR do arquivo MOVIM em uma variável mvalor (
mvalor = mvalor + VALOR), e depois você verifica se mvalor é menor que ZERO (
IF mvalor < 0.00) para fazer a impressão. Minha dúvida é a seguinte: neste campo VALOR você grava valores menor que zero?
Se sim, use então este fonte:
Código: Selecionar todos
*PROGRAMA : CCOP33
*AUTOR : GELSON
*DATA : 04/04/2005
*OBJETIVO : EMITIR RELACAO DE SALDOS DEVEDORES
*
CLEAR
mlinha = 66
mfolha = 1
mtotsal = 0.00
mdat_ini = CTOD(' / / ')
mdata = CTOD(' / / ')
mdatfim = CTOD(' / / ')
mdata = CTOD(' / / ')
mtipo = 0
SELECT 1
USE CLIENTES INDEX INCLIENT
SELECT 2
USE MOVIM INDEX CONTADAT
SELECT 3
USE HISTOR INDEX IHISTOR
@12,10 SAY 'INFORME DATA INICIAL:'
@12,34 GET mdat_ini PICTURE '@D'
@13,10 SAY 'INFORME DATA FINAL:'
@13,34 GET mdatfim PICT '@D'
@14,01 SAY 'INFORME O TIPO:'
@14,21 GET mtipo PICTURE '9'
@14,23 SAY '1 -> CARRETEIRO'
@15,23 SAY '2 -> CLIENTES'
@16,23 SAY '3 -> FUNCIONARIOS'
@17,23 SAY '4 -> TODOS'
@24,11 SAY DAY(DATE())
@24,16 SAY CMONTH(DATE())
@24,25 SAY YEAR(DATE())
READ
SET PRINTER TO LPT1
SET DEVICE TO PRINT
?? CHR(27) + CHR(15)
SELECT 1
DO WHILE .NOT. EOF()
IF CONTA = '99998'
SKIP
LOOP
ENDIF
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
CASE mtipo = 3
IF VAL(CONTA) < 30000
SKIP
LOOP
ENDIF
CASE mtipo = 4
IF VAL(CONTA) < 1 .OR. VAL(CONTA) > 99998
SKIP
LOOP
ENDIF
ENDCASE
SELECT 2
*** VAMOS PARA O INICIO DO ARQUIVO ***
GO TOP
mvalor = 0.00
SET SOFTSEEK ON
SEEK CLIENTES->CONTA+DTOS(mdat_ini)
SET SOFTSEEK OFF
DO WHILE CLIENTES->CONTA = CONTA .AND. DATA <= mdatfim;
.AND. !EOF()
IF CT = 01
mvalor = mvalor + VALOR
ENDIF
SKIP
ENDDO
*** VAMOS SELECIONAR O ARQUIVO CLIENTES ***
SELECT 1
*** SE mvalor FOR MENOR QUE ZERO ***
*** VAMOS IMPRIMIR ***
IF mvalor < 0
IF mlinha > 50
@1,10 SAY '** xxxxxxxxxxxxxxxx ** - xxxxxxxxxxx'
@1,65 SAY 'FOLHA'
@1,69 SAY mfolha PICTURE '999'
@2,20 SAY 'RELACAO DE SALDOS DEVEDORES ATE'
SET CENTURY ON
@2,48 SAY mdat_ini
@2,61 SAY mdatfim
SET CENTURY OFF
DO CASE
CASE mtipo = 1
@2,75 SAY 'CARRETEIROS'
CASE mtipo = 2
@2,75 SAY 'CLIENTES'
CASE mtipo = 3
@2,75 SAY 'FUNCIONARIOS'
CASE mtipo = 4
@2,75 SAY 'TODOS'
ENDCASE
@4,4 SAY 'CONTA'
@4,14 SAY 'NOME'
@4,50 say 'SALDO'
mfolha = mfolha + 1
mlinha = 5
ENDIF
@mlinha,4 SAY CONTA
@mlinha,10 SAY NOME
@mlinha,44 SAY -mvalor PICTURE '9,999,999,999.99D'
mlinha = mlinha + 1
ENDIF
SKIP
ENDDO
@mlinha,35 SAY 'T O T A L = >'
EJECT
?? CHR(27) + '@'
SET PRINTER TO
SET DEVICE TO SCREEN
CLOSE DATA
CLEAR
RETURN
Obs.: no seu código original, você imprime a conta e o nome do cliente antes de saber se o mvalor é menor que zero; a soma da variável mlinha é feita apenas se o mvalor é menor que zero. Por este motivo que a impressão era feita uma sobre a outra... todos os clientes que tiverem valores maiores que zero, serão impresso um sobre o outro... sua impressora não tem nada a ver com isto.
Abraços,
Enviado: 18 Abr 2005 08:33
por Gelson
Bom dia , Toledo
Eu errei o correto é: IF mvalor > 0.00 ( tem que sair apena os saldo maiores que zero.)
Já mudei meu fonte e daqui a pouco post os resultados.
Obrigado mais um vez.
Enviado: 18 Abr 2005 09:09
por Gelson
Olá, Toledo,
Mudei para:
IF mvalor > 0.00
@mlinha,44 SAY -mvalor PICTURE '9,999,999,999.99D'
mlinha = mlinha + 1
ELSE **** ACRESCENTEI***
SKIP **** ACRESCENTEI***
ENDIF
Esta saindo o saldo correto, porém esta sendo impresso a mesma coisa várias vezes.
Enviado: 18 Abr 2005 10:52
por Gelson
Olá, Toledo
Re-lendo seu post anterior vi que você já respondeu minha dúvida, alterei de acordo com seu post e deu tudo certinho...
Fico muitissimo grato a você e a todos os outros colegas pela ajuda.

)
um abraço.
Enviado: 18 Abr 2005 10:56
por Toledo
Gelson,
Utilize o fonte que eu alterei na minha mensagem anterior e faça a seguinte modificação:
Procure:
e troque por:
Abraços,