Utilizar MSFlexGrid en Visual C++ con DAO

Al citar acceso completo, nos referimos a que podamos navegar en la base de datos en modo de lectura y escritura, pues no basta con leer los datos también es necesario actualizarlos. Aquí un modo sencillo de uso con la clase base MicroLogicDataBaseControl.

Un modo sencillo de acceder a las bases de datos de escritorio es usando un motor de base de datos como Data Acces Object (DAO). Visual C++ no tiene controles para realizar esta labor, pero si tiene clases implementadas, y mucha complejidad para manipularlas. Mientras mas código fuente tenga nuestro programa mayor control tendremos sobre determinadas tareas, no necesitamos necesariamente un control pre-diseñado, nosotros podemos crearlo y controlarlo con mucha facilidad. Esto se logra después de un tiempo de mucha práctica y dedicación.

Para desplegar los resultados de nuestra tabla en este caso usaremos un control ActiveX: MSFlexgGrid. Para poder utilizar este control debemos hacer lo siguiente en nuestro proyecto:

  • Clic Derecho sobre el Dialogo en tiempo de diseño.
  • Clic sobre Insert ActiveX
  • Navegar y localizar Microsoft FlexgGrid Control 6.0 click en Insert
  • Ahora a darle propiedades como cualquier otro controlal estilo Visual Basic.

flexgrid-dao.gif
MSFlexGrid usado en aplicaciones Visual C++


MicroLogicDataBaseControl



Code: Seleccionar todo
  1. class MicroLogicDataBaseControl

  2. {

  3.    //...

  4.  

  5. };



La Clase ‘CMsFlexGrid’ quedara como sigue:


Code: Seleccionar todo
  1. class CMSFlexGrid : public CWnd

  2. {

  3. protected:

  4.    DECLARE_DYNCREATE(CMSFlexGrid)

  5. public:

  6.    CLSID const& GetClsid()

  7.    {

  8.       static CLSID const clsid

  9.          = { 0x6262d3a0, 0x531b, 0x11cf,

  10.          { 0x91, 0xf6, 0xc2, 0x86, 0x3c, 0x38, 0x5e, 0x30 } };

  11.       return clsid;

  12.    }

  13.  

  14.    virtual BOOL Create(LPCTSTR lpszClassName,

  15.       LPCTSTR lpszWindowName, DWORD dwStyle,

  16.       const RECT& rect,

  17.       CWnd* pParentWnd, UINT nID,

  18.       CCreateContext* pContext = NULL)

  19.    {

  20.       return CreateControl(GetClsid(), lpszWindowName,

  21.          dwStyle, rect, pParentWnd, nID);

  22.    }

  23.  

  24. // Operations

  25. public:

  26.    long GetRows();

  27.    void SetRows(long nNewValue);

  28.    long GetCols();

  29.    //...

  30.  

  31.  

  32.    void OLEDrag();

  33. };



Entonces al querer hacer un Listado el Sgte Código te servirá.


Code: Seleccionar todo
  1. void CDB_DAO_MiniSoftDmDlg::bpReadAllRecorset()

  2. {

  3.  

  4.    SYSTEMTIME       mTime;

  5.    CWaitCursor      mCursor;

  6.  

  7.  

  8.    // Hay que limpiar los valores del ListView

  9.    // LstReporte.DeleteAllItems( );

  10.  

  11.    // Preguntamos si tiene elementos....

  12.    if( mDaoDataControl.RecordsetIsEmpty( ) )

  13.       return;

  14.  

  15.    

  16.    char & nbsp; szTmpString[20];

  17.    long   lngInd = 0;

  18.  

  19.  

  20.    // Con este truco se puede saber cuantos registros hay en el

  21.    // Recordset... sin antes buscar... con Ciclos..

  22.    mDaoDataControl.GetRecordset()->MoveLast();

  23.    FlexR ejilla.SetRows( mDaoDataControl.GetRecordset()->GetRecordCount() + 1 );

  24.  

  25.  

  26.    // Nos desplazmos hacia el 1er Registro

  27.    mDaoDataControl.GetRecordset()->MoveFirst( );

  28.  

  29.  

  30.    //mTime.GetCurrentTime( );

  31.    GetLocalTime( &mTime );

  32.    

  33.    // Ahora un ciclo para determianar cuantos Registros

  34.    // existen y leerlos directamente.....

  35.    while( ! mDaoDataControl.GetRecordset()->IsEOF( ) )

  36.    {

  37.       // Algo será !!

  38.       sprintf( szTmpString, "%03ld", lngInd+1 );

  39.  

  40.       // Insertar los valores...

  41.       FlexRejilla.SetTextMatrix( 1+lngInd, 0 , szTmpString );

  42.       FlexRejilla.SetTextMatrix( 1+lngInd, 1

  43.          , mDaoDataControl.GetField_AsString( Field_Codigo ) );

  44.  

  45.       FlexRejilla.SetTextMatrix( 1+lngInd, 2

  46.          , mDaoDataControl.GetField_AsString( Field_Datos ) );

  47.  

  48.       sprintf( szTmpString, "%ld"

  49.          , mDaoDataControl.GetField_AsInteger( Field_AnioNac ) );

  50.  

  51.       FlexRejilla.SetTextMatrix( 1+lngInd, 3 , szTmpString );

  52.  

  53.       sprintf( szTmpString, "%d"

  54.          , mTime.wYear-mDaoDataControl.GetField_AsInteger( Field_AnioNac ) );

  55.  

  56.       FlexRejilla.SetTextMatrix( 1+lngInd, 4 , szTmpString );

  57.  

  58.       // Sumar un Registro...

  59.       lngInd++;

  60.  

  61.       // Ahora buscamos el Siguiente Registro...

  62.       mDaoDataControl.GetRecordset()->MoveNext( );

  63.    };

  64. };



Para Añadir un Registro a la Tabla tendremos:


Code: Seleccionar todo
  1. void CDB_DAO_MiniSoftDmDlg::OnAddRow()

  2. {

  3.       CDB_DAO_Aniadir   DlgNuevo;

  4.       if( DlgNuevo.DoModal()==IDOK )

  5.       {

  6.  

  7.          if( mDaoDataControl.GetRecordset()->CanAppend( ) )

  8.          {

  9.             // Añadir nuevo Registro

  10.             mDaoDataControl.GetRecordset ()->AddNew( );

  11.  

  12.             mDaoDataControl.SetField_AsString( Field_Codigo

  13.                    ;, DlgNuevo.FldCodigo );

  14.  

  15.             mDaoDataControl.SetField_AsString( Field_Datos

  16.                , DlgNuevo.FldDatos );

  17.  

  18.             mDaoDataControl.SetField_AsString( Field_AnioNac

  19.                , DlgNuevo.FldAnioNac );

  20.  

  21.             mDaoDataControl.SetField_AsString( Field_Observs

  22.                , DlgNuevo.FldObserv );

  23.  

  24.  

  25.             // Guardar los Cambios Hechos....

  26.             mDaoDataControl.GetRecordset ()->Update( );

  27.  

  28.             // Ahora mostramos todo...

  29.             CDB_DAO_MiniSoftDmDlg::OnLis tar( );

  30.          }

  31.       }

  32. };

Archivos Adjuntos

Otros Artículos en esta sección

¿Alguna duda? Sientete libre de hacer tus pruntas en nuestro:
foro deVisual C++ »