Clase para ado/sql similar a Tdatabase

Clase para ado/sql similar a Tdatabase

Postby alvaro533 » Sun Oct 25, 2009 9:56 pm

Buenas tardes,

Gracias a la ayuda de Armando, Adolfo y otros foristas, ya tengo casi convertida una pequeña aplicación de DBFCDX a MySQL. Me he hecho una clase a partir de TDatabase, que permite usar los métodos blank(),load(),save(),modified() etc, tan cómodos cuando se están modificando campos en un diálogo. Seguramente ya existiera algo parecido, pero no lo he encontrado. No he puesto todos los métodos de TDatabase, porque la mayoría como eof() skip(), etc, se pueden escribir directamente con el método ADO equivalente.

El uso puede ser similar a este ejemplo, después de conectar con MySQL y crear un RecordSet:

Code: Select all  Expand view

      local op
       op := TRecordSet():New(oRecordSet)
       ...
       ...
       if lAppend
          op:blank()
       else
          op:load()
       endif
       ...
       ...
       REDEFINE GET oGet[01] VAR op:codigo ID IDC_EDIT1 OF oDlg
       REDEFINE GET oGet[02] VAR op:precio ID IDC_EDIT2 OF oDlg
       REDEFINE GET oGet[03] VAR op:coste  ID IDC_EDIT3 OF oDlg
       ...
       ...
       REDEFINE BUTTON ID IDOK     OF oDlg action (lSave:=.t. , oDlg:end() )
       REDEFINE BUTTON ID IDCANCEL OF oDlg action (lSave:=.f. , oDlg:end() )
       ...
       if lSave
          if lAppend
             op:append()
          endif
          op:save()
       endif
 


La clase se puede descargar de aquí:

http://www.box.net/shared/5iu17n32pi

Un par de preguntas:

1. ¿ como se hace un softseek cuando el campo es numérico?
oRs:Find("fac = "+str(nFac),,1) no hace softseek.

2. Para cuando la conexión es lenta, ¿alguien tiene modificado xbrowse para que sólo cargue unos 100 registros de la tabla y que vaya repitiendo el select a medida que el puntero se acerca al final del select precargado?

Muchas gracias

Alvaro
alvaro533
 
Posts: 206
Joined: Sat Apr 19, 2008 10:28 pm
Location: Madrid, España

Re: Clase para ado/sql similar a Tdatabase

Postby Armando » Mon Oct 26, 2009 12:45 am

Alvaro:

Te felicito por el rápido avance en tu proyecto.

Disculpa mi ignorancia !, y sin ánimo de polemizar, sé que le has invertido tiempo, esfuerzo y conocimientos para desarrollar la clase TRecordSet pero.... ¿Cual es la ventaja o diferencia entre los dos siguientes códigos?

op:append() y oRs:AddNew()

A vuelo de pajaro lo único que veo es que con tu clase sigues usando código similar (no igual) a xBase, pero, como te he comentado, mi idea es cortarse el cordon umblical con las DBFs e irse acostumbrando a los comando ADO/SQL que si urgas un poco veras que estamos hablando de no más de 7 comandos, sí 7.

Por otro lado, haces mención de la busqueda incremental, para mi eso se quedó para uso con DBFs, con ADO utilizo la busqueda por contenido en todo el campo, a ver si me explico.

Si el usuario teclea MAR en el get de busqueda, busco y muestro todos los registros que contengan las letras MAR sin importar donde este ubicado, en mi caso mostraría

JOSE MARTINEZ LOPEZ
MARTINEZ JIMENEZ LUIS
PEREZ SANCHEZ MARCO
GOMEZ FLORES MARIO
MARIA ELENA GONZALEZ CASTILLO

Y a mis clientes les ha gustado la idea, sobre todo cuando existe la posibilidad de que no registren los datos en orden de Apellido paterno, materno y nombre(s).

Espero que esto te sea de apoyo para ampliarte el panorama.

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
User avatar
Armando
 
Posts: 3065
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Clase para ado/sql similar a Tdatabase

Postby joseluisysturiz » Mon Oct 26, 2009 3:18 am

???
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Clase para ado/sql similar a Tdatabase

Postby alvaro533 » Mon Oct 26, 2009 7:39 am

Hola Armando,

