FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour DBCombo para ADO - RSCOMBO (nueva clase)
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
DBCombo para ADO - RSCOMBO (nueva clase)
Posted: Sat Jul 26, 2014 08:29 PM
Estimado, como la necesidad es la madre de la inventiva, me puse manos a la obra con una clase que emulara el comportamiento de DBCombo, la cual le he puesto RSCOMBO
aca la dejo para quien la necesite. Realmente fue facil, dado qeu dbcombo lo que hace al final y al cambo es tomar los datos de una tabla, y levantarlos en arreglos.
creo que para dolphin sera mas facil aun, cunado tenga tiempo hare la QRYCOMBO :-)
RSCOMBO.CH
Code (fw): Select all Collapse
#ifndef _RSCOMBO_CH
#define _RSCOMBO_CH

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

#xcommand @ <nRow>, <nCol> RSCOMBO [ <oCbx> VAR ] <cVar> ;
             [ ITEMS <aItems> ] ;
             [ SIZE <nWidth>, <nHeight> ] ;
             [ <dlg:OF,WINDOW,DIALOG> <oWnd> ] ;
             [ <help:HELPID, HELP ID> <nHelpId> ] ;
             [ ON CHANGE <uChange> ] ;
             [ VALID <uValid> ] ;
             [ <color: COLOR,COLORS> <nClrText> [,<nClrBack>] ] ;
             [ <pixel: PIXEL> ] ;
             [ FONT <oFont> ] ;
             [ <update: UPDATE> ] ;
             [ MESSAGE <cMsg> ] ;
             [ WHEN <uWhen> ] ;
             [ <design: DESIGN> ] ;
             [ BITMAPS <acBitmaps> ] ;
             [ ON DRAWITEM <uBmpSelect> ] ;
             [ RECORDSET <oRS> ] ;
             [ ITEMFIELD <cFldItem> ] ;
             [ LISTFIELD <cFldList> ] ;
             [ <list: LIST, PROMPTS> <aList> ] ;
       => ;
          [ <oCbx> := ] TRSCombo():New( <nRow>, <nCol>, bSETGET(<cVar>),;
             <aItems>, <nWidth>, <nHeight>, <oWnd>, <nHelpId>,;
             [{|Self|<uChange>}], <{uValid}>, <nClrText>, <nClrBack>,;
             <.pixel.>, <oFont>, <cMsg>, <.update.>, <{uWhen}>,;
             <.design.>, <acBitmaps>, [{|nItem|<uBmpSelect>}], ;
             <oRS>, <(cFldItem)>, <(cFldList)>, <aList> )

#xcommand REDEFINE RSCOMBO [ <oCbx> VAR ] <cVar> ;
             [ <items: ITEMS> <aItems> ] ;
             [ ID <nId> ] ;
             [ <dlg:OF,WINDOW,DIALOG> <oWnd> ] ;
             [ <help:HELPID, HELP ID> <nHelpId> ] ;
             [ ON CHANGE <uChange> ] ;
             [ VALID   <uValid> ] ;
             [ <color: COLOR,COLORS> <nClrText> [,<nClrBack>] ] ;
             [ <update: UPDATE> ] ;
             [ MESSAGE <cMsg> ] ;
             [ WHEN <uWhen> ] ;
             [ BITMAPS <acBitmaps> ] ;
             [ ON DRAWITEM <uBmpSelect> ] ;
             [ RECORDSET <oRS> ] ;
             [ ITEMFIELD <cFldItem> ] ;
             [ LISTFIELD <cFldList> ] ;
             [ <list: LIST, PROMPTS> <aList> ] ;
             [ <lNoBlank: NOBLANK>] ;
       => ;
          [ <oCbx> := ] TRSCombo():ReDefine( <nId>, bSETGET(<cVar>),;
             <aItems>, <oWnd>, <nHelpId>, <{uValid}>, [{|Self|<uChange>}],;
             <nClrText>, <nClrBack>, <cMsg>, <.update.>, <{uWhen}>,;
             <acBitmaps>, [{|nItem|<uBmpSelect>}], ;
             <oRS>, <(cFldItem)>, <(cFldList)>, <aList>, <.lNoBlank.> )

#endif

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


RSCOMBO.PRG
Code (fw): Select all Collapse
#include "FiveWin.ch"
#include "Constant.ch"

#define TRUE  .t.
#define FALSE .f.

