Ajuda com relatorio

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

paulinho
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 21 Jul 2005 20:00

Ajuda com relatorio

Mensagem por paulinho »

Olá pessoal, saudações a todos, sou novo no forum, e novato em clipper, to com um problema, tenho um relatorio que precisa ser organizado pelo nome so que nao estou tendo exito, sera que alguem poderia me ajudar? vai abaixo o meu fonte. Agradeço a todos mesmo, obrigado.


O problema que acontece que o nome dos clientes sai em branco.

set date brit
set talk off
set echo off
clea
UNLOCK ALL
CLOSE DATA
*---------------- VARIAVEIS DE MEMORIA ---------------------------------*
VMACAO = " "
VMOPCA = " "
VMPAGI := VMLINH := VMEXIT := 0
VMSIST = "COBRANCA"
*---------------- DEFINICAO DE ARQUIVOS --------------------------------*
IF .NOT. NET_USE("DEVCAD",.F.,5,,.T.,.T.,"DBFNTX")
RETURN
ENDIF
VMDEVCAD := SELECT()
SET INDEX TO DEVCAD1

IF .NOT. NET_USE("CADDEV",.F.,5,,.T.,.T.,"DBFNTX")
RETURN
ENDIF
VMCADDEV := SELECT()
SET INDEX TO CADDEV1

IF .NOT. NET_USE("CADLCT",.F.,5,,.T.,.T.,"DBFNTX")
RETURN
ENDIF
VMCADLCT := SELECT()
SET INDEX TO CADLCT1

IF .NOT. NET_USE("CADCLI",.F.,5,,.T.,.T.,"DBFNTX")
RETURN
ENDIF
VMCADCLI := SELECT()
SET INDEX TO CADCLI1, CADCLI2

IF .NOT. NET_USE("DESMEM",.F.,5,,.T.,.T.,"DBFNTX")
RETURN
ENDIF
VMDESMEM := SELECT()
SET INDEX TO DESMEM5

IF .NOT. NET_USE("CADREC",.F.,5,,.T.,.T.,"DBFNTX")
RETURN
ENDIF
VMCADREC := SELECT()
SET INDEX TO CADREC2