Efectivamente op:append() y oRs:AddNew() es exactamente igual, como puedes ver en el código de la clase. Has ido a coger el único método que no aporta ninguna ventaja en la clase y podía no haberlo añadido igual que no he añadido el resto como gobottom() gotop(), etc porque prefiero usar el método ADO, así aprendo.

Sin embargo, si tienes una tabla con 20 campos, y quieres hacer un diálogo para editarlos, según haces en tu blog, creas un buffer con 20 variables temporales usando la clase TPublic, lo que supone veinte líneas de código, poniendo los nombres de los campos a mano en cada línea y teniendo cuidado de no equivocarte en ninguna letra. Luego, si el usuario pulsa el botón de salvar necesitas otras 20 líneas para pasar las variables temporales a los campos en el recordset.

Luego, cuando se crea un nuevo registro, para inicializar los campos antes de entrar en el diálogo, usas esta función en tus ejemplos:

Code: Select all  Expand view

STATIC FUNCTION ClnUni()
oUni:UNI := SPACE(03)
oUni:DES := SPACE(20)
....
....
RETURN(.T.)
 


Lo que te supone otras 20 líneas de código (una por campo), escribiendo nombres de campos y mirando cuantos caracteres tiene cada campo, y si son núméricos, texto, fecha, o de otro tipo, e inializarlos según el tipo de campo y su longitud.

Esto se consigue con mi código (copia de TDatabase de FW) con los métodos load(), save() y blank(). Una línea sustituye a 20 y si cambias la estructura de las tablas en el futuro, como por ejemplo dar más longitud a un campo de texto o añadir algún campo, no tienes que tocar nada en el código.

Sin embargo, sabes que soy novato en esto y si hay una forma más sencilla dímela. La lectura de tu blog me ha sido muy útil, porque no sabía por dónde empezar con MySQL, y si MySQL era la mejor elección. Se lo aconsejo a cualquiera que quiera introducirse en este mundo.

Lo de las búsquedas con "LIKE" , incluso usando comodines, ya lo estoy usando, pero sólo me funciona para campos de texto. Lo que preguntaba es cómo usarlos si el campo es numérico.

Por ejemplo, si tengo estos registros

20
25
31
32
..

Si hago una búsqueda del valor 27, como no existe, el puntero se va al final del recordset. Lo que quiero hacer es "softseek" es decir, que si el 27 no existe que el puntero se pare en el 31, que es el siguiente. ¿Cómo se hace?

Nota: Acabo de subir otra versión de la clase corrigiendo unos errores.

Muchas gracias.

Alvaro
alvaro533
 
Posts: 206
Joined: Sat Apr 19, 2008 10:28 pm
Location: Madrid, España

Re: Clase para ado/sql similar a Tdatabase

Postby Armando » Mon Oct 26, 2009 3:33 pm

Alvaro:

Sin embargo, si tienes una tabla con 20 campos, y quieres hacer un diálogo para editarlos, según haces en tu blog, creas un buffer con 20 variables temporales usando la clase TPublic, lo que supone veinte líneas de código, poniendo los nombres de los campos a mano en cada línea y teniendo cuidado de no equivocarte en ninguna letra. Luego, si el usuario pulsa el botón de salvar necesitas otras 20 líneas para pasar las variables temporales a los campos en el recordset.


Llevas razón en esta parte, tal vez he sido muy radical tratando de olvidarme de las DBFs, aunque te confieso que tengo aplicaciones que se siguen manejando con DBFs.

Lo de las búsquedas con "LIKE" , incluso usando comodines, ya lo estoy usando, pero sólo me funciona para campos de texto. Lo que preguntaba es cómo usarlos si el campo es numérico.


En esta parte el problema no es que se traten de campos númericos, Hasta donde entiendo MySql los almacena en texto, sino mira este código:

Code: Select all  Expand view

oRsHdr:Find("HDR_FAC = " + "'" + STR(nIrA,7,0) + "'" )
 


El número de factura a localizar debe ser convertilo a cadena para que sea igual al del campo HDR_FAC, el problema esta en realizar el código para que si no se encuentra el número de factura igual, el puntero se ubique en el siguiente mayor. Voy a echarle un ojo a la documentación de MySql para ver si encuentro algo.

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
User avatar
Armando
 
Posts: 3065
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Clase para ado/sql similar a Tdatabase

Postby Armando » Mon Oct 26, 2009 3:59 pm

