Ordscope() ¿Tiene alguna limitación?

HMG en Español

Moderator: Rathinagiri

citro
Posts: 52
Joined: Wed Dec 22, 2010 3:45 pm

Ordscope() ¿Tiene alguna limitación?

Post by citro »

El tema es asi:

En una grilla quiero mostrar las ventas realizadas por un rango de clientes, un rango de vendedores y en un determinado período. Para eso tengo una tabla STVE.DBF que tiene un TAG (Es índice CDX) que es así:

INDEX ON zona+cliente+vendedor+Dtos(fecha) TAG stve1

El código del cliente está formado por 6 caracteres, 2 de la "zona" y 4 del "cliente", o sea en la tabla puedo tener algo así

zona cliente vendedor fecha
06 0000 01 05/01/2014

asumiendo el siguiente filtro hago lo siguiente:

DesCli:="060000"
HasCli:="069999"

DesVen:="01"
HasVen:="02"

DesFec:=ctod( "01/01/2014" )
HasFec:=ctod( "31/01/2014" )

select stve
ordsetfocus(1)
ordscope(0,DesCli +DesVen +Dtos( DesFec ) )
ordscope(1,HasCli +HasVen +Dtos( HasFec ) )
go top

....

y en la grilla me muestra bien el rango de clientes y vendedores seleccionados, pero mal las fechas. Por las dudas aclaro que en el programa principal tengo:

SET DATE FRENCH

por el tema de que la fecha tiene el formato "DD/MM/YYYY"

Uso ORDSCOPE(), porque las tablas están en un servidor Windows 2008 server, y si hago un SET FILTER, el proceso se "duerme". Es como que el filtro llega a abarcar los códigos de Cliente y vendedor, pero no el de fecha. Por eso puse como título del post, si hay alguna limitación en el largo del filtro que se tiene que usar.

Antonio
Sistemas
Resipol
Antonio
Sistemas
Resipol
Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: Ordscope() ¿Tiene alguna limitación?

Post by Javier Tovar »

Hola citro,

Yo lo he hecho así:

Fechas + zona+cliente+vendedor

ya que en en general lo que estas haciendo es consultar:

1.- En un rango determinado de fechas
2.- De una determinada Zona
3.- De un determinado Cliente
4.- de un determinado vendedor.

Y sale sin problemas!

Espero te sirva!

Saludos
Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: Ordscope() ¿Tiene alguna limitación?

Post by Javier Tovar »

El indice principal debe ser por Fechas!

Saludos
Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: Ordscope() ¿Tiene alguna limitación?

Post by Javier Tovar »

Hola ,

También podría ser:

zona + fecha + cliente + vendedor
06 05/01/2014 0000 01


Saludos
citro
Posts: 52
Joined: Wed Dec 22, 2010 3:45 pm

Re: Ordscope() ¿Tiene alguna limitación?

Post by citro »

Hola Javier, Gracias por las respuestas. Ayer a la tarde me fue imposible probar lo que me sugeriste, recién hoy pude ver los mensajes. Probé de las 2 formas pero ninguna de las 2 me dió resultado. Igualmente decidí probar con un ejemplo compilable por cualquiera, en donde creo una tabla con los mismos campos que tiene la tabla del sistema que quiero filtrar, a la cual le agrego 6 registros, y cree los 2 tags según como me habias sugerido. El ejemplo compilable es este:

#include "hmg.ch"

Function Main

SET DATE FRENCH

REQUEST DBFCDX , DBFFPT
RDDSETDEFAULT( "DBFCDX" )

CreaTabla()
AgreDatos()

DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 800 ;
HEIGHT 510 ;
TITLE 'Filtro con ORDSCOPE()' ;
ON RELEASE DbCloseAll() ;
MAIN

@ 10,10 GRID Grid_1 ;
WIDTH 770 ;
HEIGHT 200 ;
HEADERS {'Zona','Cliente','Vendedor','Fecha'} ;
WIDTHS {100,100,100,100};
VALUE { 1,1} ;
ROWSOURCE "stve" ;
COLUMNFIELDS { 'zona','cliente','vendedor','fecha' }