*------------------ EXECUCAO DO PROGRAMA ---------------------------------
DO WHILE .T.
VMDTIN = CTOD(" / / ")
VMDTFI = DATE()
FRAME(07,04,11,31,"CD")
@ 08,06 SAY "Data Inicial.:" GET VMDTIN PICT "99/99/99"
@ 10,06 SAY "Data Final...:" GET VMDTFI PICT "99/99/99"
READ
IF VMDTFI < VMDTIN
CONSIS("Data Final Menor Que a Inicial. Tecle [ENTER]")
LOOP
ENDIF
IF LASTKEY() = 27
UNLOCK ALL
CLOSE DATA
EXIT
ENDIF
VMPERI = "PERIODO DE.: "+DTOC(VMDTIN)+" A "+DTOC(VMDTFI)
VMCLIE = "00000"
FRAME(12,05,14,70,"CD")
@ 13,07 SAY "Cliente..:" GET VMCLIE PICT "99999"
READ
SELECT(VMCADCLI)
IF EMPTY(VMCLIE)
PROCURA(VMCLIE,"SITU=' '",VMCADCLI,"CL_CLIE+' '+CL_FANT",09,12)
IF VMLASTK = 1
LOOP
ENDIF
VMCLIE = CL_CLIE
ENDIF
IF .NOT. DBSEEK(" "+VMCLIE)
CONSIS("Cliente Inexistente ou Incorreto. Tecle [ENTER]")
LOOP
ENDIF
@ 13,18 SAY CL_CLIE+"-"+TRIM(CL_FANT) COLOR "G+"
VMEMPR = "CLIENTE.: "+TRIM(CL_NOME)
VMEMP1 := TRIM(CL_FANT)
VMEMP = CL_FANT
VMTIPO = " "
@ 23,03 SAY "Pagamentos [L]oja ou [A]cc? [L/A].:" GET VMTIPO PICT "!" VALID VMTIPO$"LA"
READ
@ 23,03 SAY SPACE(75)
@ 23,03 SAY "Continua? [S/N]" GET VMOPCA PICT "!"
READ
IF VMOPCA # "S"
UNLOCK ALL
CLOSE DATA
EXIT
ENDIF
SELECT(VMDESMEM)
SET FILTER TO SITU = " " .AND. DE_DTBX >= VMDTIN .AND. DE_DTBX <= VMDTFI .AND. DE_CLIE = VMCLIE
GO TOP
IF EOF()
UNLOCK ALL
CLOSE DATA
EXIT
ENDIF
IF NOTPRINT()
SET CONSOLE OFF
SET PRINT ON
ENDIF
VMTOT1 := VMTOT2 := VMTOT3 := VMTOT4 := VMTOT5 := 0
VMTTL1 := VMTTL2 := VMTTL3 := VMTTL4 := VMTTL5 := 0
DO WHILE .NOT. EOF()
IF IMPRES()
VMEXIT = 1
EXIT
ENDIF
IF DE_SITU # "4" .AND. DE_SITU # "6"
SKIP
LOOP
ENDIF
IF DE_CAPI = 0
SKIP
LOOP
ENDIF
VMPROC = DE_PROC
VMDTPG = DTOC(DE_DTBX)
VMCAPI = TRANSF(DE_CAPI,"@E 99,999.99")
VMJURO = TRANSF(DE_JURO+DE_VACC,"@E 9,999.99")
VMTOTA = TRANSF(DE_CAPI+DE_JURO+DE_VACC,"@E 99,999.99")
VMCOMI = TRANSF(DE_VACC,"@E 9,999.99")
VMREPA = TRANSF(DE_CAPI+DE_JURO+DE_VACC-DE_VACC,"@E 9,999.99")
VMRECI = DE_RECI
VMLOCA = " "
VMCOBR = DE_COBR
IF DE_COBR = "0002" .AND. VMTIPO = "L"
VMLOCA = "-Lj"
VMREPA = TRANSF(0,"@E 9,999.99")
VMTTL1 += DE_CAPI
VMTTL2 += DE_JURO+DE_VACC
VMTTL3 += DE_CAPI+DE_JURO+DE_VACC
VMTTL4 += DE_VACC
VMTTL5 += DE_CAPI+DE_JURO+DE_VACC-DE_VACC
ELSEIF DE_COBR # "0002" .AND. VMTIPO = "A"
VMTOT1 += DE_CAPI
VMTOT2 += DE_JURO+DE_VACC
VMTOT3 += DE_CAPI+DE_JURO+DE_VACC
VMTOT4 += DE_VACC
VMTOT5 += DE_CAPI+DE_JURO+DE_VACC-DE_VACC
ELSE
SKIP
LOOP
ENDIF

