Reemplazo de mysql HANDLER en otros gestores SQL?

82 views
Skip to first unread message

OMAR ROJAS

unread,
Mar 29, 2012, 8:10:36 PM3/29/12
to Comunidad de Visual Foxpro en Español
Me preguntaba si alguno de ustedes conoce como traer un registro por
vez y navegar por una tabla SQL ordenado naturalmente o basado en los
indices que esta posee como se puede lograr con el comando HANDLER de
mysql pero en otros gestores SQL como por decir postgres u otros?

Douglas Sánchez Guillén

unread,
Mar 29, 2012, 8:24:13 PM3/29/12
to publice...@googlegroups.com
hola te lo voy a colocar en orden como que estes frente a tu pantalla de izquierda a derecha.


PRIMER BOTON

=SQLEXEC(Thisform.nHandle,'SELECT * from tblContribuyente Order by idContribuyente ASC Limit 1','MiCursor')

SEGUNDO BOTON

lcCadena = "SELECT * from tblContribuyente WHERE idContribuyente" + ;
        " < " + ALLTRIM(STR(Thisform.miText1.value)) + " Order by idContribuyente Desc LIMIT 1"

resul= SQLEXEC(Thisform.nHandle,lcCadena,'MiCursor')
SELECT MiCursor
IF RECCOUNT()=0
    *- No hay ninguno con esa condición
    lcCadena = "SELECT * from tblContribuyente WHERE idContribuyente" + ;
        " = " + ALLTRIM(STR(Thisform.miText1.value)) + " Order by idContribuyente Desc LIMIT 1"
    =SQLEXEC(Thisform.nHandle,lcCadena,'MiCursor')
ENDIF


TERCER BOTON

lcCadena = "SELECT * from tblContribuyente WHERE idContribuyente" + ;
        " > " + ALLTRIM(STR(Thisform.miText1.value)) + " Order by idContribuyente ASC LIMIT 1"
resul=SQLEXEC(Thisform.nHandle,lcCadena,'MiCursor')
IF RECCOUNT()=0
    lcCadena = "SELECT * from tblContribuyente WHERE idContribuyente" + ;
        " = " + ALLTRIM(STR(Thisform.miText1.value)) + " LIMIT 1"
    =SQLEXEC(Thisform.nHandle,lcCadena,'MiCursor')
ENDIF

CUARTO BOTON O SEA IR AL ULTIMO REGISTRO

=SQLEXEC(Thisform.nHandle,'SELECT * from tblContribuyente Order by idcontribuyente DESC Limit 1','MiCursor')

Espero le sirva, nunca traigas toda la informacion de una sola ves solo el registro indicado.
modificas y luego lo actualizas en la pantalla y asi confirmaras los cambios en el lado del server.

Saluedes









Walter R. Ojeda Valiente

unread,
Mar 29, 2012, 9:56:44 PM3/29/12
to publice...@googlegroups.com
En Firebird puedes hacerlo de dos formas:

1. Usando las cláusulas FIRST y SKIP
    FIRST te sirve para traer los primeros "n" registros.
    SKIP para antes de eso saltearte "m" registros.

2. Usando la cláusula ROWS
    Puedes decirle desde que registro hasta que registro te interesa, por ejemplo:
    ROWS 12 TO 20
    te traerá los registros desde el 12 hasta el 20, ambos inclusive

En la cláusula ORDER BY especificas el orden en el cual se mostrarán los registros. Puedes agregarle la subcláusula DESCENDING para que sean mostrados en orden inverso.

Saludos.

Walter.




> Date: Thu, 29 Mar 2012 17:10:36 -0700
> Subject: [vfp] Reemplazo de mysql HANDLER en otros gestores SQL?
> From: oro...@gmail.com
> To: publice...@googlegroups.com

Carlos Miguel FARIAS

unread,
Mar 30, 2012, 8:54:27 AM3/30/12
to publice...@googlegroups.com
En postgresql, también está la clausula LIMIT.
En sql server como se hace?
Saludos: Miguel, Santa Rosa (LP)