DEFINE BUTTON BUTTON1
ROW 260
COL 10
CAPTION 'Filtro'
ACTION FiltraTabla()
WIDTH 150
END BUTTON

END WINDOW

CENTER WINDOW Form_1

ACTIVATE WINDOW Form_1

Return

/***/
static Function FiltraTabla()

ordsetfocus(2)

DesFec:=ctod( "01/10/2013" )
HasFec:=ctod( "31/10/2013" )

DesVen:="19"
HasVen:="20"

DesZona:="06"
HasZona:="06"

DesCli:="0000"
HasCli:="9999"

ordscope( 0,DesZona +Dtos( DesFec ) +DesCli +DesVen )
ordscope( 1,HasZona +Dtos( HasFec ) +HasCli +HasVen )
go top

Form_1.Grid_1.Refresh

Return Nil

/***/
static Function CreaTabla()

local aEstru

aEstru:={ { "zona","C",2,0 },;
{ "cliente","C",4,0 },;
{ "fecha","D",8,0 },;
{ "vendedor","C",2,0 }}

DbCreate( "stve",aEstru )
use stve exclusive new
index on Dtos( fecha ) +zona +cliente +vendedor tag STVE
index on zona +Dtos(fecha) +cliente +vendedor tag STVEZO

retu Nil

static Function AgreDatos()

stve->( DbAppend() )
stve->zona :="06"
stve->cliente :="0057"
stve->fecha :=ctod( "08/10/2013" )
stve->vendedor:="20"

stve->( DbAppend() )
stve->zona :="02"
stve->cliente :="0855"
stve->fecha :=ctod( "09/10/2013" )
stve->vendedor:="14"

stve->( DbAppend() )
stve->zona :="06"
stve->cliente :="0628"
stve->fecha :=ctod( "10/09/2013" )
stve->vendedor:="19"

stve->( DbAppend() )
stve->zona :="10"
stve->cliente :="0019"
stve->fecha :=ctod( "11/10/2013" )
stve->vendedor:="03"

stve->( DbAppend() )
stve->zona :="06"
stve->cliente :="0020"
stve->fecha :=ctod( "12/10/2013" )
stve->vendedor:="19"

stve->( DbAppend() )
stve->zona :="06"
stve->cliente :="0821"
stve->fecha :=ctod( "02/10/2013" )
stve->vendedor:="07"

retu Nil

El que más se acerca al filtro es el orden que va por zona +Dtos(fecha) +cliente +vendedor, pero termina mostrando un movimiento del vendedor "07".
Antonio
Sistemas
Resipol
Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: Ordscope() ¿Tiene alguna limitación?

Post by Javier Tovar »

Hola citro,

A mi me funciona bien tu ejemplo:
Ord.jpg
Ord.jpg (56.5 KiB) Viewed 4077 times
Saludos
Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: Ordscope() ¿Tiene alguna limitación?

Post by Javier Tovar »

ok, ya vi, voy a checar!

Saludos
Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: Ordscope() ¿Tiene alguna limitación?

Post by Javier Tovar »

Hola citro,

Ya vi cual es el ERROR, creo, es que el del cliente "07" esta entre las fechas señaladas y OrdScope() toma ese rango de fechas y por eso el siguiente no lo descarta!.
Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: Ordscope() ¿Tiene alguna limitación?

Post by Javier Tovar »

Hola Citro,

He pensado en una solución, pero creo que no hay de otra mas que crear una nueva Base de datos con los Registros Filtrados hasta el momento y de esta nueva DBF hacer un nuevo Filter. Y ya va a ser rápido ya que la nueva DBF va a estar en tu maquina!

Saludos
Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: Ordscope() ¿Tiene alguna limitación?

Post by Javier Tovar »

Hola Citro,

Asi quedo

Code: Select all

#include "hmg.ch"

Function Main
PRIVATE aDB
SET DATE FRENCH

REQUEST DBFCDX , DBFFPT
RDDSETDEFAULT( "DBFCDX" )