#define COMBO_BASE       320
#define CB_ADDSTRING     ( COMBO_BASE + 03 )
#define CB_DELETESTRING  ( COMBO_BASE + 04 )
#define CB_GETCURSEL     ( COMBO_BASE + 07 )
#define CB_INSERTSTRING  ( COMBO_BASE + 10 )
#define CB_RESETCONTENT  ( COMBO_BASE + 11 )
#define CB_FINDSTRING    ( COMBO_BASE + 12 )
#define CB_SETCURSEL     ( COMBO_BASE + 14 )
#define CB_SHOWDROPDOWN  ( COMBO_BASE + 15 )
#define CB_ERR           -01

#define COLOR_WINDOW     5
#define COLOR_WINDOWTEXT 8

#define GWL_STYLE        -16

//----------------------------------------------------------------------------//

CLASS TRSCombo FROM TComboBox

   DATA oRS
   DATA cFldList
   DATA cFldItem
   DATA aList
   DATA cSearchKey
   DATA lSound
   DATA lNoBlank

   METHOD New( nRow, nCol, bSetGet, aItems, nWidth, nHeight, oWnd, nHelpId, ;
              bChange, bValid, nClrText, nClrBack, lPixel, oFont, ;
              cMsg, lUpdate, bWhen, lDesign, acBitmaps, bDrawItem, ;
              oRS, cFldItem, cFldList, aList, lNoBlank ) CONSTRUCTOR

   METHOD ReDefine( nId, bSetGet, aItems, oWnd, nHelpId, bValid, ;
              bChange, nClrText, nClrBack, cMsg, lUpdate, ;
              bWhen, acBitmaps, bDrawItem, ;
              oRS, cFldItem, cFldList, aList, lNoBlank ) CONSTRUCTOR

   METHOD Add( cItem, nAt, cList )
   METHOD Change()
   METHOD Default()
   METHOD Del( nAt )
   METHOD DrawItem( nIdCtl, nPStruct )
   METHOD Fill()
   METHOD Initiate( hDlg )
   METHOD Insert( cItem, nAt, cList )
   METHOD KeyChar( nKey, nFlags )
   METHOD ListGet()
   METHOD LostFocus()
   METHOD Modify( cItem, nAt, cList )
   METHOD Refill()
   METHOD SetItems( aItems, aList, lChanged )
   METHOD Update()
   METHOD Set( cItem )

ENDCLASS

//----------------------------------------------------------------------------//

METHOD New( nRow, nCol, bSetGet, aItems, nWidth, nHeight, oWnd, nHelpId, ;
            bChange, bValid, nClrFore, nClrBack, lPixel, oFont, ;
            cMsg, lUpdate, bWhen, lDesign, acBitmaps, bDrawItem, ;
            oRS, cFldItem, cFldList, aList, lNoBlank ) CLASS TRSCombo

   DEFAULT cFldList := "", ;
           cFldItem := "", ;
           aList    := {}, ;
           aItems   := {}, ;
           lNoBlank := FALSE

   ::oRS        := oRS
   ::aList      := aList
   ::aItems     := aItems
   ::cFldList   := cFldList
   ::cFldItem   := cFldItem
   ::cSearchKey :=""
   ::lSound     := TRUE
   ::lNoBlank   := lNoBlank

   IF Empty( ::aItems ) .and. Empty( ::aList )
      ::Fill()
   ENDIF

   ::Super:New( nRow, nCol, bSetGet, ::aItems, nWidth, nHeight, oWnd, nHelpId, ;
                bChange, bValid, nClrFore, nClrBack, lPixel, oFont, ;
                cMsg, lUpdate, bWhen, lDesign, acBitmaps, bDrawItem )

RETURN Self

//----------------------------------------------------------------------------//

METHOD ReDefine( nId, bSetGet, aItems, oWnd, nHelpId, bValid, ;
                 bChange, nClrFore, nClrBack, cMsg, lUpdate, ;
                 bWhen, acBitmaps, bDrawItem, ;
                 oRS, cFldItem, cFldList, aList, lNoBlank ) CLASS TRSCombo

   DEFAULT cFldList := "", ;
           cFldItem := "", ;
           aList    := {}, ;
           aItems   := {}, ;
           lNoBlank := FALSE

   ::oRS        := oRS
   ::aList      := aList
   ::aItems     := aItems
   ::cFldList   := cFldList
   ::cFldItem   := cFldItem
   ::cSearchKey := ""
   ::lSound     := TRUE
   ::lNoBlank   := lNoBlank

   IF Empty( ::aItems ) .and. Empty( ::aList )
      ::Fill()
   ENDIF

   ::Super:ReDefine( nId, bSetGet, ::aItems, oWnd, nHelpId, bValid, ;
                     bChange, nClrFore, nClrBack, cMsg, lUpdate, ;
                     bWhen, acBitmaps, bDrawItem )