El 29/03/12, Walter R. Ojeda Valiente <wr...@hotmail.com> escribió:

Miguel Canchas

unread,
Mar 30, 2012, 9:35:20 AM3/30/12
to publice...@googlegroups.com
Usa el CursorAdapter.


Con ese tendras tus tablas on line, sea la base de datos que consultes...

* This script handles the ADO Connection and uses a CursorAdapter object
* to retrieve data to a cursor.

PUBLIC oCA as CursorAdapter
LOCAL oConn as ADODB.Connection
LOCAL oRS as ADODB.Recordset
LOCAL oException AS Exception
LOCAL cConnString

* Handle connections - insert connection code
cConnString = [Provider=SQLOLEDB.1;Data Source=MISERVER;Initial Catalog=Ximera;User ID=USUARIO;Password=MIPASSWORD]

TRY
oConn = createobject('ADODB.Connection')

* Ensure that you handle userid and password if not
* specified in connection string.
* ex. oConn.Open(cConnString, userid, password)
oConn.Open(cConnString)

oRS = CREATEOBJECT("ADODB.Recordset")
oRS.DataSource.CursorLocation = 3 &&adUseClient
oRS.DataSource.LockType = 3 &&adLockOptimistic
oRS.ActiveConnection = oConn

oCA=CREATEOBJECT("CursorAdapter")
oCA.DataSourceType = "ADO"
oCA.DataSource = oRS
oCA.MapBinary = .T.
oCA.MapVarchar = .T.

oCA.Alias = "tivos"
oCA.SelectCmd = "SELECT * FROM tivos"

IF !oCA.CursorFill()
* Replace with error code here
LOCAL laError
DIMENSION laError[1]
AERROR(laError)
MESSAGEBOX(laError[2])
ELSE
* Replace with user code here. Code below allows for
* you to edit and send updates to the backend.
LOCAL laFlds,lcStr,lnFldCount,i
DIMENSION laFlds[1]
lnFldCount=AFIELDS(laFlds)
lcStr=""
FOR i = 1 TO lnFldCount
lcStr = lcStr + laFlds[m.i,1] + ","
ENDFOR
oCA.UpdatableFieldList = lcStr
BROWSE NORMAL NOWAIT
ENDIF

CATCH TO oException
* Replace with exception handling code here
MESSAGEBOX(oException.Message)

ENDTRY

* Add user code here.
* Note: cursors created by CursorAdapter object are closed when object is released.
MK

-----Mensaje original-----
De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de OMAR ROJAS
Enviado el: jueves, 29 de marzo de 2012 07:11 p.m.
Para: Comunidad de Visual Foxpro en Español
Asunto: [vfp] Reemplazo de mysql HANDLER en otros gestores SQL?

Miguel Canchas

unread,
Mar 30, 2012, 9:38:40 AM3/30/12
to publice...@googlegroups.com
TOP

MK

-----Mensaje original-----
De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de Carlos Miguel FARIAS
Enviado el: viernes, 30 de marzo de 2012 07:54 a.m.
Para: publice...@googlegroups.com
Asunto: Re: [vfp] Reemplazo de mysql HANDLER en otros gestores SQL?

Carlos Miguel FARIAS

unread,
Mar 30, 2012, 12:01:52 PM3/30/12
to publice...@googlegroups.com
TOP te trae el primero o los primeros, si indicas orden, según el
orden indicado, si no indicas orden, supongo que por orden fisico en
la tabla (?), como en el resto de los SGBD, la clausula limite te trae
1 o mas registros a partir del registro que se indique. que puede ser
el primero, pero es es circunstancial.
Salvo que el TOP de sql server tenga opciones diferentes a las
clasicas cantidad o porcentaje.
O sea, con TOP no veo como recuperar por el ejemplo el registro
siguiente al actual, donde el actual puede ser cualquiera en la tabla.
(En firebird, Walter dio la equivalencia).