Alvaro:

A ver si esta simpleza te sirve para tus propositos con la busqueda.

Code: Select all  Expand view

oRsHdr:Find("HDR_FAC >= " + "'" + STR(nIrA,7,0) + "'" )
 


Observa que solo estoy cambiando el signo de comparación de =(Igual) a >= (Mayor/igual)

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
User avatar
Armando
 
Posts: 3065
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Clase para ado/sql similar a Tdatabase

Postby alvaro533 » Mon Oct 26, 2009 5:21 pm

oRsHdr:Find("HDR_FAC >= " + "'" + STR(nIrA,7,0) + "'" )


Funciona, muchas gracias.

Alvaro

Nota: He vuelto a subir la clase con unas correcciones.
alvaro533
 
Posts: 206
Joined: Sat Apr 19, 2008 10:28 pm
Location: Madrid, España

Re: Clase para ado/sql similar a Tdatabase

Postby Adolfo » Tue Oct 27, 2009 1:07 pm

Alvaro..

Aqui tienes la ultima version ( no la final... espero ) de mi clon de la TDATABASE pero para ADO.

http://200.72.140.34/privado/adobase/ADOBASE.rar

El servidor de Mysql no es el mejor, y mas encima lo tengo algo "restringido", asi que no esperen velocidades muy grandes. Luego lo subire a un hosting con un buen ancho de banda.
Pero para las pruebas y demostraciones esta mas que bien.

Si quieres aportar, bienvenido.
Va un ejemplo y comentarios, la clase en si esta comentada.

Cualquier ayuda, comentario, aporte.. sera bienvenido

Saludos

Desde Chile
Adolfo
;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Asus TUF F15, 32GB Ram, 1 TB NVME M.2, 1 TB SSD, GTX 1650
User avatar
Adolfo
 
Posts: 846
Joined: Tue Oct 11, 2005 11:57 am
Location: Chile

Re: Clase para ado/sql similar a Tdatabase

Postby alvaro533 » Tue Oct 27, 2009 11:44 pm

Hola Adolfo.

Muy interesante tu clase. Muchas gracias.
He modificado algunas cosas. Básicamente variables locales que faltaban por definir, un par de funciones y algún error tipográfico en el nombre de las variables.
Lo puedes ver aquí. He marcado con "//aq" los cambios.

http://www.box.net/shared/069gt78tsu

No he tenido mucho tiempo para hacer pruebas pero no consigo que me funcione la paginación con xbrowse. Me carga la primera página de 16 lineas, o lo que sea, pero luego no me carga la siguiente página al llegar al final.

¿alguna idea? seguiré haciendo pruebas.
Muchas gracias.

Alvaro

Nota: Al ejemplo le faltan los bitmaps y no funciona la ip que das.
alvaro533
 
Posts: 206
Joined: Sat Apr 19, 2008 10:28 pm
Location: Madrid, España

Re: Clase para ado/sql similar a Tdatabase

Postby alvaro533 » Wed Oct 28, 2009 12:53 am

Se me olvidaba.

Faltaba el upper
AAdd( ::aFldNames, upper( ::FieldName( n-1 )) ) //aq
en línea 325 para que funcione oBase:<fieldname>:=

Alvaro

Cuando muevo el registro en un xbrowse, el número de registro de la clase permanece constante y la paginación no funciona.

Alvaro
alvaro533
 
Posts: 206
Joined: Sat Apr 19, 2008 10:28 pm
Location: Madrid, España

Re: Clase para ado/sql similar a Tdatabase

Postby Adolfo » Wed Oct 28, 2009 12:19 pm

Gracias por tus comentarios Alvaro..

En el Ejemplo puedes ver como uso la paginacion.

Y tienes razon con las modificaciones.... esa version es la PUBLICA, la personal la tengo demasiada adaptada a mis propias necesidades y MYSQL y me salte varias cosas..

En todo caso.. mantendre una version publica para aquellos que la quieran mejorar y usar.
De hecho reviso tus cambios y creo un post solo para ella.

Saludos.

Desde Chile
Adolfo
;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Asus TUF F15, 32GB Ram, 1 TB NVME M.2, 1 TB SSD, GTX 1650
User avatar
Adolfo
 
Posts: 846
Joined: Tue Oct 11, 2005 11:57 am
Location: Chile


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 10 guests