RETURN Self

//----------------------------------------------------------------------------//

METHOD Add( cItem, nAt, cList ) CLASS TRSCombo

   DEFAULT nAt   := 0, ;
           cList := cItem

   IF nAt == 0
      AAdd( ::aItems, cItem )
      AAdd( ::aList,  cList )
   ELSE
      ASize( ::aItems, Len( ::aItems ) + 1 )
      ASize( ::aList , Len( ::aList  ) + 1 )

      AIns( ::aItems, nAt )
      AIns( ::aList , nAt )

      ::aItems[ nAt ] := cItem
      ::aList[ nAt  ] := cList
   ENDIF

   ::SendMsg( CB_ADDSTRING, nAt, cList )

return nil

//----------------------------------------------------------------------------//

METHOD Change() CLASS TRSCombo
   LOCAL cItem := ::GetText()
   LOCAL nAt

   nAt := ::SendMsg( CB_GETCURSEL ) + 1

   IF nAt == ::nAt .and. ! Empty( Eval( ::bSetGet ) )
      RETURN NIL
   ENDIF

   ::nAt := nAt

   IF ::nAt != 0 .and. ::nAt <= Len( ::aItems )
      Eval( ::bSetGet, ::aItems[ ::nAt ] )
   ENDIF

   IF !Empty( ::oGet:hWnd )
      ::oGet:VarPut( Eval( ::bSetGet ) )
      ::oGet:Refresh()
   ENDIF

   IF ::nAt != 0 .and. !HB_IsNil( ::bChange )
      Eval( ::bChange, Self, ::aItems[ ::nAt ] )
   ENDIF

RETURN NIL

//----------------------------------------------------------------------------//

METHOD Default() CLASS TRSCombo
   LOCAL cStart := Eval( ::bSetGet )

   IF !Empty( ::hWnd ) .and. ::nStyle == CBS_DROPDOWNLIST
      ::nStyle := GetWindowLong( ::hWnd, GWL_STYLE )
   ENDIF

   IF HB_IsNil( cStart )
      Eval( ::bSetGet, If( Len( ::aItems ) > 0, ::aItems[ 1 ], "" ) )
      cStart := If( Len( ::aItems ) > 0, ::aItems[ 1 ], "" )
   ENDIF

   AEval( ::aList, { | cList, nAt | ::SendMsg( CB_ADDSTRING, nAt, cList ) } )

   IF !HB_IsNumeric( cStart )
      ::nAt := AScan( ::aList, { | cList | Upper( AllTrim( cList ) ) == ;
                                           Upper( AllTrim( cStart ) ) } )
   ELSE
      ::nAt := cStart
   ENDIF

   ::nAt := IIf( ::nAt > 0, ::nAt, 1 )

   IF HB_IsNil( cStart )
      ::Select( ::nAt )
   ELSE
      ::Set( cStart )
   ENDIF

   IF ::lNoBlank
      ::Select( ::nAt )
   ENDIF

RETURN NIL

//----------------------------------------------------------------------------//

METHOD Del( nAt ) CLASS TRSCombo

   DEFAULT nAt := 0

   IF nAt != 0

      ADel( ::aItems, nAt )
      ADel( ::aList , nAt )

      ASize( ::aItems, Len( ::aItems ) - 1 )
      ASize( ::aList , Len( ::aList  ) - 1 )

      ::SendMsg( CB_DELETESTRING, nAt - 1 )

   ENDIF

RETURN NIL

//----------------------------------------------------------------------------//

METHOD DrawItem( nIdCtl, nPStruct ) CLASS TRSCombo

RETURN LbxDrawItem( nPStruct, ::aBitmaps, ::aList, ::nBmpWidth, ::bDrawItem )

//----------------------------------------------------------------------------//

