lunes, 19 de noviembre de 2007

tDataBase, usando tablas como objetos.


Puede que pienses que esto no tiene nada que ver con ADO, y en efecto directamente no tiene nada que ver con ADO. En una entrada anterior comentamos que para trabajar con ADO, era necesario conocer algo de SQL, lo que no compentamos es que tambien es necesario manejarse bien con la programación orientada a objetos (POO).


En FiveWin está incluida un clase que nos permite manjear las tablas DBF como objetos, eso nos permitiira por una parte probar y tomar soltura en el manejo de propiedades, metodos y ademas es una forma muy eficaz de trabajar.


Esta clase nos controla los bloqueos de registro, incorpora un buffer para no modificar directamente sobre el registro, controla si hay cambios en los datos editados, y muchas mas cosas, que nos llevaria bastante trabajo programar a mano.

Su uso es muy sencillo, y ahora veremos un pequeño ejemplo.


El primer paso, es crear el objeto (instanciar de la clase), abriremos una tabla, por ejemplo de proveedores

DBUseArea(.T.,'DBFCDX','PROVEEDOR','PROVEEDOR,.T.,.F.)

oDbf := TDataBase():New()

ya tenemos creado y funcional nuestro objeto oDbf, disponemos de todos los metodos necesarios para trabajar con una tabla (oDbf:Skip(), oDbf:GoTop(), oDbf:Save(), oDbf:Used(), ...), en la ayuda de fivewin encontrareis todos los metodos disponibles, y en la carpeta Source\clases, podeis consultar el código fuente y ver como funcina internamente.


Siguiendo con un proceso normal de altas y modificaciones de ficheros, el siguiente paso seria determinar si queremos añadir un registro, o editar el registro actual.

Si quermos hacer una alta, invocaremos el metodo Blank, que nos dejara el buffer de edición vacio y listo para ñadir un nuevo registro.

Por el contrario si queremos editar el registro actual, invocaremos el metodo Load, que cargara el contenido de los campos de la tabla, en el buffer de edición.


Acto seguido ya podemos visualizar, editar y modificar el contenido de los campos de nuestro objeto, y la forma de referirnos a los campos es nombre de nuestro objeto : nombre del campo.

@ 10,10 GET oDbf:Codigo

@ 12,10 GET oDbf:Nombre ....

cuando hayamos introducido todos nuestros datos, si queremos guardarlos actuaremos de la siguiente manera.

Comprobaremos si realmente se han modificado los datos, y para ello consultamos el valor de oDbf:Modified(), si nos devuelve verdadero, es que hay cambios.


Si el registro es una alta, en este momento crearemos el registro (hasta ahora hemos estado trabajando sobre un buffer temporal en memoria).

oDbf:Append()

y tanto si es una alta como una edición de un registro existente, grabaremos el contenido del buffer temporal a los campos de la tabla.

oDbf:Save()


Sencillo y potente, verdad?. Bueno pues ADO, funciona de una manera muy parecida, cambian los nombres de algunos metodos, pero en el fondo la filosofia de funcionamiento es la misma.


Aqui teneis algunos metodos con la misma funcionalidad tanto en tDatabase como en ADO


BielSys











Código fuente ejemplo mantenimiento ficha de proveedores usando tDatabase:
STATIC FUNCTION EdtPro(lAdd)

   LOCAL oDlg,oDbf,lSave:=.F.

   DEFAULT lAdd:=.F.

   Select Proveedores

   DATABASE oDbf

   DEFINE DIALOG oDlg RESOURCE "MANPROVE"



   IF lAdd

      oDbf:Blank()

   ELSE

      oDbf:Load()

   ENDIF

   oDlg:SetText('('+ProcName()+')'+IF(lAdd,' Añadir Proveedores',' Editar ficha proveedor'))



   REDEFINE GET oDbf:Codprov   ID 601 OF oDlg VALID {|oGet|Ajusta(oGet)} WHEN lAdd

   REDEFINE GET oDbf:Nombre    ID 602 OF oDlg

   REDEFINE GET oDbf:Nif       ID 603 OF oDlg

   REDEFINE GET oDbf:Dir1      ID 604 OF oDlg

   REDEFINE GET oDbf:Dir2      ID 605 OF oDlg

   REDEFINE GET oDbf:Cp        ID 606 OF oDlg

   REDEFINE GET oDbf:Provincia ID 607 OF oDlg

   REDEFINE GET oDbf:Tel1      ID 608 OF oDlg

   REDEFINE GET oDbf:Tel2      ID 609 OF oDlg

   REDEFINE GET oDbf:Movil     ID 610 OF oDlg

   REDEFINE GET oDbf:Fax       ID 611 OF oDlg

   REDEFINE GET oDbf:Percon    ID 612 OF oDlg



   REDEFINE BUTTON ID 1 OF oDlg ACTION (oDlg:End(), lSave := .T.) // OK

   REDEFINE BUTTON ID 2 OF oDlg ACTION (oDlg:End()) // Cancel



   ACTIVATE DIALOG oDlg CENTERED



   IF lSave .AND. oDbf:Modified()

      IF lAdd

         oDbf:Append()

      ENDIF

      oDbf:Save()

   ENDIF

RETURN NIL


_________________
Saludos desde Mallorca

Biel

Gabriel Maimó

3 comentarios:

Carlos Mora dijo...

Hola Biel,

El planteo de TDatabase es interesante porque es un punto de patida para manejarse con objetos que te permiten abstraer el origen de los datos, añadiendo portabilidad al código.
Digo punto de partida porque Tdatabase es incompleto, solo resuelve un modelo, el de las DBFs, pero se podria pensar (Rafa está en eso) en un modelo genérico, y que sea capaz de entenderse con el GUI de manera transparente como lo hacen los datacontrols.

Te sigue gustando la idea de la reunion de FiveWinners?

Biel Maimó dijo...

Hola Carlos,

efectivamente solo resuelve el modelo de acceso a DBF, pero es un buen punto de partida.
En su dia estuve desarrollando una clase (clon) con los mismos metodos que tDatabase, pero usando ADO para acceder a los datos.
De momento es un proyecto inacabado(la uso, pero no esta 100% acabada).
No sabia que Rafa estuviese trabajando en un modelo genérico.

La idea de la reunion me encanta, si es que al final parece que hay muchas buenas ideas, y estamos haciendo cosas, pero cada cual por su camino, estaria bien exponerlas en una reunion, unir esfuerzos en proyectos comunes, etc .
Ojala que la reunion de FiveWinners se consiga realizar.

Cesar dijo...

Hola Biel, antes que nada quiero decirte que admiro tus comentarios,

yo siempre he usado tdatabase y la verdad es muy facil te ahorras varias lineas de codigo,,

sin lugar a dudas co ADO seria la puntilla final para tener el acceso a otros modelos de bases de datos,

podrias compartir lo que has hecho para ADO ? mi correo es ccc_3_ccc@hotmail.com

saludos...