FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour ayuda con funcion para permitir filtrar datos al usuario
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
ayuda con funcion para permitir filtrar datos al usuario
Posted: Mon Jul 25, 2011 11:28 PM
Para no reinventar la rueda, existe algo como lo siguiente:



una funcion que permita realizar filtro al usuario sobre la tabla que se muestra en el browse?

algo asi como

Code (fw): Select all Collapse
redefine button oBtnFilter ID 201 OF oDlg ACTION cGetFilter( cAlias, oBrowse)


les agradeceria mucho la ayuda.

salu2
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: ayuda con funcion para permitir filtrar datos al usuario
Posted: Tue Jul 26, 2011 06:41 AM
si se animan a ayudarme, esta inconclusa....


Uploaded with ImageShack.us
Code (fw): Select all Collapse
DLG_TFILTER DIALOG 0, 0, 279, 219
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SETFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "Condici贸n del filtro"
FONT 9, "Tahoma"
{
聽 聽 EDITTEXT 聽 聽 聽 聽101, 68, 7, 60, 13, ES_AUTOHSCROLL
聽 聽 COMBOBOX 聽 聽 聽 聽102, 212, 7, 60, 67, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWNLIST | CBS_HASSTRINGS
聽 聽 COMBOBOX 聽 聽 聽 聽103, 7, 44, 77, 30, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWNLIST | CBS_HASSTRINGS
聽 聽 COMBOBOX 聽 聽 聽 聽104, 89, 44, 33, 30, WS_TABSTOP | WS_TABSTOP | CBS_DROPDOWNLIST | CBS_HASSTRINGS
聽 聽 EDITTEXT 聽 聽 聽 聽105, 127, 44, 138, 13, ES_AUTOHSCROLL
聽 聽 LISTBOX 聽 聽 聽 聽 106, 13, 76, 252, 94, WS_TABSTOP | WS_VSCROLL | LBS_DISABLENOSCROLL | LBS_NOINTEGRALHEIGHT | LBS_SORT | LBS_NOTIFY
聽 聽 PUSHBUTTON 聽 聽 聽"Agregar && Cont.", 107, 13, 175, 65, 14
聽 聽 PUSHBUTTON 聽 聽 聽"Agregar && Final", 108, 80, 175, 65, 14
聽 聽 PUSHBUTTON 聽 聽 聽"&Borrar", 109, 146, 174, 40, 14
聽 聽 PUSHBUTTON 聽 聽 聽"&Limpiar", 110, 225, 174, 40, 14
聽 聽 PUSHBUTTON 聽 聽 聽"&Aceptar", 201, 167, 198, 50, 14
聽 聽 PUSHBUTTON 聽 聽 聽"&Cancelar", 202, 222, 198, 50, 14
聽 聽 LTEXT 聽 聽 聽 聽 聽 "Tabla de datos:", IDC_STATIC, 7, 7, 56, 8, SS_LEFT
聽 聽 LTEXT 聽 聽 聽 聽 聽 "Ordenar por:", IDC_STATIC, 167, 7, 40, 8, SS_LEFT
聽 聽 LTEXT 聽 聽 聽 聽 聽 "", IDC_STATIC, 7, 25, 265, 1, SS_LEFT | SS_SUNKEN
聽 聽 LTEXT 聽 聽 聽 聽 聽 "Campo de la tabla:", IDC_STATIC, 7, 31, 75, 8, SS_LEFT
聽 聽 LTEXT 聽 聽 聽 聽 聽 "Operador:", IDC_STATIC, 89, 31, 33, 8, SS_LEFT
聽 聽 LTEXT 聽 聽 聽 聽 聽 "Informaci贸n:", IDC_STATIC, 127, 31, 134, 8, SS_LEFT
聽 聽 GROUPBOX 聽 聽 聽 聽"Criterio:", IDC_STATIC, 7, 62, 265, 131
}


Code (fw): Select all Collapse
/*-----------------------------------------------------------------------------*/
#include "credicom.ch"

FUNCTION cGetFilter()
聽 聽LOCAL cExp
聽 聽LOCAL oDlgFilter

聽 聽oDlgFilter := TDlgFilter():new()
聽 聽IF oDlgFilter:Open()
聽 聽 聽 ?oDlgFilter:cFilter
聽 聽ENDIF

RETURN NIL

/*-----------------------------------------------------------------------------*/

CLASS TDlgFilter

聽 聽DATA cAlias
聽 聽DATA cExpression
聽 聽DATA bExpression
聽 聽DATA aListFields
聽 聽DATA aListOrders
聽 聽DATA aListOperators
聽 聽DATA nCountFields
聽 聽DATA nCountOrders

聽 聽DATA oValue, xValue, xPicture