METHOD Initiate( hDlg ) CLASS TRSCombo

   ::TControl():Initiate( hDlg )

   ::Default()

RETURN NIL

//----------------------------------------------------------------------------//

METHOD Insert( cItem, nAt, cList ) CLASS TRSCombo

   DEFAULT nAt   := 0, ;
           cList := cItem

   IF nAt != 0

      ASize( ::aItems, Len( ::aItems ) + 1 )
      ASize( ::aList,  Len( ::aList  ) + 1 )

      AIns( ::aItems, nAt )
      AIns( ::aList , nAt )

      ::aItems[ nAt ] := cItem
      ::aList[  nAt ] := cList

      ::SendMsg( CB_INSERTSTRING, nAt - 1, cList )

   ENDIF

return nil

//----------------------------------------------------------------------------//

METHOD KeyChar( nKey, nFlags) CLASS TRSCombo
   LOCAL nNewAT := 0
   LOCAL nOldAT := ::nAT

   IF nKey == 32
      ::cSearchKey := ""
      ::Set( IIf( HB_IsNumeric( Eval( ::bSetGet ) ), 1, ::aItems[ 1 ] ) )
   ELSE

      IF nKey == VK_BACK
         ::cSearchKey := Left( ::cSearchKey, Len( ::cSearchKey ) - 1 )
      ELSE
         ::cSearchKey += Upper( Chr( nKey ) )
      ENDIF

      nNewAT := AScan( ::aList, {|x| Upper(x) = ::cSearchKey} )

      IF nNewAt != nOldAt .and. nNewAT != 0

         IF ::lSound
            Tone( 60, 0.3 )
         ENDIF

         ::Set( IIf( HB_IsNumeric( Eval( ::bSetGet ) ), nNewAt, ::aItems[ nNewAt ] ) )

         IF !HB_IsNil( ::bChange )

            IF !HB_IsNil( ::oGet )
               ::oGet:VarPut( Eval( ::bSetGet ) )
               ::oGet:Refresh()
            ENDIF

            Eval( ::bChange, Self, ::VarGet() )

         ENDIF

         RETURN  0

      ELSE
         ::cSearchKey := Left( ::cSearchKey, Len( ::cSearchKey ) - 1 )
      ENDIF

   ENDIF

   ::Super:KeyChar( nKey, nFlags )

RETURN 0

//----------------------------------------------------------------------------//

METHOD ListGet() CLASS TRSCombo
   LOCAL cRet
   LOCAL nAt := ::SendMsg( CB_GETCURSEL )

   IF nAt != CB_ERR
      ::nAt := nAt + 1
      cRet  := ::aList[ ::nAt ]
   ELSE
      cRet := GetWindowText( ::hWnd )
   ENDIF

RETURN cRet

//----------------------------------------------------------------------------//

METHOD LostFocus() CLASS TRSCombo
   LOCAL nAt := ::SendMsg( CB_GETCURSEL )

   IF nAt != CB_ERR
      ::nAt := nAt + 1
      Eval( ::bSetGet, ::aItems[ ::nAt ] )
   ELSE
      Eval( ::bSetGet, GetWindowText( ::hWnd ) )
   ENDIF

   ::cSearchKey := ""

RETURN NIL

//----------------------------------------------------------------------------//

METHOD Modify( cItem, nAt, cList ) CLASS TRSCombo

   DEFAULT nAt   := 0, ;
           cList := cItem

   IF nAt != 0

      ::aItems[ nAt ] := cItem
      ::aList[  nAt ] := cList

      ::SendMsg( CB_DELETESTRING, nAt - 1 )
      ::SendMsg( CB_INSERTSTRING, nAt - 1, cList )

   ENDIF

RETURN NIL

//----------------------------------------------------------------------------//

