Página 1 de 2

Ajuda com relatorio

Enviado: 21 Jul 2005 20:07
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

Ninguem??

Enviado: 22 Jul 2005 10:43
por paulinho
e ai pessoal ninguem pode ajudar??? :( :(

Enviado: 22 Jul 2005 10:50
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)

Cliente

Enviado: 22 Jul 2005 11:00
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

nada ainda

Enviado: 22 Jul 2005 14:40
por paulinho
e ai pessoal, nao ta indo mesmo, se alguem puder ajudar :( :(

Enviado: 22 Jul 2005 16:58
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)

Caro daniel,

Enviado: 22 Jul 2005 19:05
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

Problema

Enviado: 22 Jul 2005 23:32
por paulinho
E pessoal ta dificil, nao obtive exito, ate reescrevi o relatorio, mas nao ta indo, o bendito indice nao funfa. :(

Re: Problema

Enviado: 23 Jul 2005 09:37
por paulinho
paulinho escreveu:E pessoal ta dificil, nao obtive exito, ate reescrevi o relatorio, mas nao ta indo, o bendito indice nao funfa. :(

Enviado: 23 Jul 2005 10:56
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

Ainda sobre o problema

Enviado: 24 Jul 2005 16:58
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

Enviado: 24 Jul 2005 17:12
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

Ref indexação

Enviado: 24 Jul 2005 18:16
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

Enviado: 25 Jul 2005 01:00
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

ainda nada

Enviado: 02 Ago 2005 20:30
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. :( :(