聽 聽METHOD New() CONSTRUCTOR
聽 聽METHOD Open()
聽 聽METHOD aGetFields()
聽 聽METHOD aGetOrders()
聽 聽METHOD GetFirstField() 聽 聽 聽 聽 聽 聽 聽INLINE ::aListFields[ 1 ]
聽 聽METHOD GetFirstOrder() 聽 聽 聽 聽 聽 聽 聽INLINE IIf( ::nCountOrders > 0, ::aListOrders[ 1 ], "#Recno Order" )
聽 聽METHOD GetFirstOperator() 聽 聽 聽 聽 聽 INLINE ::aListOperators[ 1 ]

聽 聽METHOD SetField( cField )
聽 聽METHOD SetOrder( cOrder ) 聽 聽 聽 聽 聽 INLINE MsgInfo( cOrder )
聽 聽METHOD SetOperator( cOperator ) 聽 聽 INLINE MsgInfo( cOperator )

聽 聽METHOD GetBlankValue()
聽 聽METHOD GetPictureValue()

ENDCLASS

/*-----------------------------------------------------------------------------*/

METHOD TDlgFilter:New( cAlias )
聽 聽DEFAULT cAlias := Alias()

聽 聽::cAlias 聽 聽 聽 聽 := cAlias
聽 聽::nCountFields 聽 := (::cAlias)->( FCount() )
聽 聽::nCountOrders 聽 := (::cAlias)->( OrdCount() )
聽 聽::cExpression 聽 聽:= ""
聽 聽::bExpression 聽 聽:= {|| NIL }
聽 聽::aListFields 聽 聽:= ::aGetFields()
聽 聽::aListOrders 聽 聽:= ::aGetOrders()
聽 聽::aListOperators := { "=", "==", ">", ">=", "<", "<=", "$" }

RETURN Self

/*-----------------------------------------------------------------------------*/

METHOD TDlgFilter:Open( oWndParent )
聽 聽LOCAL lResult := FALSE
聽 聽LOCAL oThis := Self
聽 聽LOCAL oDlgFilter
聽 聽LOCAL oFntFilter
聽 聽LOCAL nField, nOperator
聽 聽LOCAL cExp, acExp
聽 聽PRIVATE xInfo, oInfo, cPicture

聽 聽DEFAULT oWndParent := GetWndDefault()

聽 聽cAlias 聽 聽 聽 聽 := ::cAlias
聽 聽cOrder 聽 聽 聽 聽 := ::GetFirstOrder()
聽 聽cField 聽 聽 聽 聽 := ::GetFirstField()
聽 聽cOperator 聽 聽 聽:= ::GetFirstOperator()
聽 聽oThis:xValue 聽 := ::GetBlankValue( cField )
聽 聽oThis:xPicture := ::GetPictureValue( cField )

聽 聽cExp 聽 聽 聽 聽 := ""
聽 聽acExp 聽 聽 聽 聽:= Array( 10 )

聽 聽AFill( acExp, "" )

聽 聽DEFINE FONT oFntFilter NAME "Tahoma" SIZE 0, -12

聽 聽DEFINE DIALOG oDlgFilter NAME "DLG_TFILTER" OF oWndParent ICON GetIcon() FONT oFntFilter

聽 聽REDEFINE GET 聽 聽 聽cAlias 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽ID 101 OF oDlgFilter WHEN FALSE
聽 聽REDEFINE COMBOBOX cOrder 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽ID 102 OF oDlgFilter ITEMS oThis:aListOrders 聽 聽ON CHANGE oThis:SetOrder( cOrder )

聽 聽REDEFINE COMBOBOX cField 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽ID 103 OF oDlgFilter ITEMS oThis:aListFields 聽 聽ON CHANGE oThis:SetField( cField )
聽 聽REDEFINE COMBOBOX cOperator 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ID 104 OF oDlgFilter ITEMS oThis:aListOperators ON CHANGE oThis:SetOperator( cOperator )
聽 聽REDEFINE GET 聽 聽 聽oThis:oValue VAR 聽oThis:xValue 聽ID 105 OF oDlgFilter PICTURE oThis:xPicture

聽 聽REDEFINE LISTBOX 聽cExp ITEMS acExp ID 106 OF oDlgFilter

聽 聽REDEFINE BUTTON ID 107 OF oDlgFilter ACTION dummy()
聽 聽REDEFINE BUTTON ID 108 OF oDlgFilter ACTION dummy()
聽 聽REDEFINE BUTTON ID 109 OF oDlgFilter ACTION dummy()
聽 聽REDEFINE BUTTON ID 110 OF oDlgFilter ACTION dummy()

聽 聽REDEFINE BUTTON ID 201 OF oDlgFilter ACTION ( lResult := TRUE, 聽oDlgFilter:END() )
聽 聽REDEFINE BUTTON ID 202 OF oDlgFilter ACTION ( lResult := FALSE, oDlgFilter:END() ) CANCEL

聽 聽ACTIVATE DIALOG oDlgFilter CENTER

聽 聽RELEASE xInfo, oInfo, cPicture

RETURN lResult

/*-----------------------------------------------------------------------------*/

METHOD TDlgFilter:aGetFields()
聽 聽LOCAL x
聽 聽LOCAL acFields := Array( ::nCountFields )