METHOD Fill() CLASS TRSCombo
   LOCAL oField
   LOCAL nOldRecNo
   LOCAL nItem := -1
   LOCAL nList := -1

   IF HB_IsNil( ::oRS )
      MsgAlert( "TSRCombo:No definio un objeto recordset." )
      RETURN NIL
   ELSE
      IF ::oRS:Fields:Count == 0
         MsgAlert( "TRSCombo:El recordset no tiene campos definidos." )
         RETURN NIL
      ENDIF
   ENDIF

   ::aItems := {}
   ::aList  := {}

   FOR EACH oField IN ::oRS:FIELDS
      IF oField:Name == ::cFldItem
         nItem := HB_EnumIndex()
      ENDIF
      IF oField:Name == ::cFldList
         nList := HB_EnumIndex()
      ENDIF
   NEXT

   IF nItem >= 0
      IF nList >= 0
         IF !::lNoBlank
            AAdd( ::aItems,  0 )
            AAdd( ::aList , "" )
         ENDIF

         nOldRecNo := ::oRS:AbsolutePosition

         ::oRS:MoveFirst()

         DO WHILE ! ::oRS:Eof()
            AAdd( ::aItems, ::oRS:FIELDS( ::cFldItem ):Value )
            AAdd( ::aList , ::oRS:FIELDS( ::cFldList ):Value )
            ::oRS:MoveNext()
         ENDDO

         ::oRS:AbsolutePosition := nOldRecNo
      ENDIF
   ENDIF

RETURN NIL

//----------------------------------------------------------------------------//

METHOD Refill() CLASS TRSCombo

   ::Reset()
   ::Fill()
   ::Default()
   ::Change()

RETURN NIL

//----------------------------------------------------------------------------//

METHOD Set( cItem ) CLASS TRSCombo
   LOCAL nAt

   IF HB_IsString( cItem )
      nAt := AScan( ::aItems, { | c | Upper( c ) == Upper( cItem ) } )
   ELSE
      nAt := AScan( ::aItems, { | c | c == cItem } )
   ENDIF

   IF nAt != 0
      ::Select( nAt )
   ELSE
      SetWindowText( ::hWnd, cItem )
   ENDIF

RETURN NIL

//----------------------------------------------------------------------------//

METHOD SetItems( aItems, aList, lChanged ) CLASS TRSCombo

   DEFAULT lChanged := TRUE

   IF Len( aItems ) != LEN( aList )
      MsgAlert( "TRSCombo:SetItems(): aItems y aList deben tener la misma longitud." )
   ELSE

      ::Reset( lChanged )

      ::aItems := aItems
      ::aList  := aList

      ::Default()

      IF lChanged
         ::Change()
      ENDIF

   ENDIF

RETURN NIL

//----------------------------------------------------------------------------//

METHOD Update() CLASS TRSCombo
   LOCAL bChange := ::bChange

   ::bChange := NIL

   ::Reset()
   ::Fill()
   ::Default()
   ::bChange := bChange

RETURN NIL

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

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: DBCombo para ADO - RSCOMBO (nueva clase)
Posted: Sun Jul 27, 2014 02:11 AM

Carlos Muchas Gracias por el Aporte.

De casualidad tienes un ejemplo para saber como funciona.

Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: DBCombo para ADO - RSCOMBO (nueva clase)
Posted: Sun Jul 27, 2014 09:43 AM

Carlos,

Muchas gracias por tu aporte! :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: DBCombo para ADO - RSCOMBO (nueva clase)
Posted: Sun Jul 27, 2014 03:48 PM

Carlos:

Excelente aporte, Gracias !

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 83
Joined: Wed Apr 20, 2011 03:08 PM
Re: DBCombo para ADO - RSCOMBO (nueva clase)
Posted: Mon Jul 28, 2014 12:59 PM

Carlos muy bueno tu por el Aporte.

Tienes un ejemplo para saber como funciona.

Un abrazo

Sergio Vacarezza S.
Programador Freelance
sergio@vacarezza.cl
Santiago, Chile

