Oi Lorival, tinha diversos erros. Eu alterei o seu código, tirei o SET FILTER (que na minha opinião é um procedimento desnecessário e lento), alterei a condição e mudei de posição a verificação. Como é um relatório e espero que o dbf não seja tão grande, pois se for eu aconselharia a criar mais um indice, nem que seja temporário como o colega Itamar mencionou, pois o LOCATE e varrer todo o arquivo
Código: Selecionar todos
/************************/
/* Entradas entre datas */
/* DETALHADO */
Function Ent_dt_tl()
LOCAL L,Vari,Num,Linh,texto
LOCAL VTOTAL :=000000.00
LOCAL VSUBTOTAL :=000000.00
LOCAL TOTALR :=000000.00
LOCAL SUBTTLR :=000000.00
Private vdtin,vdtfin
Sele 1
Use Cadtora Alias Cadtora SHARED NEW EXCLU
IF !NETERR()
If !File("esse.ntx")
Index on esse to esse
Endif
If !File("placa.ntx")
Index on plac to placa
Endif
ELSE
NETMSG()
RETURN(.F.)
ENDIF
Set Index to esse,placa
OrdSetFocus(1)
DbGotop()
Linh :=0
vDtin :=Ctod(" ")
vDtfin:=Ctod(" ")
DispBox(Linh+39,C+08,Linh+44,C+35,1,"w/bg,gb+/b")
@ Linh+40,C+09 Clear to Linh+43,C+34
@ Linh+41,C+10 Say "Data inicial:" Get vDtin Valid datain(vdtin)
@ Linh+42,C+10 Say "Data final :" Get vDtfin Valid dataou(vdtfin)
Read
If Lastkey() = 27
CANCBEEP()
Alert("Opera‡ao cancelada!")
DbCloseAll()
Return
Endif
Pg :=1
L :=0
Num :=0
Vari:=esse
// Set Exac on
// Set Filter to Dten >= vDtin .and. Dten <= vDtfin
LOCATE FOR vDtin>=Dten .AND. Dten<=vDtfin
If !found() // nao eocntrado
ERRORBEEP()
Alert("NÆo houve entradas;neste intervalo de datas!")
USE
Return
endif
abre_imp()
Do While !Eof()
/* mudei de posicao (apesar que acho que nao ha necessidade de testar estas condições, a não ser pelo
plac poder ser zero alguma vez ?
*/
If plac = 0 .or. !(Dten >= vDtin .and. Dten <= vDtfin)
Skip
loop // importante o laço de repeticao
Endif
If L = 0
? PADC(" ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ",80)
? PADC(" MADEIREIRA",80)
? Padc(" Entradas por per¡odo",80)
? Padc(" De "+ dtoc(vDtin) + " … " + Dtoc(vDtfin),80)
? PADC(" ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ",80)
? " Pg.: "+Strzero(pg,2)
? " ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ"
? " Placa Essˆncia Comp Diam Desc Ttl M3 Vlr/M3 Vlr Pg Entrada"
? " ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ"
L:=7
Endif
IF ALLTRIM(VARI) # ALLTRIM(ESSE)
If vsubtotal > 0
? Space(36)+"Subtotal: "+TRANSFORM(VSUBTOTAL,"@e 9,999.999")+" M3 R$ "+Transform(Subttlr, "@e 999,999.99")
VTOTAL+=VSUBTOTAL
VSUBTOTAL:=000000.00
VARI:=ESSE
TOTALR+=SUBTTLR
SUBTTLR:=000000.00
Else
VTOTAL+=VSUBTOTAL
VSUBTOTAL:=000000.00
VARI:=ESSE
TOTALR+=SUBTTLR
SUBTTLR:=000000.00
Endif
Endif
If ALLTRIM(VARI)=ALLTRIM(ESSE)
? Space(3),plac,esse,Transform(comp,"@e 99.99"),Space(1),Transform(diam,"@e 9.99"),;
Space(1),Transform(tdes,"@e 9.999"),Transform(ttm3,"@e 999.999"),;
+SPACE(02),Transform(vlm3,"@e 999.99")+SPACE(02),Transform(vlpg,"@e 999.99"),Space(1),Dten
VSUBTOTAL+=TTM3
subttlr+=vlpg
Endif
DbSkip()
Num++
L++
If L >= 60
L = 0
Pg++
Eject
Endif
If eof()
? Space(36)+"Subtotal: "+TRANSFORM(VSUBTOTAL,"@e 9,999.999")+" M3 R$ "+Transform(Subttlr, "@e 999,999.99")
VTOTAL+=VSUBTOTAL
Totalr+=Subttlr
VARI:=ESSE
Endif
Enddo
? " ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ"
? " Totais:"+Transform(Num,"@e 99,999")+" tora(s)"+Space(20)+transform(vtotal,"@E 999,999.999") + " M3"+Space(1)+"R$"+Transform(Totalr, "@e 99,999,999.99")
? " ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ"
? "[COMPRIME]"
? SPACE(05)+lori2
? "[NORMAL]"
fech_imp()
SETCURSOR(0)
RUN USBPRINT C:\TEMP\RELA.TXT /SEL /DEL
DbCloseAll()
Return NIL
Observe a mudança para "!" nas linhas 55 e 68.
Entre as linhas 65 a 71, responda-me se o plac pode ser zero, senão podemos mudar isso.
Também confirme se ficou lento, mudamos para o modo indexado.