CreaTabla()
AgreDatos()

DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 1000 ;
HEIGHT 510 ;
TITLE 'Filtro con ORDSCOPE()' ;
ON RELEASE DbCloseAll() ;
MAIN 

@ 10,10 GRID Grid_1 ;
WIDTH 450 ;
HEIGHT 200 ;
HEADERS {'Zona','Vendedor','Fecha','Cliente'} ;
WIDTHS {100,100,100,100};
VALUE { 1,1} ;
ROWSOURCE "stve" ;
COLUMNFIELDS { 'zona','vendedor','fecha','cliente' } 

@ 10,470 GRID Grid_2 ;
WIDTH 450 ;
HEIGHT 200 ;
HEADERS {'Zona','Vendedor','Fecha','Cliente'} ;
WIDTHS {100,100,100,100};
VALUE { 1,1} ;
ROWSOURCE "MiDB" ;
COLUMNFIELDS { 'zona','vendedor','fecha','cliente' } 

DEFINE BUTTON BUTTON1
ROW	260
COL	10
CAPTION	'Filtro'
ACTION	FiltraTabla()
WIDTH	150
END BUTTON

END WINDOW

CENTER WINDOW Form_1

ACTIVATE WINDOW Form_1

Return

/***/
static Function FiltraTabla()
LOCAL nItems

ordsetfocus(1)

DesFec:=ctod( "01/10/2013" )
HasFec:=ctod( "31/10/2013" )

DesVen:="19"
HasVen:="20"

DesZona:="06"
HasZona:="06"

DesCli:="0000"
HasCli:="9999"

ordscope( 0,DesZona +Dtos( DesFec ) + DesVen + DesCli )
ordscope( 1,HasZona +Dtos( HasFec ) + HasVen + HasCli )
go top

DO WHILE !EOF()
		MiDB->(dbAppend())
		MiDB->Zona    := stve->Zona
		MiDB->Fecha   := stve->Fecha
		MiDB->Vendedor:= stve->Vendedor
		MiDB->Cliente := stve->Cliente
		stve->(DBSKIP())
END DO
Select("MiDB")
ordscope( 2,DesVen  )
ordscope( 3,HasVen  )
DBSELECTAREA(1)
Form_1.Grid_2.Refresh

Return Nil

/***/
static Function CreaTabla()

local aEstru

aEstru:={ { "zona","C",2,0 },;
{ "cliente","C",4,0 },;
{ "fecha","D",8,0 },;
{ "vendedor","C",2,0 }}

aDB := aEstru
DbCreate( "stve",aEstru )
DbCreate( "MiDB",aDB )

use MiDB  new shared
index on vendedor tag MiDB

use stve  new shared
*index on Dtos( fecha ) +zona +cliente +vendedor tag STVE
index on zona + DToS(fecha) + vendedor + cliente tag STVEZO


retu Nil	

static Function AgreDatos()

stve->( DbAppend() )
stve->zona :="06"
stve->cliente :="0057"
stve->fecha :=ctod( "08/10/2013" )
stve->vendedor:="20"

stve->( DbAppend() )
stve->zona :="02"
stve->cliente :="0855"
stve->fecha :=ctod( "09/10/2013" )
stve->vendedor:="14"

stve->( DbAppend() )
stve->zona :="06"
stve->cliente :="0628"
stve->fecha :=ctod( "10/09/2013" )
stve->vendedor:="19"

stve->( DbAppend() )
stve->zona :="10"
stve->cliente :="0019"
stve->fecha :=ctod( "11/10/2013" )
stve->vendedor:="03"

stve->( DbAppend() )
stve->zona :="06"
stve->cliente :="0020"
stve->fecha :=ctod( "12/10/2013" )
stve->vendedor:="19"

stve->( DbAppend() )
stve->zona :="06"
stve->cliente :="0821"
stve->fecha :=ctod( "02/10/2013" )
stve->vendedor:="07"

retu Nil
1.jpg
1.jpg (75.16 KiB) Viewed 4069 times
Saludos
Post Reply