Saludos: Miguel, Santa Rosa (LP)

El 30/03/12, Miguel Canchas <mcan...@ximesa.com> escribió:

Douglas Sánchez Guillén

unread,
Mar 30, 2012, 12:03:45 PM3/30/12
to publice...@googlegroups.com
En sql server se hace con select top(1)


saludes
--
Ing. Douglas Sánchez Guillén
      Consultor Informatico
Movistar: 505 8759 - 5342
Claro: 505 88495476

OMAR ROJAS

unread,
Mar 30, 2012, 1:33:33 PM3/30/12
to Comunidad de Visual Foxpro en Español
Agradezco mucho a todos por su tiempo, Esto es grandioso! acabo de
descubrir que estaba equibocado, de comienzo fui un poquito incredulo
ya que segun mi concepto tenia entendido que la clausula ORDER BY
simplemente me ordenaba la seleccion de registros que recuperaba del
gestor SQL pero habia sido en mysql obliga a leer la tabla en ese
order para hacer la seleccion, weeeeeeeeeeee que gran error!!!, les
explico por si a alguien le sirve para hacer los famosos ABM´s (alta
baja modificacion de tablas primarias) con los botones clasicos
(inicio,anterior,siguiente,ultimo)
utilizaba la sentencia HANDLER de mysql del siguiente modo:

&&abre una tabla para recorrer
SQLEXEC( _HCsql, [HANDLER tabla OPEN;] )

&&me trae el primer registro de la tabla pero en el orden definido en
tabla bajo el nombre de indexkey o primary
&&en caso de ser indice primario
SQLEXEC( _HCsql, [HANDLER tabla READ 'indexkey' FIRST;], [XCURSOR] )

&&con las siguientes sentencias se trae el anterior, el ultimo y el
siguiente
SQLEXEC( _HCsql, [HANDLER tabla READ 'indexkey' PREV;], [XCURSOR] )
SQLEXEC( _HCsql, [HANDLER tabla READ 'indexkey' LAST;], [XCURSOR] )
SQLEXEC( _HCsql, [HANDLER tabla READ 'indexkey' NEXT;], [XCURSOR] )

&& cerramos la tabla
SQLEXEC( _HCsql, [HANDLER tabla CLOSE;] )

peeeeero grande fue mi sorpresa cuando probe el codigo proveido por
Douglas en el que con una pequeña modificacion
de este modo:
SQLEXEC( _HCsql, [SELECT * FROM tabla ORDER BY indexkey LIMIT noffset,
1;], [XCURSOR] )
en donde noffset es el ultimo registro leido hace lo mismo que con
HANDLER y bueno como les dije estaba con un concepto erroneo en
mente!!, y lo grandioso de todo esto es que SELECT es portable a todos
los gestores SQL, lo unico es que hay que hacer una buena gestion con
la posicion de registro es decir el noffset y con la cantidad de
registros para que se produzca la navegacion correcta en la tabla de
modo ordenado.

Queda pendiente en hacer las pruebas en firebird ya que nunca lo he
probado!!

Saludos y muchas gracias a todos, desde ENCARNACION, PARAGUAY!!

Walter R. Ojeda Valiente

unread,
Mar 30, 2012, 5:13:08 PM3/30/12
to publice...@googlegroups.com
¿Eres de Encarnación?

Tengo pendiente una visita a esa ciudad, me dijeron que está muy linda con la nueva costanera.

Saludos desde Asunción, Paraguay.

Walter.



> Date: Fri, 30 Mar 2012 10:33:33 -0700
> Subject: [vfp] Re: Reemplazo de mysql HANDLER en otros gestores SQL?
> From: oro...@gmail.com
> To: publice...@googlegroups.com
>

Víctor Hugo Espínola Domínguez

unread,
Mar 30, 2012, 5:20:35 PM3/30/12
to publice...@googlegroups.com
Hola Omar


Saludos, Víctor