Harbour 3.2.0dev (r2407221137) - FWH 24.08 - MariaDB 12.2.2 - FivEdit 22.0214

Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: DBCombo para ADO - RSCOMBO (nueva clase)
Posted: Mon Jul 28, 2014 02:58 PM
Code (fw): Select all Collapse
PROCEDURE Fami_Agregar( lNuevo )
   PRIVATE oDlgEF
   PRIVATE nNumeroF, cNombreF, dFechaNacF, cGeneroF, lCasadoF, nNumTiFa, ;
           nNumPaisF, nNumClasF, nNumEstaF, ;
           nNumTiidF, cNumTiidF, ;
           cNumRegF, dFecEmiRegF, dFecVenRegF
   PRIVATE oRS_TIFA, oRS_PAIS, oRS_TIID, oRS_CLAS, oRS_ESTA, oRS_CTRL

   oRS_TIFA := FW_OpenRecordSet( oConn, "SELECT NUM_TIFA, NOMBRE FROM TIPO_FAMILIAR   ORDER BY NUM_TIFA" )
   oRS_PAIS := FW_OpenRecordSet( oConn, "SELECT NUM_PAIS, NOMBRE FROM PAISES          ORDER BY NUM_PAIS" )
   oRS_TIID := FW_OpenRecordSet( oConn, "SELECT NUM_TIID, NOMBRE FROM TIPOS_IDEN      ORDER BY NUM_TIID" )
   oRS_CLAS := FW_OpenRecordSet( oConn, "SELECT NUM_CLAS, NOMBRE FROM CLASIFICACIONES ORDER BY NUM_CLAS" )
   oRS_ESTA := FW_OpenRecordSet( oConn, "SELECT NUM_ESTA, NOMBRE FROM ESTADOS         ORDER BY NUM_ESTA" )
   oRS_CTRL := FW_OpenRecordSet( oConn, "SELECT TOP 1 CONT_FAMI FROM CONTROL" )

   IF HB_IsNil( oRS_TIFA ) .or. HB_IsNil( oRS_PAIS ) .or. ;
      HB_IsNil( oRS_TIID ) .or. HB_IsNil( oRS_CLAS ) .or. ;
      HB_IsNil( oRS_ESTA ) .or. HB_IsNil( oRS_CTRL )
      FW_CloseRecordSet( { oRS_TIFA, oRS_PAIS, oRS_TIID, oRS_CLAS, oRS_ESTA, oRS_CTRL } )
      RETURN
   ENDIF

   IF lNuevo
      nNumeroF     := oRS_CTRL:Fields( "CONT_FAMI" ):Value + 1
      cNombreF     := Space( 40 )
      dFechaNacF   := CToD("")
      cGeneroF     := aGeneros[ 01 ]
      lCasadoF     := FALSE
      nNumTiFa     := 0
      nNumPaisF    := 0
      nNumTiidF    := 0
      cNumTiidF    := Space( 30 )
      nNumClasF    := 0
      nNumEstaF    := 0
      cNumRegF     := Space( 20 )
      dFecEmiRegF  := CToD( "" )
      dFecVenRegF  := CToD( "" )
   ELSE
      nNumeroF     := oRSFam:Fields( "NUM_FAMI"   ):Value
      cNombreF     := oRSFam:Fields( "NOMBRE"     ):Value
      dFechaNacF   := ttodate( oRSFam:Fields( "FECHA_NACI" ):Value )
      cGeneroF     := oRSFam:Fields( "GENERO"     ):Value
      lCasadoF     := oRSFam:Fields( "CASADO"     ):Value
      nNumTiFa     := oRSFam:Fields( "NUM_TIFA"   ):Value
      nNumPaisF    := oRSFam:Fields( "NUM_PAIS"   ):Value
      nNumTiidF    := oRSFam:Fields( "NUM_TIID"   ):Value
      cNumTiidF    := oRSFam:Fields( "NUM_DOCID"  ):Value
      nNumClasF    := oRSFam:Fields( "NUM_CLAS"   ):Value
      nNumEstaF    := oRSFam:Fields( "NUM_ESTA"   ):Value
      cNumRegF     := oRSFam:Fields( "NUMREG"     ):Value
      dFecEmiRegF  := ttodate( oRSFam:Fields( "NUMREG_FE"  ):Value )
      dFecVenRegF  := ttodate( oRSFam:Fields( "NUMREG_FV"  ):Value )
   ENDIF

   DEFINE DIALOG oDlgEF NAME "DLG_FAMIE" OF oDlgF ICON GetIcon() FONT oFontD

   REDEFINE GET nNumeroF ;
      ID 101 OF oDlgEF ;
      WHEN FALSE

   REDEFINE GET cNombreF ;
      ID 102 OF oDlgEF ;
      PICTURE "@!" ;
      VALID Validar_NoVacio( cNombreF, "Introdusca nombre del familiar." )

   REDEFINE GET dFechaNacF ;
      ID 103 OF oDlgEF ;
      PICTURE "@D"

   REDEFINE COMBOBOX cGeneroF ;
      ID 104 OF oDlgEF ;
      ITEMS aGeneros

   REDEFINE CHECKBOX lCasadoF ;
      ID 105 OF oDlgEF

   REDEFINE RSCOMBO nNumTiFa ;
      ID 106 OF oDlgEF ;
      RECORDSET oRS_TIFA  ;
      ITEMFIELD "NUM_TIFA" ;
      LISTFIELD "NOMBRE"

   REDEFINE RSCOMBO nNumPaisF ;
      ID 107 OF oDlgEF ;
      RECORDSET oRS_PAIS  ;
      ITEMFIELD "NUM_PAIS" ;
      LISTFIELD "NOMBRE"

   REDEFINE RSCOMBO nNumTiidF ;
      ID 108 OF oDlgEF ;
      RECORDSET oRS_TIID  ;
      ITEMFIELD "NUM_TIID" ;
      LISTFIELD "NOMBRE"

   REDEFINE GET cNumTiidF ;
      ID 109 OF oDlgEF ;
      PICTURE "@!" ;
      WHEN nNumTiidF > 0

   REDEFINE RSCOMBO nNumClasF ;
      ID 110 OF oDlgEF ;
      RECORDSET oRS_CLAS ;
      ITEMFIELD "NUM_CLAS" ;
      LISTFIELD "NOMBRE"

   REDEFINE RSCOMBO nNumEstaF ;
      ID 111 OF oDlgEF ;
      RECORDSET oRS_ESTA ;
      ITEMFIELD "NUM_ESTA" ;
      LISTFIELD "NOMBRE"

   REDEFINE GET cNumRegF ;
      ID 112 OF oDlgEF  ;
      PICTURE "@!"

   REDEFINE GET dFecEmiRegF ;
      ID 113 OF oDlgEF ;
      PICTURE "@D"

   REDEFINE GET dFecVenRegF ;
      ID 114 OF oDlgEF ;
      PICTURE "@D"

   REDEFINE BUTTON ;
      ID 201 OF oDlgEF ;
      WHEN !Empty( cNombreF ) ;
      ACTION IIf( Fami_Grabar( lNuevo ), oDlgEF:END(), NIL )

   REDEFINE BUTTON ;
      ID 202 OF oDlgEF ;
      ACTION oDlgEF:END() ;
      CANCEL

   ACTIVATE DIALOG oDlgEF

   FW_CloseRecordSet( { oRS_TIFA, oRS_PAIS, oRS_TIID, oRS_CLAS, oRS_ESTA, oRS_CTRL } )