IF DE_SITU = "4"
VMPOSI = "Pc"+VMLOCA
ELSE
VMPOSI = "Tt"+VMLOCA
ENDIF
SELECT(VMCADREC)
IF DBSEEK(VMRECI)
VMPLAN = RC_PLAN
VMDTVC = DTOC(RC_VCTO)
ELSE
SELECT(VMDESMEM)
VMPLAN = SUBS(DE_PLAN,1,2)
VMDTVC = DTOC(DE_VCTO)
ENDIF
SELECT(VMDEVCAD)
DBSEEK(" "+VMPROC)
VMDEVE = DV_DEVE
VMDOCU = DV_NUDO
VMPARC = SUBSTR(DV_PARC,3,4)
* VMPLAN = VMPARC
* VMPLAN = VMULTP
VMPRIM = VAL(SUBS(DV_PARC,1,2))-1
VMVALO = 0
SELECT(VMCADLCT)
IF DBSEEK(" "+VMPROC+"01")
IF LC_POSI = " "
VMPRIM++
ENDIF
VMVALO = LC_VALO
* VMDTVC = LC_DATA
DO WHILE SITU+LC_PROC = " "+VMPROC
IF LC_POSI = " "
EXIT
ENDIF
VMVALO = LC_VALO
* VMDTVC = DTOC(LC_DATA)
VMPRIM++
SKIP
ENDDO
ENDIF
* VMDTVC = DTOC(VMDTVC)
VMUNIT = TRANSF(VMVALO,"@E 99,999.99")
VMPRIM = STRZERO(VMPRIM,2)
* VMPLAN = VMPRIM+VMULTP
SELECT(VMCADDEV)
DBSEEK(" "+VMDEVE)
VMNOME = SUBS(DV_NOME,1,20)
IF VMLINH > 35 .OR. VMLINH = 0
VMLINH = 0
VMPAGI++
CABEC3("P20310",VMPAGI,DATE(),80,VMSIST,"BORDERO DE PRESTACAO DE CONTAS")
? CHR(14)+CHR(15)+PADC(VMEMPR,67)+CHR(18)+CHR(20)
? CHR(14)+CHR(15)+PADC(VMEMP1,67)+CHR(18)+CHR(20)
? CHR(14)+CHR(15)+PADC(VMPERI,67)+CHR(18)+CHR(20)
? REPLIC("=",79)
? CHR(15)+"DOCUMENTO CLIENTE PP/PL DT. VCTO VLR PARC. DT. PGTO CAPITAL JR+MULTA TOTAL PG COMISSAO REPASSE POSICAO"+CHR(18)
* xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxx0xxxxxxxxx0 xx/xx xx/xx/xx xx.xxx.xx xx/xx/xx xx.xxx.xx x.xxx.xx xx.xxx.xx x.xxx.xx x.xxx.xx
? REPLIC("=",79)
ENDIF
VMLINH++
? CHR(15)+VMDOCU+" "+VMNOME+" "+SUBSTR(VMPLAN,1,2)+"/"+VMPARC+" "+VMDTVC+" "+VMUNIT+" "+VMDTPG+" "+VMCAPI+" "+VMJURO+" "+VMTOTA+" "+VMCOMI+" "+VMREPA+" "+VMPOSI+CHR(18)
SELECT(VMDESMEM)
SKIP
IF EOF() .AND. VMLINH < 35
VMSPAC = " "
DO WHILE VMLINH < 35
? VMSPAC+"##"
VMSPAC = VMSPAC+" "
VMLINH++
ENDDO
ENDIF
ENDDO
IF VMLINH < 35
VMSPAC = " "
DO WHILE VMLINH < 35
? VMSPAC+"##"
VMSPAC = VMSPAC+" "
VMLINH++
ENDDO
ENDIF
VMTL1 = TRANSF(VMTTL1,"@E 99,999.99")
VMTL2 = TRANSF(VMTTL2,"@E 9,999.99")
VMTL3 = TRANSF(VMTTL3,"@E 99,999.99")
VMTL4 = TRANSF(VMTTL4,"@E 9,999.99")
* VMTL5 = TRANSF(VMTTL5,"@E 9,999.99")
VMTL5 = TRANSF(0,"@E 9,999.99")

VMTT1 = TRANSF(VMTOT1,"@E 99,999.99")
VMTT2 = TRANSF(VMTOT2,"@E 9,999.99")
VMTT3 = TRANSF(VMTOT3,"@E 99,999.99")
VMTT4 = TRANSF(VMTOT4,"@E 9,999.99")
VMTT5 = TRANSF(VMTOT5,"@E 9,999.99")
VMTT = TRANSF(VMTOT5-VMTTL4,"@E 9,999.99")
?
IF VMTIPO = "L"
? CHR(15)+SPACE(61)+"Total LOJA..: "+VMTL1+" "+VMTL2+" "+VMTL3+" "+VMTL4+" "+VMTL5+CHR(18)
ELSE
? CHR(15)+SPACE(61)+"Total ACC...: "+VMTT1+" "+VMTT2+" "+VMTT3+" "+VMTT4+" "+VMTT5+CHR(18)
ENDIF
?
? CHR(15)+VMEMP+CHR(18)+SPACE(12)+""
?
FINAL()
IF VMEXIT = 1
? "**** RELATORIO INTERROMPIDO ****"
ELSE
? "**** FIM DE RELATORIO ****"
ENDIF
SET PRINT OFF
SET CONSOLE ON
UNLOCK ALL
CLOSE DATA
EXIT
ENDDO
RETURN
Editado pela última vez por paulinho em 22 Jul 2005 11:09, em um total de 1 vez.
paulinho
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 21 Jul 2005 20:00

