ayuda con funcion para permitir filtrar datos al usuario

ayuda con funcion para permitir filtrar datos al usuario

Postby carlos vargas » Mon Jul 25, 2011 11:28 pm

Para no reinventar la rueda, existe algo como lo siguiente:

Image

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

algo asi como

Code: Select all  Expand view

redefine button oBtnFilter ID 201 OF oDlg ACTION cGetFilter( cAlias, oBrowse)
 


les agradeceria mucho la ayuda.

salu2
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1719
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: ayuda con funcion para permitir filtrar datos al usuario

Postby carlos vargas » Tue Jul 26, 2011 6:41 am

si se animan a ayudarme, esta inconclusa....
Image

Uploaded with ImageShack.us
Code: Select all  Expand view

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: Select all  Expand view

/*-----------------------------------------------------------------------------*/
#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)
User avatar
carlos vargas
 
Posts: 1719
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: ayuda con funcion para permitir filtrar datos al usuario

Postby mgsoft » 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
User avatar
mgsoft
 
Posts: 422
Joined: Mon Aug 17, 2009 12:18 pm
Location: España

Re: ayuda con funcion para permitir filtrar datos al usuario

Postby hmpaquito » 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
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: ayuda con funcion para permitir filtrar datos al usuario

Postby carlos vargas » Tue Jul 26, 2011 3:10 pm

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

salu2
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1719
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Julio Cepeda and 28 guests