RETURN
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: DBCombo para ADO - RSCOMBO (nueva clase)
Posted: Fri Jun 26, 2015 01:11 PM

Buén dia, RSCOMBO, funciona com .DBF?

Gracias, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: DBCombo para ADO - RSCOMBO (nueva clase)
Posted: Fri Jun 26, 2015 04:29 PM

LOL.

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: DBCombo para ADO - RSCOMBO (nueva clase)
Posted: Mon Sep 04, 2017 09:41 PM

Saludos, alguien ha probado esta clase de Carlos y sabra si hace la busqueda secuencial asi como el SAY en el xBrowse.? necesito usar DBCOMBO pero con busqueda secuencial, trabajo con MySQL y TDolphin por los momentos, algunas ideas y sugerencias que sea usando la DBCOMBO no estan de mas, saludos...gracias... :shock:

Dios no está muerto...



Gracias a mi Dios ante todo!
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: DBCombo para ADO - RSCOMBO (nueva clase)
Posted: Tue Sep 05, 2017 07:43 PM
Hola carlos buenas tardes.... estuve probando tu clase ... pero tengo un problema. Logre realizar la compilación y no me arroja ningún tipo de error. Pero no funciona :-)

Al dar clic sobre el dbcombo no sale nada.

Code (fw): Select all Collapse
 oVar:="SELECT codig,descr from lyma_nlistado order by codig "
 oConsZZ := FW_OPENRECORDSET(oCon,oVar)

   REDEFINE RSCOMBO nNumTiFa ;
      ID 4003 OF oFld2:aDialogs[ 4 ] ;
      RECORDSET oConsZZ  ;
      ITEMFIELD "codig" ;
      LISTFIELD "NOMBRE"


No se si tenga que ver con la definición del recurso...

Saludos
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: DBCombo para ADO - RSCOMBO (nueva clase)
Posted: Tue Sep 05, 2017 10:37 PM
leandro wrote:Hola carlos buenas tardes.... estuve probando tu clase ... pero tengo un problema. Logre realizar la compilación y no me arroja ningún tipo de error. Pero no funciona :-)

