Estimados Colegas
Tengo el siguiente problema con rangos de fecha, quiero saber por
ejemplo la cantidad de $ que vendi de tal fecha , con algunas fechas
me tira el monto correcto , con otras me tira 0 , alguien me puede
orientar que estoy haciendo mal, adjunto Codigo
Gracias
Fabian
function VDYM
local odlg1
local nStyle := nOr( WS_POPUP, ; // System menu de oDlg
WS_MAXIMIZE ) // botón maximize habilitado y botón minimize deshabilitado
local ofecha
SET DATE FRENCH
desde:= CToD(" / / ")
hasta:= CToD(" / / ")
DEFINE FONT oFont NAME "ARIAL" SIZE 0,-13.70 BOLD
Sele 11
USE FACTURA
iNDEX on factura->fecha to ddto
set index to ddto
DEFINE DIALOG oDlg1 from 10,35 to 20,70 STYLE nStyle COLOR CLR_BLUE,CLR_6 && of oDlg
@ 0 ,03 say ofecha Prompt "VENTAS DIARIAS Y MENSUALES " FONT OFONT of oDlg1 COLOR CLR_BLACK,CLR_6
@ 1.5 ,06 say ofecha Prompt "Desde " FONT OFONT of oDlg1 COLOR CLR_BLACK,CLR_6
@ 2.5 ,06 say ofecha Prompt "Hasta " FONT OFONT of oDlg1 COLOR CLR_BLACK,CLR_6
@ 1.7 ,8 get desde of odlg1
@ 2.7 ,8 get hasta of odlg1
@ 5 ,2 sbutton b resource "ok" PROMPT "Aceptar" size 40,10 OF oDlg1 LOOK W97 TEXT ON_RIGHT action vdm(desde,hasta,odlg1,ofont)
@ 5 , 10 sbutton b resource "cancel" PROMPT "Cancelar" size 40,10 OF oDlg1 LOOK W97 TEXT ON_RIGHT action(exi(odlg1))
ACTIVATE DIALOG oDlg1 CENTERED
return nil
function vdm(desde,hasta,odlg1,ofont)
local odlgv
local TO1,EF1,TA1
local nStyle1 := nOr( WS_POPUP, ;
WS_MAXIMIZE ) o
SELE 11
USE FACTURA
SUM factura->total to PTOTAL FOR factura->fecha >= desde .AND. factura->fecha <= hasta
? Ptotal
Ayuda Rango de Fechas desde-hasta
yo lo haría asi
// De ésta manera recorres toda la base de FACTURA.
function vdm(desde,hasta,odlg1,ofont)
local nTotal := 0
FACTURA->( dbgotop() )
while FACTURA->( !eof() )
if FACTURA->FECHA >= desde AND FACTURA->FECHA <= hasta
nTotal+= FECHA->TOTAL
endif
FACTURA->( dbskip() )
enddo
?nTotal
// De ésta otra manera, como tienes FACTURA indexado por FECHA entonces primero hago una busqueda para ver si hay fechas, sino para que barrer toda la base
function vdm(desde,hasta,odlg1,ofont)
local dBus := desde
local nTotal := 0
local lExiste := FALSE
while dBus <= hasta
FACTURA->( dbgotop() )
if FACTURA->( dbseek( dBus ) )
lExiste := TRUE
exit
endif
dBus++
enddo
if !lExiste
msgstop("No hay registros en el rango de fechas","Aviso)
endif
// a partir de aquí como ya está posicionado en la primera fecha que halló, solo voy sumando el TOTAL
while FACTURA->( !eof() )
if FACTURA->FECHA >= desde AND FACTURA->FECHA <= hasta
nTotal+= FECHA->TOTAL
endif
FACTURA->( dbskip() )
enddo
?nTotal
Saludos
Fernando Leal
function vdm(desde,hasta,odlg1,ofont)
local nTotal := 0
FACTURA->( dbgotop() )
while FACTURA->( !eof() )
if FACTURA->FECHA >= desde AND FACTURA->FECHA <= hasta
nTotal+= FECHA->TOTAL
endif
FACTURA->( dbskip() )
enddo
?nTotal
// De ésta otra manera, como tienes FACTURA indexado por FECHA entonces primero hago una busqueda para ver si hay fechas, sino para que barrer toda la base
function vdm(desde,hasta,odlg1,ofont)
local dBus := desde
local nTotal := 0
local lExiste := FALSE
while dBus <= hasta
FACTURA->( dbgotop() )
if FACTURA->( dbseek( dBus ) )
lExiste := TRUE
exit
endif
dBus++
enddo
if !lExiste
msgstop("No hay registros en el rango de fechas","Aviso)
endif
// a partir de aquí como ya está posicionado en la primera fecha que halló, solo voy sumando el TOTAL
while FACTURA->( !eof() )
if FACTURA->FECHA >= desde AND FACTURA->FECHA <= hasta
nTotal+= FECHA->TOTAL
endif
FACTURA->( dbskip() )
enddo
?nTotal
Saludos
Fernando Leal
- Raymundo Islas M.
- Posts: 590
- Joined: Tue Mar 14, 2006 11:34 pm
- Location: Acapulco, Gro. MEXICO
Hola
Otra opcion :
Teniendo la base indexada por fecha con el DtoS()
Puedes hacer un ciclo :
For dFecha := dFechIni TO dFechFin
XBase->( DbSeek( DtoS( dFecha ) ) )
IF XBase( Found() )
While XBase->FechCampo == dFecha .AND. XBase->( !Eof() )
nVarTot += XBase->CampTotal
XBase->( DbSkip() )
EndDo
NEXT
No me ha fallado a mi ....
Espero te sirva
SALUDOS
Otra opcion :
Teniendo la base indexada por fecha con el DtoS()
Puedes hacer un ciclo :
For dFecha := dFechIni TO dFechFin
XBase->( DbSeek( DtoS( dFecha ) ) )
IF XBase( Found() )
While XBase->FechCampo == dFecha .AND. XBase->( !Eof() )
nVarTot += XBase->CampTotal
XBase->( DbSkip() )
EndDo
NEXT
No me ha fallado a mi ....
Espero te sirva
SALUDOS
FWH 10.6 + xHarbour + Borland 582