Ninguem??

Mensagem por paulinho »

e ai pessoal ninguem pode ajudar??? :( :(
Avatar do usuário
Daniel
Usuário Nível 3
Usuário Nível 3
Mensagens: 373
Registrado em: 13 Ago 2003 22:42
Localização: Apucarana - PR

Mensagem por Daniel »

Olhe se esta sendo encontrado o cliente aki

VMPRIM = STRZERO(VMPRIM,2)
* VMPLAN = VMPRIM+VMULTP
SELECT(VMCADDEV)
DBSEEK(" "+VMDEVE)
If eof()
@ 24, 10 Say "cliente nao encontrado"
Endif
VMNOME = SUBS(DV_NOME,1,20)
Daniel

Harbour + Minigui + dbfcdx
Marinas-Gui Pena que parou o suporte
paulinho
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 21 Jul 2005 20:00

Cliente

Mensagem por paulinho »

caro daniel, ele encontra o cliente e passa pra frente, o relatorio chega a ser impresso, so que quando mudo o indexador pra index dv_nome to nome la no caddev, ele sai em branco, o relatorio funciona so nao funciona a ordem la
paulinho
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 21 Jul 2005 20:00

nada ainda

Mensagem por paulinho »

e ai pessoal, nao ta indo mesmo, se alguem puder ajudar :( :(
Avatar do usuário
Daniel
Usuário Nível 3
Usuário Nível 3
Mensagens: 373
Registrado em: 13 Ago 2003 22:42
Localização: Apucarana - PR

Mensagem por Daniel »

tente colocar Go top antes do select pois eu acho que na segunda roldada eles nao esta achando os arquivos,
menos neste SELECT(VMDESMEM)
Daniel

Harbour + Minigui + dbfcdx
Marinas-Gui Pena que parou o suporte
paulinho
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 21 Jul 2005 20:00

Caro daniel,

Mensagem por paulinho »

Salve sua ajuda, mas cara aonde coloco o go top, porque tipo agora parece que ele arrumou mas coloquei antes DOS selects s oque agora ele ta travando e reduplicando os registros, obrigado pela sua atencao
paulinho
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 21 Jul 2005 20:00

Problema

Mensagem por paulinho »

E pessoal ta dificil, nao obtive exito, ate reescrevi o relatorio, mas nao ta indo, o bendito indice nao funfa. :(
paulinho
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 21 Jul 2005 20:00

Re: Problema

Mensagem por paulinho »

paulinho escreveu:E pessoal ta dificil, nao obtive exito, ate reescrevi o relatorio, mas nao ta indo, o bendito indice nao funfa. :(
Paul66
Usuário Nível 1
Usuário Nível 1
Mensagens: 19
Registrado em: 25 Dez 2003 21:58

Mensagem por Paul66 »

Paulinho,

Coloque aqui, somente a parte da rotina que deveria encontrar o NOME.

Vou dar uma dica que uso e costuma funcionar: Vá tomar um café, ouvir música, dar uma volta na quadra, enfim se deligue um pouco do programa.

Qdo voltar, preste atenção se vc não trocou nenhuma variável

Posso até falar algumas asneiras aqui, mas talvez elas tirem vc do loop vicioso do pensamento:

- Vc tem CADdev e devCAD pode ter trocado variáveis;
- Vc usou SET FILTER: dê um GO TOP;
- Desligue o SET FILTER;

Outra dica valiosa: use o CLD.EXE para verificar o que seu prog está fazendo. Tem um tópico fixo aqui no fórum sobre o uso dele. O Envolver fez um roteiro muito bom, parabéns pela inicitiva!

Desejo que com isso vc consiga sair do loop...

Abraços
Paul
paulinho
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 21 Jul 2005 20:00

Ainda sobre o problema

Mensagem por paulinho »

Caro amigo valeu pela dica, mas como disse acima o relatorio funciona, nao tem variaveis erradas e nada mais, segui seu conselho me desliguei, e mesmo assim reescrevi o relatorio ele funciona que e uma beleza, so nao imprime indexa pelo nome, valeu ai pessoal, quem puder me dar uma força agradeço muito obrigado a todos
Paul66
Usuário Nível 1
Usuário Nível 1
Mensagens: 19
Registrado em: 25 Dez 2003 21:58

Mensagem por Paul66 »

Oi Paulinho,

Permita-me fazer mais um comentário...

- A indexação do arquivo está correta?
- A chave para criar o respectivo índice está pelo nome?
- Se indexado por mais de um campo, estão todos tranformados p/ caracter?

Tempo atrás comi bola com isso... chamava o índice, visualizava o cliente no dbf, mas ao fazer o seek, o programa nao o encontrava... era um erro ao criar a indexação...

Quem sabe...

Boa sorte,
Paul
paulinho
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 21 Jul 2005 20:00

Ref indexação

Mensagem por paulinho »

caro amigo entao, ja fiz refiz, verifiquei, apaguei, recriei o indice e nada


entao cara

IF .NOT. NET_USE("CADDEV",.F.,5,,.T.,.T.,"DBFNTX")
RETURN
ENDIF
VMCADDEV := SELECT()
SET INDEX TO CADDEV1

este e o arquivo aonde devia ser indexado por nome

o arquivo caddev1 foi criado assim

index on dv_nome to caddev1

creio eu que esteja correto, da uma luz ai pessoal, valeuz
Paul66
Usuário Nível 1
Usuário Nível 1
Mensagens: 19
Registrado em: 25 Dez 2003 21:58

Mensagem por Paul66 »

Resolvi fazer uma hidentação na sua rotina p/ poder estudá-la com mais facilidade. Lá vão algumas observações:

- Achei um ENDIF "perdido" próximo do local onde vc procura o cliente, dê uma olhada e vê se está correto.

- Vc coloca um espaço na frente do nome p/ procurá-lo no DBF, porque? todos os nomes lá começam com um espaço?

- Qdo vc usa o dbseek, vc não testa se o registro foi encontrado, portanto ele assume onde o ponteiro parou. Fiz uma alteração e coloquei um IF FOUND()... dê uma olhada em como ficou, com isso vc vai poder saber se ele encontrou ou não.

(O Daniel usou o IF EOF(), mas se SET SOFTSEEK estiver ON, o DBSEEK não chegará ao fim do arquivo... )

Código: Selecionar todos

		DO WHILE SITU+LC_PROC = " "+VMPROC 
			IF LC_POSI = " " 
				EXIT 
			ENDIF 
			VMVALO = LC_VALO 
			* VMDTVC = DTOC(LC_DATA) 
			VMPRIM++ 
			SKIP 
		ENDDO 



???--> 	ENDIF  <--- de onde apareceu ???



		* VMDTVC = DTOC(VMDTVC) 
		VMUNIT = TRANSF(VMVALO,"@E 99,999.99") 
		VMPRIM = STRZERO(VMPRIM,2) 
		* VMPLAN = VMPRIM+VMULTP 

		SELECT(VMCADDEV) 
		DBSEEK(" "+VMDEVE) 
      -->  porque esse espaço " " na frente de VMDEVE? 

altere daqui:

		if found()
			VMNOME = SUBS(DV_NOME,1,20) 
                else
			VMNOME = "cliente nao encontrado"
                endif 

até aqui.

		IF VMLINH > 35 .OR. VMLINH = 0 
			VMLINH = 0 
			VMPAGI++ 




		ENDIF 
Boa sorte!
Paul
paulinho
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 21 Jul 2005 20:00

ainda nada

Mensagem por paulinho »

pessoal nada ainda, queria salientar que o mesmo relatorio funciona normalmente, so que nao consigo fazer a indexação dos nomes nele impressos. :( :(
Responder