Carlos Miguel FARIAS

unread,
Mar 30, 2012, 7:36:19 PM3/30/12
to publice...@googlegroups.com
Douglas: SELECT TOP(1) me trae el eNesimo registro? O me trae el primero.
Por eso pregunto, no se como traes un registro cualquiera a partir de donde estas posicionado.

Saludos: Miguel, Santa Rosa (LP)

Douglas Sánchez Guillén

unread,
Mar 30, 2012, 8:20:53 PM3/30/12
to publice...@googlegroups.com
Hola Carlos Miguel, si trae el primero pero no lo puse completo

*** Tener el registro en tiempo real en el formulario, para los mantenimientos

** PRIMER REGISTRO
LOCAL xcad as Character, r1 as Integer

xcad = 'SELECT  TOP (1) * fROM tblusuarios order by idusuarios ASC'
r1=SQLEXEC(Thisform.nHandle,xcad,'miCursor')
*validar r1


** REGISTRO ANTERIOR
LOCAL xcad as Character, r1 as Integer

xcad = 'SELECT  TOP (1) * fROM tblusuarios WHERE idusuarios < ?ALLTRIM(STR(Thisform.miText1.value)) order by idusuarios Desc'
r1 = SQLEXEC(Thisform.nHandle,xcad,'miCursor')
SELECT micursor
IF RECCOUNT()=0
    xcad = 'SELECT  TOP (1) * fROM tblusuarios WHERE idusuarios = ?ALLTRIM(STR(Thisform.miText1.value)) order by idusuarios Desc'
    r1 = SQLEXEC(Thisform.nHandle,xcad,'miCursor')
ENDIF



** REGISTRO SIGUIENTE

LOCAL xcad as Character, r1 as Integer

xcad = 'SELECT  TOP (1) * fROM tblusuarios WHERE idusuarios > ?ALLTRIM(STR(Thisform.miText1.value)) order by idusuarios ASC'
r1 = SQLEXEC(Thisform.nHandle,xcad,'miCursor')
SELECT micursor
IF RECCOUNT()=0
    xcad = 'SELECT  TOP (1) * fROM tblusuarios WHERE idusuarios = ?ALLTRIM(STR(Thisform.miText1.value)) order by idusuarios Desc'
    r1 = SQLEXEC(Thisform.nHandle,xcad,'miCursor')
ENDIF



** ULTIMO REGISTRO
LOCAL xcad as Character, r1 as Integer
xcad = 'SELECT  TOP (1) * fROM tblusuarios order by idusuarios DESC'
r1=SQLEXEC(Thisform.nHandle,xcad,'miCursor')
validar r1


Saludes

Carlos Miguel FARIAS

unread,
Mar 30, 2012, 8:42:24 PM3/30/12
to publice...@googlegroups.com
Si, logras el mismo efecto, pero estas dependiendo de un valor previo disponible, o sea no seria equivalente al LIMIT de mysql, postgresql o su equivalentes en otros SGBD.
Saludos: Miguel, La Pampa (RA)

Douglas Sánchez Guillén

unread,
Mar 30, 2012, 9:16:05 PM3/30/12
to publice...@googlegroups.com
Cierto carlos miguel, sql server no tiene esa caracteristica com mysql Limit, seria excelente si la tuvise almenos la versiones hasta 2005 que son las con las que he trabajado, si tu la encuentras al rato nos los hace saber gracias.

Saludes

Carlos Miguel FARIAS

unread,
Mar 31, 2012, 7:43:46 AM3/31/12
to publice...@googlegroups.com
No trabajo con SQL Server, trabajo con MySQL y ahora en un proyecto nuevo estoy encarando postgresql, el funcionario que esta a cargo del area informatica donde trabajo, cuida el peso, y opta bien (que es raro para un funcionario) porque además, escucha opiniones. Es todo un caso!

Saludos: Miguel, La Pampa (RA)


Reply all
Reply to author
Forward
0 new messages