聽 聽FOR x := 1 TO ::nCountFields
聽 聽 聽 acFields[ x ] := (::cAlias)->( FieldName( x ) )
聽 聽NEXT

RETURN acFields

/*-----------------------------------------------------------------------------*/

METHOD TDlgFilter:aGetOrders()
聽 聽LOCAL x
聽 聽LOCAL acOrders := Array( ::nCountOrders )

聽 聽FOR x:=1 TO ::nCountOrders
聽 聽 聽 acOrders[x] := (::cAlias)->( OrdName( x ) )
聽 聽NEXT

RETURN acOrders

/*-----------------------------------------------------------------------------*/

METHOD TDlgFilter:GetBlankValue( cField )
聽 聽LOCAL nPos 聽:= (::cAlias)->( FieldPos( cField ) )
聽 聽LOCAL nType := (::cAlias)->( FieldType( nPos ) )
聽 聽LOCAL xValue 聽 := NIL

聽 聽DO CASE
聽 聽CASE nType == "C"
聽 聽 聽 xValue 聽 := Space( (::cAlias)->( FieldLen( nPos 聽) ) )
聽 聽CASE nType == "N"
聽 聽 聽 xValue := 0
聽 聽CASE nType == "D"
聽 聽 聽 xValue 聽 := CToD("")
聽 聽CASE nType == "L"
聽 聽 聽 xValue := FALSE
聽 聽ENDCASE

RETURN xValue

/*-----------------------------------------------------------------------------*/

METHOD TDlgFilter:GetPictureValue( cField )
聽 聽LOCAL nPos 聽:= (::cAlias)->( FieldPos( cField ) )
聽 聽LOCAL nType := (::cAlias)->( FieldType( nPos ) )
聽 聽LOCAL nLen, nDec
聽 聽LOCAL cPicture := ""

聽 聽DO CASE
聽 聽CASE nType == "C"
聽 聽 聽 cPicture := "@!"
聽 聽CASE nType == "N"
聽 聽 聽 nLen := (::cAlias)->( FieldLen( nPos 聽) )
聽 聽 聽 nDec := (::cAlias)->( FieldDec( nPos 聽) )
聽 聽 聽 cPicture := Replicate( "9", nLen ) + IIf( nDec > 0, ( "." + Replicate( "9", nDec )), "" )
聽 聽CASE nType == "D"
聽 聽 聽 cPicture := "@D"
聽 聽CASE nType == "L"
聽 聽 聽 cPicture := "L"
聽 聽ENDCASE

RETURN cPicture

/*-----------------------------------------------------------------------------*/

METHOD TDlgFilter:SetField( cField )

聽 聽::xValue 聽 := ::GetBlankValue( cField )
聽 聽::xPicture := ::GetPictureValue( cField )

聽 聽::oValue:refresh()

RETURN NIL

/*-----------------------------------------------------------------------------*/
/*EOF*/
/*-----------------------------------------------------------------------------*/
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 422
Joined: Mon Aug 17, 2009 12:18 PM
Re: ayuda con funcion para permitir filtrar datos al usuario
Posted: Tue Jul 26, 2011 11:41 AM

Hola:

Alfredo Arteaga public贸 algo.

Tambi茅n en el utilitario ourxbu hay una funci贸n para filtrar, y en el WinDBU de OZ Software/Ignacio.

Saludos,



Eduardo
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: ayuda con funcion para permitir filtrar datos al usuario
Posted: Tue Jul 26, 2011 11:49 AM
Carlos,

Lo que yo tengo es muy primitivo, comparado con lo que tu estas haciendo.

Pero creo que en el sistema de filtrado configurable por el usuario, debe llevar:

Los nombres de los campos han de llevar una leyenda: tenemos que tener un mini-diccionario de datos; ese minidiccionario de datos debe llevar al menos la descripcion de los campos; para esto ultimo se habria de habilitar una forma facil para poder mantener ese mini-diccionario y que no quede desfasado con respecto a las .dbfs.
Poder grabar el filtro (con una leyenda clara) para luego poder activarla: se tendra una lista de filtros del usuario. Es probable que esos filtros se quieran "filtrar" por usuario, para que cada usuario vea los suyos propios.
Seria genial, si en el filtrado se pudiera hacer referencia a otras tablas, lo cual significa que por ejemplo a la tabla de "ventas" habria que poder filtrar segun todos los campos de la tabla de clientes segun el cliente de esa venta


Me da la sensacion, que este trabajo que te traes entre manos, y ya te digo que yo tengo a medio y muy primitivo, es una tarea dificil, y que solo sera utilizable si se alcanza unos altos niveles de acabado... es s贸lo un pensamiento...

Saludos
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: ayuda con funcion para permitir filtrar datos al usuario
Posted: Tue Jul 26, 2011 03:10 PM

Sip, esos punto exepto el ultimoque involucra otras tablas estas previstos ser implementados.

salu2

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)

Continue the discussion