Al dar clic sobre el dbcombo no sale nada.

Code (fw): Select all Collapse
 oVar:="SELECT codig,descr from lyma_nlistado order by codig "
 oConsZZ := FW_OPENRECORDSET(oCon,oVar)

   REDEFINE RSCOMBO nNumTiFa ;
      ID 4003 OF oFld2:aDialogs[ 4 ] ;
      RECORDSET oConsZZ  ;
      ITEMFIELD "codig" ;
      LISTFIELD "NOMBRE"


No se si tenga que ver con la definición del recurso...

Saludos


Saludos, revisa que veo que en el select llamas al campo descr, pero en el LISTFIELD "NOMBRE", no se si eso tendra algo que ver con que no te muestre nada, estas usando ADO o MYSQL.? necesito usar la clase pero con busqueda de secuencial usando mysql, como la estas manejando.? saludos...gracias... :-)
Dios no está muerto...



Gracias a mi Dios ante todo!
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: DBCombo para ADO - RSCOMBO (nueva clase)
Posted: Wed Sep 06, 2017 04:10 PM

Como vas Jose Luis

Gracias por responder....

Apenas ayer me entro la curiosidad con esta clase, quería saber que ventajas tenia, pero la verdad es hasta ahora no he logrado hacerla andar. Por otro lado, ya había intentado lo que mencionas pero sin resultado positivo, ahora mas tarde que me quede un tiempo le pego una checada mas a fondo.

Saludos

Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: DBCombo para ADO - RSCOMBO (nueva clase)
Posted: Wed Sep 06, 2017 08:38 PM
Estimados,
La clase en si no es gran cosa, simplemente es una copia de la original dbcombo de fw,
la cual lo que hace es que en el metodo que se encarga de llenar los datos recorre la base de datos y pasa los datos a un array,
esa es la funcion de dbcombo.
Ahora aca lo que hice fue reemplazar el recorrido de la tabla por un recorrido de una consulta ado.
Code (fw): Select all Collapse
METHOD Fill() CLASS TRSCombo
   LOCAL oField
   LOCAL nOldRecNo
   LOCAL nItem := -1
   LOCAL nList := -1
   LOCAL x

   IF HB_IsNil( ::oRS )
      MsgAlert( "TSRCombo:No definio un objeto recordset." )
      RETURN NIL
   ELSE
      IF ::oRS:Fields:Count == 0
         MsgAlert( "TRSCombo:El recordset no tiene campos definidos." )
         RETURN NIL
      ENDIF
   ENDIF

   ::aItems := {}
   ::aList  := {}

   FOR x := 1 TO ::oRS:Fields:COUNT
      IF ::oRS:Fields( x - 1 ):Name == ::cFldItem
         nItem := x
      ENDIF
      IF ::oRS:Fields( x - 1 ):Name == ::cFldList
         nList := x
      ENDIF
   NEXT

   IF nItem >= 0
      IF nList >= 0
         IF !::lNoBlank
            AAdd( ::aItems,  0 )
            AAdd( ::aList , "" )
         ENDIF

         nOldRecNo := ::oRS:AbsolutePosition

         ::oRS:MoveFirst()

         DO WHILE ! ::oRS:Eof()
            AAdd( ::aItems, ::oRS:Fields( ::cFldItem ):Value )
            AAdd( ::aList , ::oRS:Fields( ::cFldList ):Value )
            ::oRS:MoveNext()
         ENDDO

         ::oRS:AbsolutePosition := nOldRecNo

      ENDIF
   ENDIF

RETURN NIL
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: DBCombo para ADO - RSCOMBO (nueva clase)
Posted: Wed Sep 06, 2017 08:40 PM

cualquier cosa leandro me puedes contactar, para que lo veamos por teamviewer

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: DBCombo para ADO - RSCOMBO (nueva clase)
Posted: Thu Sep 07, 2017 02:20 AM

Carlos, gracias por comentar, lo que mas me interesa sobre la clase o sobre la TDbCombo es que se haga una busqueda secuencial, veo que guiandonos por tu cambio hacia ADO se puede adaptar a SQL, pero en mi caso lo necesario es LA BUSQUEDA SECUENCIAL, asi como lo hace el SAY en el xBrowse...saludos...gracias... :shock:

Dios no está muerto...



Gracias a mi Dios ante todo!

Continue the discussion