Page 1 of 1

Ayuda Rango de Fechas desde-hasta

Posted: Sun Jul 23, 2006 11:01 pm
by Databaselab2002
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

Posted: Mon Jul 24, 2006 4:47 am
by RuFer
Fabian:

Prueba a hacer el índice de fecha dtos(fecha)
Sele 11
USE FACTURA
iNDEX on dtos(fecha) to ddto
set index to ddto


Saludos

Ruben Fernandez.

yo lo haría asi

Posted: Mon Jul 24, 2006 2:03 pm
by fleal
// 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

Posted: Tue Jul 25, 2006 1:25 am
by Raymundo Islas M.
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 .... :wink:


Espero te sirva


SALUDOS