Página 1 de 1

C

Publicado: Mar Ene 30, 2007 5:22 pm
por Xevi
Tengo un DBBrowse con los datos de una consulta con MySQL...
WITH OBJECT ::oAdoDataSource1
:cConnect := "ODBC;DATABASE=MiBDDcitroen;DRIVER=MySQL ODBC 3.51
Driver;PORT=3306;SERVER=xevicomas.dyndns.org;UID=Usuario;PWD =password "
:lConnected := .T.
END
WITH OBJECT ::oSQLQuery1
:cSelect := "SELECT * FROM mitabla ORDER BY referencia"
:lOpen := .T.
END
Bien... la consulta se realiza perfectamente y obtengo los datos
correctamente en el Browse...
Pero... ¿como hago para hacer una búsqueda en los datos obtenidos??
He probado el método Seek del Browse..
::oBrowse1:Seek( ::oEditRecerca:cText )
También he probado...
::oSQLQuery1:Seek( ::oEditRecerca:cText, .T. )
Pero no obtengo los resultados deseados... el browse no cambia a ningún
registro.
Un Saludo,
Xevi.

C

Publicado: Mar Ene 30, 2007 5:40 pm
por ignacio
Xevi,
?¿?¿?¿?¿?¿?¿?¿?¿?¿
Seek no es un método válido de TSqlQuery. Tendrías que haber recibido un
error tal que:
TSQLTABLE:SEEK(???)
Error BASE/1004 Message not found: TSQLTable:SEEK
Logicamente el DBBrowse SOLO puede realizar un SEEK en DataSets que soporten
dicho método.
Puedes utilizar los métodos Locate y Filter. Ten en cuenta que en el caso de
ADO la sintaxis de Locate y Fiter no coincide con la de xHarbour, sino que
deberás utilizar sintaxis estándar SQL.
Un saludo,
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"Xevi" <xevicomas@gmail.com> escribió en el mensaje
news:45bf709b$[email=1@news.xailer.com...]1@news.xailer.com...[/email]
> Tengo un DBBrowse con los datos de una consulta con MySQL...
>
> WITH OBJECT ::oAdoDataSource1
> :cConnect := "ODBC;DATABASE=MiBDDcitroen;DRIVER=MySQL ODBC 3.51
> Driver;PORT=3306;SERVER=xevicomas.dyndns.org;UID=Usuario;PWD =password "
> :lConnected := .T.
> END
> WITH OBJECT ::oSQLQuery1
> :cSelect := "SELECT * FROM mitabla ORDER BY referencia"
> :lOpen := .T.
> END
>
> Bien... la consulta se realiza perfectamente y obtengo los datos
> correctamente en el Browse...
> Pero... ¿como hago para hacer una búsqueda en los datos obtenidos??
>
> He probado el método Seek del Browse..
> ::oBrowse1:Seek( ::oEditRecerca:cText )
>
> También he probado...
> ::oSQLQuery1:Seek( ::oEditRecerca:cText, .T. )
>
> Pero no obtengo los resultados deseados... el browse no cambia a ningún
> registro.
>
>
> Un Saludo,
> Xevi.
>
>
>

C

Publicado: Mar Ene 30, 2007 6:36 pm
por Xevi
Ignacio,
Bien... como has aclarado, Seek en TSQLTable lanza el error que mencionas.
Estoy intentando hacer una pequeña aplicación que me introduzca en el mundo
SQL... pues por lo visto el futuro pasará por ahí...
Así pues si deseo localizar un registro, partiendo de un Browse de los datos
que provienen de una Consulta MySQL debo hacerlo con sentencias SQL ¿es
así??
Asi pues una búsqueda en un Browse que se posicionara en el primer registro
que el campo referencia empiece por "123"... ¿como se haría???
Perrdonar por mi ignorancia, pero estoy leyendo algunos manuales de SQL,
pero hacen referencia a consultas, modificaciones, borrados de registros,
pero no encuentro como hacer una búsqueda en mi BrowseSQL.
Gracias.
Un Saludo,
Xevi.
"Ignacio Ortiz de Zúñiga" <NoName@xailer.com> escribió en el mensaje
news:45bf7517$[email=1@news.xailer.com...]1@news.xailer.com...[/email]
> Xevi,
>
> ?¿?¿?¿?¿?¿?¿?¿?¿?¿
>
> Seek no es un método válido de TSqlQuery. Tendrías que haber recibido un
> error tal que:
>
> TSQLTABLE:SEEK(???)
> Error BASE/1004 Message not found: TSQLTable:SEEK
>
> Logicamente el DBBrowse SOLO puede realizar un SEEK en DataSets que
> soporten dicho método.
>
> Puedes utilizar los métodos Locate y Filter. Ten en cuenta que en el caso
> de ADO la sintaxis de Locate y Fiter no coincide con la de xHarbour, sino
> que deberás utilizar sintaxis estándar SQL.
>
> Un saludo,
>
> --
> Ignacio Ortiz de Zúñiga
> http://www.xailer.com
>
>
> "Xevi" <xevicomas@gmail.com> escribió en el mensaje
> news:45bf709b$[email=1@news.xailer.com...]1@news.xailer.com...[/email]
>> Tengo un DBBrowse con los datos de una consulta con MySQL...
>>
>> WITH OBJECT ::oAdoDataSource1
>> :cConnect := "ODBC;DATABASE=MiBDDcitroen;DRIVER=MySQL ODBC 3.51
>> Driver;PORT=3306;SERVER=xevicomas.dyndns.org;UID=Usuario;PWD =password "
>> :lConnected := .T.
>> END
>> WITH OBJECT ::oSQLQuery1
>> :cSelect := "SELECT * FROM mitabla ORDER BY referencia"
>> :lOpen := .T.
>> END
>>
>> Bien... la consulta se realiza perfectamente y obtengo los datos
>> correctamente en el Browse...
>> Pero... ¿como hago para hacer una búsqueda en los datos obtenidos??
>>
>> He probado el método Seek del Browse..
>> ::oBrowse1:Seek( ::oEditRecerca:cText )
>>
>> También he probado...
>> ::oSQLQuery1:Seek( ::oEditRecerca:cText, .T. )
>>
>> Pero no obtengo los resultados deseados... el browse no cambia a ningún
>> registro.
>>
>>
>> Un Saludo,
>> Xevi.
>>
>>
>>
>
>

C

Publicado: Mié Ene 31, 2007 12:34 am
por Fredy
Hola Xevi,
Yo estoy probando los cursores dinámicos del lado servidor con TSqlTable
y no me están funcionando, pero aún no estoy muy seguro de si es problema
mí­o o de Xailer. En apariencia funciona, pero sólo me recupera el primer
registro, mientras que si lo uso del lado cliente, funciona bien.
De todas formas, tienes que cambiar el "chip". En dbf estamos acostumbrados
a poder acceder a la totalidad de los datos de la tabla y una vez abierta,
hacer un filtro, localizar datos, etc..
En Sql es al reves. Primero decides los datos que te interesan mediande
el select .. where y luego los recibes. ADO nos permite acercarnos a la "filosofí­a
dbf", pero hemos de intentar aplicarla lo menos posible.
Para empezar te recomiendo que utilices cursores forward only en tu consulta
que son más rápidos y te la pases a un memdataset para trabajar con los datos.
Aunque claro, chocamos con el problema tí­pico de trabajar con un snapshot
de los datos. (como dirí­a el anuncio, esto no es renault ocasión. O citroen
en tu caso :) )
El próximo artí­culo que publicaré en mundoxbase.info trata precisamente de
este tema.
Por cierto, ya que estamos, ¿alguien me puede contar las diferencias entre
Tsqlquery y Tsqltable?
Un saludico,
Fredy

C

Publicado: Mié Ene 31, 2007 9:45 am
por jose.luis
Fredy,
>
> Yo estoy probando los cursores dinámicos del lado servidor con TSqlTable y
> no me están funcionando, pero aún no estoy muy seguro de si es problema
> mío o de Xailer. En apariencia funciona, pero sólo me recupera el primer
> registro, mientras que si lo uso del lado cliente, funciona bien.
Mi experiencia se reduce a SqlServer y a pruebas ocasionales con MySql.
Pero te puedo asegurar que un Recordset abierto con adUseClient,
adOpenDynamic, adLockOptimistic funciona 'de categoría'. En mis pruebas he
podido mantener perfectamente un cursor de ese tipo sobre unos mil o dos mil
registros con varios terminales 'colgando' del servidor sin mayor problema
que la 'captura inicial' de los registros solicitados.
>
> De todas formas, tienes que cambiar el "chip". En dbf estamos
> acostumbrados a poder acceder a la totalidad de los datos de la tabla y
> una vez abierta, hacer un filtro, localizar datos, etc..
> Para empezar te recomiendo que utilices cursores forward only en tu
> consulta que son más rápidos y te la pases a un memdataset para trabajar
> con los datos. Aunque claro, chocamos con el problema típico de trabajar
> con un snapshot de los datos. (como diría el anuncio, esto no es renault
> ocasión. O citroen en tu caso :) )
Es la mejor opción que he visto hasta ahora. Tiene varias ventajas: son
rápidos o muy rápidos. La clase tMemDataset junto con tDbBrowse son una
maravilla. Y sobre todo: no mantienes un cursor abierto con el servidor.
Independientemente de si el cursor está del lado del servidor o cliente, ese
cursor está vivo. En el primer caso es el servidor quien lo mantiene con la
consiguiente carga extra de trabajo para el mismo. En el segundo caso es
nuestro equipo local quien lo mantiene a base de consultas 'quasi
constantes' al servidor para mantener actualizado nuestro recordset haciendo
que el ancho de banda de nuestra red disminuya.
>
> Por cierto, ya que estamos, ¿alguien me puede contar las diferencias entre
> Tsqlquery y Tsqltable?
>
tSqlQuery te permite poner un SELECT como quieras.
tSqlTable te permite poner un SELECT como quieras o simplemente el nombre de
la tabla.
Saludos,
José Luis Capel

C

Publicado: Mié Ene 31, 2007 9:47 am
por Xevi
Fredy,
Para traer los datos de una Tabla con TSQLQuery...
WITH OBJECT ::oSQLQuery1
:cSelect := "SELECT * FROM acitroen ORDER BY referencia"
:lOpen := .T.
END
Pero con TMemDataSet... ¿Cómo se hace ???
Gracias,
Un Saludo,
Xevi.
"Fredy" <fredy@aglsl.com> escribió en el mensaje
news:[email=a20b86f324848c912e6ade3dc37@news.xailer.com...]a20b86f324848c912e6ade3dc37@news.xailer.com...[/email]
> Hola Xevi,
>
>
> Yo estoy probando los cursores dinámicos del lado servidor con TSqlTable y
> no me están funcionando, pero aún no estoy muy seguro de si es problema
> mío o de Xailer. En apariencia funciona, pero sólo me recupera el primer
> registro, mientras que si lo uso del lado cliente, funciona bien.
>
> De todas formas, tienes que cambiar el "chip". En dbf estamos
> acostumbrados a poder acceder a la totalidad de los datos de la tabla y
> una vez abierta, hacer un filtro, localizar datos, etc..
> En Sql es al reves. Primero decides los datos que te interesan mediande
> el select .. where y luego los recibes. ADO nos permite acercarnos a la
> "filosofía dbf", pero hemos de intentar aplicarla lo menos posible.
>
> Para empezar te recomiendo que utilices cursores forward only en tu
> consulta que son más rápidos y te la pases a un memdataset para trabajar
> con los datos. Aunque claro, chocamos con el problema típico de trabajar
> con un snapshot de los datos. (como diría el anuncio, esto no es renault
> ocasión. O citroen en tu caso :) )
>
> El próximo artículo que publicaré en mundoxbase.info trata precisamente de
> este tema.
>
>
> Por cierto, ya que estamos, ¿alguien me puede contar las diferencias entre
> Tsqlquery y Tsqltable?
>
> Un saludico,
> Fredy
>
>
>

C

Publicado: Mié Ene 31, 2007 10:30 am
por jfgimenez
Fredy,
> Por cierto, ya que estamos, ¿alguien me puede contar las diferencias entre
> Tsqlquery y Tsqltable?
Realmente creo que con ADO no hay prácticamente ninguna diferencia, pero con
otros motores sí la habrá. La idea es que TSqlTable maneje completamente una
tabla, haciéndose cargo de los insert, update y delete sobre la misma. En
cambio, TSqlQuery está pensado para hacer cualquier tipo de consulta pero
sin que la clase maneje las actualizaciones, ya que si el select es de
varias tablas no se pueden realizar dichas actualizaciones automáticamente
(algunos motores pueden hacerlo según qué consulta, pero no podemos darlo
por válido en todos los casos).
En el caso de ADO, esta funcionalidad la aporta el propio "OLE provider",
con sólo cambiar el valor de algunas propiedades. Pero en el caso de otros
motores no es así. P.ej., yo estoy usando SQLite desde hace meses, y tengo
una clase equivalente a TSqlTable que se encarga de tratar una tabla casi
como si fuese una dbf, incluidas actualizaciones. Pero si hago una consulta
compleja tendría que determinar sobre qué tabla se hacen las actualizaciones
(lo que puede llegar a ser un auténtico lio). Por lo tanto, la clase que
equivale a TSqlQuery no incorpora nada relativo a actualizaciones, y con eso
se consigue mayor velocidad y menor consumo de recursos. Y con otros motores
puede pasar exactamente lo mismo.
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info

C

Publicado: Mié Ene 31, 2007 11:14 am
por ignacio
Xevi,
> Asi pues una búsqueda en un Browse que se posicionara en el primer
> registro
> que el campo referencia empiece por "123"... ¿como se haría???
oDataSet:Locate( " REFERENCIA LIKE '123*' " )
Saludos
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com

C

Publicado: Mié Ene 31, 2007 11:16 am
por ignacio
Xevi,
Yo tuve que marcar los siguientes flags para que me funcionase
correctamente:
- Don´t optimize Column width
- Allow Big results
- Safe
- Enable dynamic cursor
- Pad Char to full length
Sobre todo el de 'safe' es imperativo cuando se usa con ADO.
Saludos
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"Fredy" <fredy@aglsl.com> escribió en el mensaje
news:[email=a20b86f324848c912e6ade3dc37@news.xailer.com...]a20b86f324848c912e6ade3dc37@news.xailer.com...[/email]
> Hola Xevi,
>
>
> Yo estoy probando los cursores dinámicos del lado servidor con TSqlTable y
> no me están funcionando, pero aún no estoy muy seguro de si es problema
> mío o de Xailer. En apariencia funciona, pero sólo me recupera el primer
> registro, mientras que si lo uso del lado cliente, funciona bien.
>
> De todas formas, tienes que cambiar el "chip". En dbf estamos
> acostumbrados a poder acceder a la totalidad de los datos de la tabla y
> una vez abierta, hacer un filtro, localizar datos, etc..
> En Sql es al reves. Primero decides los datos que te interesan mediande
> el select .. where y luego los recibes. ADO nos permite acercarnos a la
> "filosofía dbf", pero hemos de intentar aplicarla lo menos posible.
>
> Para empezar te recomiendo que utilices cursores forward only en tu
> consulta que son más rápidos y te la pases a un memdataset para trabajar
> con los datos. Aunque claro, chocamos con el problema típico de trabajar
> con un snapshot de los datos. (como diría el anuncio, esto no es renault
> ocasión. O citroen en tu caso :) )
>
> El próximo artículo que publicaré en mundoxbase.info trata precisamente de
> este tema.
>
>
> Por cierto, ya que estamos, ¿alguien me puede contar las diferencias entre
> Tsqlquery y Tsqltable?
>
> Un saludico,
> Fredy
>
>
>

C

Publicado: Mié Ene 31, 2007 11:20 am
por ignacio
José Luis,
Yo personalmente SOLO recomiendo el uso de TMemDataSets cuando el recordset
es de sólo lectura. Si vamos a editarlo igualmente tiene más sentido
utilizar un dataset normal. La funcionalidad de filtrado, ordenación y
búsqueda que ofrece el MemDataSet también está disponible con ADO.
Además si se utilizan cursores dinámicos por el lado del servidor nuestro
recordset puede reflejar los cambios que se produzcan en el servidor, pero
ojo, que muy pocos servidores SQL lo hacen bien. En mis pruebas sólo SQL
Server.
Un saludo
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"José Luis Capel - Aicom" <jose.luis@iaicom.com> escribió en el mensaje
news:[email=45c056d2@news.xailer.com...]45c056d2@news.xailer.com...[/email]
> Fredy,
>
>>
>> Yo estoy probando los cursores dinámicos del lado servidor con TSqlTable
>> y no me están funcionando, pero aún no estoy muy seguro de si es problema
>> mío o de Xailer. En apariencia funciona, pero sólo me recupera el primer
>> registro, mientras que si lo uso del lado cliente, funciona bien.
>
> Mi experiencia se reduce a SqlServer y a pruebas ocasionales con MySql.
> Pero te puedo asegurar que un Recordset abierto con adUseClient,
> adOpenDynamic, adLockOptimistic funciona 'de categoría'. En mis pruebas
> he podido mantener perfectamente un cursor de ese tipo sobre unos mil o
> dos mil registros con varios terminales 'colgando' del servidor sin mayor
> problema que la 'captura inicial' de los registros solicitados.
>
>>
>> De todas formas, tienes que cambiar el "chip". En dbf estamos
>> acostumbrados a poder acceder a la totalidad de los datos de la tabla y
>> una vez abierta, hacer un filtro, localizar datos, etc..
>
>> Para empezar te recomiendo que utilices cursores forward only en tu
>> consulta que son más rápidos y te la pases a un memdataset para trabajar
>> con los datos. Aunque claro, chocamos con el problema típico de trabajar
>> con un snapshot de los datos. (como diría el anuncio, esto no es renault
>> ocasión. O citroen en tu caso :) )
>
> Es la mejor opción que he visto hasta ahora. Tiene varias ventajas: son
> rápidos o muy rápidos. La clase tMemDataset junto con tDbBrowse son una
> maravilla. Y sobre todo: no mantienes un cursor abierto con el servidor.
> Independientemente de si el cursor está del lado del servidor o cliente,
> ese cursor está vivo. En el primer caso es el servidor quien lo mantiene
> con la consiguiente carga extra de trabajo para el mismo. En el segundo
> caso es nuestro equipo local quien lo mantiene a base de consultas 'quasi
> constantes' al servidor para mantener actualizado nuestro recordset
> haciendo que el ancho de banda de nuestra red disminuya.
>
>>
>> Por cierto, ya que estamos, ¿alguien me puede contar las diferencias
>> entre Tsqlquery y Tsqltable?
>>
>
> tSqlQuery te permite poner un SELECT como quieras.
> tSqlTable te permite poner un SELECT como quieras o simplemente el nombre
> de la tabla.
>
> Saludos,
> José Luis Capel
>
>

C

Publicado: Mié Ene 31, 2007 11:22 am
por ignacio
Xevi,
oMemDatSet:Open( oAdoDataSource:QueryArray( "select ...." ),
aNombresDeCampos )
Saludos
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"Xevi" <xevicomas@gmail.com> escribió en el mensaje
news:45c0577a$[email=1@news.xailer.com...]1@news.xailer.com...[/email]
> Fredy,
>
> Para traer los datos de una Tabla con TSQLQuery...
> WITH OBJECT ::oSQLQuery1
> :cSelect := "SELECT * FROM acitroen ORDER BY referencia"
> :lOpen := .T.
> END
>
> Pero con TMemDataSet... ¿Cómo se hace ???
>
> Gracias,
>
> Un Saludo,
> Xevi.
>
>
> "Fredy" <fredy@aglsl.com> escribió en el mensaje
> news:[email=a20b86f324848c912e6ade3dc37@news.xailer.com...]a20b86f324848c912e6ade3dc37@news.xailer.com...[/email]
>> Hola Xevi,
>>
>>
>> Yo estoy probando los cursores dinámicos del lado servidor con TSqlTable
>> y no me están funcionando, pero aún no estoy muy seguro de si es problema
>> mío o de Xailer. En apariencia funciona, pero sólo me recupera el primer
>> registro, mientras que si lo uso del lado cliente, funciona bien.
>>
>> De todas formas, tienes que cambiar el "chip". En dbf estamos
>> acostumbrados a poder acceder a la totalidad de los datos de la tabla y
>> una vez abierta, hacer un filtro, localizar datos, etc..
>> En Sql es al reves. Primero decides los datos que te interesan mediande
>> el select .. where y luego los recibes. ADO nos permite acercarnos a la
>> "filosofía dbf", pero hemos de intentar aplicarla lo menos posible.
>>
>> Para empezar te recomiendo que utilices cursores forward only en tu
>> consulta que son más rápidos y te la pases a un memdataset para trabajar
>> con los datos. Aunque claro, chocamos con el problema típico de trabajar
>> con un snapshot de los datos. (como diría el anuncio, esto no es renault
>> ocasión. O citroen en tu caso :) )
>>
>> El próximo artículo que publicaré en mundoxbase.info trata precisamente
>> de este tema.
>>
>>
>> Por cierto, ya que estamos, ¿alguien me puede contar las diferencias
>> entre Tsqlquery y Tsqltable?
>>
>> Un saludico,
>> Fredy
>>
>>
>>
>
>

C

Publicado: Mié Ene 31, 2007 11:23 am
por Fredy
Hola,
Buena pregunta!
Accediendo directamente con ADO puedes user el método GetRows del dataset,
que te lo devuelve en forma de array.
Con los datacontrols la verdad es que no sé como se hace. No sé si se podrá
acceder directamente al recorset o habrá algún método similar para hacerlo.
Un saludico,
Fredy

C

Publicado: Mié Ene 31, 2007 11:24 am
por ignacio
Fredy,
Ya contestado a Xevi.
Un saludo
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"Fredy" <fredy@aglsl.com> escribió en el mensaje
news:[email=a20b86f324b48c91341557abf18@news.xailer.com...]a20b86f324b48c91341557abf18@news.xailer.com...[/email]
> Hola,
>
> Buena pregunta!
>
> Accediendo directamente con ADO puedes user el método GetRows del dataset,
> que te lo devuelve en forma de array.
>
> Con los datacontrols la verdad es que no sé como se hace. No sé si se
> podrá acceder directamente al recorset o habrá algún método similar para
> hacerlo.
>
>
>
> Un saludico,
> Fredy
>
>
>

C

Publicado: Mié Ene 31, 2007 11:36 am
por jose.luis
Ignacio,
>
> Yo personalmente SOLO recomiendo el uso de TMemDataSets cuando el
> recordset es de sólo lectura. Si vamos a editarlo igualmente tiene más
> sentido utilizar un dataset normal. La funcionalidad de filtrado,
> ordenación y búsqueda que ofrece el MemDataSet también está disponible con
> ADO.
>
El caso más habitual es, por ejemplo, mostrar un browse de clientes. Para
este caso y otros similares normalmente traes las columnas que vas a mostrar
(sería un absurdo traerse TODO el registro si solo vas a mostrar 4 ó 5
columnas). Y si vas a editar ese registro deberás traertelo en un recordset
para editarlo.
Por lo tanto, entiendo que mostrar un browse con, por ejemplo, 5000
registros de cuatro columnas es más rápido que mostrar ese mismo browse con
toooodas las columnas. En mis pruebas con SqlServer hacer esto:
SELECT micampo1, micampo2, micampo3, micampo4 FROM Cliente
Para una tabla de 1500 clientes, haciendo las siguientes operaciones:
Crear recordset tipo server/fordwardonly
Con GetRows, traspasarlo a un array de xharbour
Añadir ese array a un MemDataSet
Mostrarlo en pantalla
Escasamente 1.2 segundos
Saludos,
José Luis Capel
PD: esto es solo mi humilde opinión

C

Publicado: Mié Ene 31, 2007 12:36 pm
por Fredy
Hola,
> Mi experiencia se reduce a SqlServer y a pruebas ocasionales con
> MySql. Pero te puedo asegurar que un Recordset abierto con
> adUseClient, adOpenDynamic, adLockOptimistic funciona 'de categorí­a'.
Si abro la bbdd y el recorset directamente con toleauto funciona ok
El problema lo tengo con los datacontrol
Si creo:
AdoDataSource adUseServer
SqlTable adUseServer adOpenDynamic
DbBrowse enlazado al sqlTable
Me lo abre bien, pero sólo me muestra el primer registro de la tabla.
No tengo sqlserver instalado. ¿Alguien lo puede probar con mysql o sqlserver
a ver si le pasa lo mismo o es cosa mí­a?
Un saludico,
Fredy

C

Publicado: Mié Ene 31, 2007 1:13 pm
por ignacio
Fredy,
A mi pasa lo mismo tanto con MySql como con SQL Server. El problema surge
porque la propiedad RecordCount de Ado devuelve -1, que significa que no
puede determinar el número de filas en el cursor. De igual forma falla
incluso la propiedd Bookmark de Ado que devuelve el equivalente al Recno.
En principio con esa configuración de cursores y servidor está muy
complicado utilizarlo con un DBBrowse. Puedes comprobar sin embargo como el
siguient código funciona perfectamente:
WITH OBJECT oDataSet :nCursorLocation := adUseServer
DO WHILE !:Eof()
::oMemo1:Append( ToString( :FieldGet(1) ) + " ; " + :FieldGet( 2 )
+ " ; " + CRLF )
:Skip()
ENDDO
END WITH
Compruebo que simplemente poniendo la propiedad DataSource:nCursorLocation a
adUseClient, e incluso poniendo en el dataset que el cursor es por el lado
del servidor en su propiedad nCursorLocation ya funciona correctamente y
seguramente consigas la funcionalidad que necesitas.
Un saludo,
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"Fredy" <fredy@aglsl.com> escribió en el mensaje
news:[email=a20b86f324c58c9134b9a01ceb0@news.xailer.com...]a20b86f324c58c9134b9a01ceb0@news.xailer.com...[/email]
> Hola,
>
>
>> Mi experiencia se reduce a SqlServer y a pruebas ocasionales con
>> MySql. Pero te puedo asegurar que un Recordset abierto con
>> adUseClient, adOpenDynamic, adLockOptimistic funciona 'de categoría'.
>
> Si abro la bbdd y el recorset directamente con toleauto funciona ok
>
> El problema lo tengo con los datacontrol Si creo:
> AdoDataSource adUseServer
> SqlTable adUseServer adOpenDynamic
> DbBrowse enlazado al sqlTable
>
> Me lo abre bien, pero sólo me muestra el primer registro de la tabla.
>
> No tengo sqlserver instalado. ¿Alguien lo puede probar con mysql o
> sqlserver a ver si le pasa lo mismo o es cosa mía?
>
>
> Un saludico,
> Fredy
>
>
>

C

Publicado: Mié Ene 31, 2007 3:02 pm
por Fredy
Ignacio,
Tal y como dices se muestran los datos en el browse pero si otro usuario
modifica la información ésta no queda reflejada en el browse, que es lo que
estoy buscando con los cursores dinámicos
Un saludico,
Fredy
> Fredy,
>
> A mi pasa lo mismo tanto con MySql como con SQL Server. El problema
> surge porque la propiedad RecordCount de Ado devuelve -1, que
> significa que no puede determinar el número de filas en el cursor. De
> igual forma falla incluso la propiedd Bookmark de Ado que devuelve el
> equivalente al Recno.
>
> En principio con esa configuración de cursores y servidor está muy
> complicado utilizarlo con un DBBrowse. Puedes comprobar sin embargo
> como el siguient código funciona perfectamente:
>
> WITH OBJECT oDataSet :nCursorLocation := adUseServer
> DO WHILE !:Eof()
> ::oMemo1:Append( ToString( :FieldGet(1) ) + " ; " +
> :FieldGet( 2 )
> + " ; " + CRLF )
> :Skip()
> ENDDO
> END WITH
> Compruebo que simplemente poniendo la propiedad
> DataSource:nCursorLocation a adUseClient, e incluso poniendo en el
> dataset que el cursor es por el lado del servidor en su propiedad
> nCursorLocation ya funciona correctamente y seguramente consigas la
> funcionalidad que necesitas.
>
> Un saludo,
>
> "Fredy" <fredy@aglsl.com> escribió en el mensaje
> news:[email=a20b86f324c58c9134b9a01ceb0@news.xailer.com...]a20b86f324c58c9134b9a01ceb0@news.xailer.com...[/email]
>
>> Hola,
>>
>>> Mi experiencia se reduce a SqlServer y a pruebas ocasionales con
>>> MySql. Pero te puedo asegurar que un Recordset abierto con
>>> adUseClient, adOpenDynamic, adLockOptimistic funciona 'de
>>> categorí­a'.
>>>
>> Si abro la bbdd y el recorset directamente con toleauto funciona ok
>>
>> El problema lo tengo con los datacontrol Si creo:
>> AdoDataSource adUseServer
>> SqlTable adUseServer adOpenDynamic
>> DbBrowse enlazado al sqlTable
>> Me lo abre bien, pero sólo me muestra el primer registro de la tabla.
>>
>> No tengo sqlserver instalado. ¿Alguien lo puede probar con mysql o
>> sqlserver a ver si le pasa lo mismo o es cosa mí­a?
>>
>> Un saludico,
>> Fredy

C

Publicado: Mié Ene 31, 2007 4:25 pm
por Xevi
Ignacio,
Gracias por tu respuesta.
Funciona perfecto. Así pues ya puedo seguir con MySQL.
¿Alguna recomendación de lectura sobre MySQL o lenguaje SQL???
Gracias.
Un Saludo,
Xevi.
"Ignacio Ortiz de Zúñiga" <NoName@xailer.com> escribió en el mensaje
news:45c06c29$[email=1@news.xailer.com...]1@news.xailer.com...[/email]
> Xevi,
>
>> Asi pues una búsqueda en un Browse que se posicionara en el primer
>> registro
>> que el campo referencia empiece por "123"... ¿como se haría???
>
> oDataSet:Locate( " REFERENCIA LIKE '123*' " )
>
> Saludos
>
> --
> Ignacio Ortiz de Zúñiga
> http://www.xailer.com
>

C

Publicado: Mié Ene 31, 2007 5:43 pm
por ignacio
Fredy,
He estado haciendo alguna prueba más y compruebo que con SQL Server si
funciona perfectamente la actualización de datos y la visualización del
DBBrowse utilizando nCursorType == adOpenKeySet con cursores del lado del
servidor. Desgraciadamente con MySQL no va.
Sólo se me ocurre que utilices un timer con Refresh() o RefreshCurrent()
Un saludo
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"Fredy" <fredy@aglsl.com> escribió en el mensaje
news:[email=a20b86f324de8c9135fec0a28d8@news.xailer.com...]a20b86f324de8c9135fec0a28d8@news.xailer.com...[/email]
> Ignacio,
>
> Tal y como dices se muestran los datos en el browse pero si otro usuario
> modifica la información ésta no queda reflejada en el browse, que es lo
> que estoy buscando con los cursores dinámicos
>
> Un saludico,
> Fredy
>
>> Fredy,
>>
>> A mi pasa lo mismo tanto con MySql como con SQL Server. El problema
>> surge porque la propiedad RecordCount de Ado devuelve -1, que
>> significa que no puede determinar el número de filas en el cursor. De
>> igual forma falla incluso la propiedd Bookmark de Ado que devuelve el
>> equivalente al Recno.
>>
>> En principio con esa configuración de cursores y servidor está muy
>> complicado utilizarlo con un DBBrowse. Puedes comprobar sin embargo
>> como el siguient código funciona perfectamente:
>>
>> WITH OBJECT oDataSet :nCursorLocation := adUseServer
>> DO WHILE !:Eof()
>> ::oMemo1:Append( ToString( :FieldGet(1) ) + " ; " +
>> :FieldGet( 2 )
>> + " ; " + CRLF )
>> :Skip()
>> ENDDO
>> END WITH
>> Compruebo que simplemente poniendo la propiedad
>> DataSource:nCursorLocation a adUseClient, e incluso poniendo en el
>> dataset que el cursor es por el lado del servidor en su propiedad
>> nCursorLocation ya funciona correctamente y seguramente consigas la
>> funcionalidad que necesitas.
>>
>> Un saludo,
>>
>> "Fredy" <fredy@aglsl.com> escribió en el mensaje
>> news:[email=a20b86f324c58c9134b9a01ceb0@news.xailer.com...]a20b86f324c58c9134b9a01ceb0@news.xailer.com...[/email]
>>
>>> Hola,
>>>
>>>> Mi experiencia se reduce a SqlServer y a pruebas ocasionales con
>>>> MySql. Pero te puedo asegurar que un Recordset abierto con
>>>> adUseClient, adOpenDynamic, adLockOptimistic funciona 'de
>>>> categoría'.
>>>>
>>> Si abro la bbdd y el recorset directamente con toleauto funciona ok
>>>
>>> El problema lo tengo con los datacontrol Si creo:
>>> AdoDataSource adUseServer
>>> SqlTable adUseServer adOpenDynamic
>>> DbBrowse enlazado al sqlTable
>>> Me lo abre bien, pero sólo me muestra el primer registro de la tabla.
>>>
>>> No tengo sqlserver instalado. ¿Alguien lo puede probar con mysql o
>>> sqlserver a ver si le pasa lo mismo o es cosa mía?
>>>
>>> Un saludico,
>>> Fredy
>
>
>

C

Publicado: Mié Ene 31, 2007 6:05 pm
por jose.luis
Hola,
Solo por hacer una puntualización.
Si utilizamos cursores lado servidor, es ese servidor quien da la
funcionalidad.
Si usamos cursores lado cliente, es ADO quien intenta (siempre que el
proveedor oledb/odbc lo permita) simular la funcionalidad.
Siempre podemos consultar el método supports y ver cuales capacidades tiene
ese cursor/tipocursor/tipobloqueo elegido para el recordset.
Saludos,
José Luis Capel
"Ignacio Ortiz de Zúñiga" <NoName@xailer.com> escribió en el mensaje
news:45c0c722$[email=1@news.xailer.com...]1@news.xailer.com...[/email]
> Fredy,
>
> He estado haciendo alguna prueba más y compruebo que con SQL Server si
> funciona perfectamente la actualización de datos y la visualización del
> DBBrowse utilizando nCursorType == adOpenKeySet con cursores del lado del
> servidor. Desgraciadamente con MySQL no va.
>
> Sólo se me ocurre que utilices un timer con Refresh() o RefreshCurrent()
>
> Un saludo
>
> --
> Ignacio Ortiz de Zúñiga
> http://www.xailer.com
>
>
> "Fredy" <fredy@aglsl.com> escribió en el mensaje
> news:[email=a20b86f324de8c9135fec0a28d8@news.xailer.com...]a20b86f324de8c9135fec0a28d8@news.xailer.com...[/email]
>> Ignacio,
>>
>> Tal y como dices se muestran los datos en el browse pero si otro usuario
>> modifica la información ésta no queda reflejada en el browse, que es lo
>> que estoy buscando con los cursores dinámicos
>>
>> Un saludico,
>> Fredy
>>
>>> Fredy,
>>>
>>> A mi pasa lo mismo tanto con MySql como con SQL Server. El problema
>>> surge porque la propiedad RecordCount de Ado devuelve -1, que
>>> significa que no puede determinar el número de filas en el cursor. De
>>> igual forma falla incluso la propiedd Bookmark de Ado que devuelve el
>>> equivalente al Recno.
>>>
>>> En principio con esa configuración de cursores y servidor está muy
>>> complicado utilizarlo con un DBBrowse. Puedes comprobar sin embargo
>>> como el siguient código funciona perfectamente:
>>>
>>> WITH OBJECT oDataSet :nCursorLocation := adUseServer
>>> DO WHILE !:Eof()
>>> ::oMemo1:Append( ToString( :FieldGet(1) ) + " ; " +
>>> :FieldGet( 2 )
>>> + " ; " + CRLF )
>>> :Skip()
>>> ENDDO
>>> END WITH
>>> Compruebo que simplemente poniendo la propiedad
>>> DataSource:nCursorLocation a adUseClient, e incluso poniendo en el
>>> dataset que el cursor es por el lado del servidor en su propiedad
>>> nCursorLocation ya funciona correctamente y seguramente consigas la
>>> funcionalidad que necesitas.
>>>
>>> Un saludo,
>>>
>>> "Fredy" <fredy@aglsl.com> escribió en el mensaje
>>> news:[email=a20b86f324c58c9134b9a01ceb0@news.xailer.com...]a20b86f324c58c9134b9a01ceb0@news.xailer.com...[/email]
>>>
>>>> Hola,
>>>>
>>>>> Mi experiencia se reduce a SqlServer y a pruebas ocasionales con
>>>>> MySql. Pero te puedo asegurar que un Recordset abierto con
>>>>> adUseClient, adOpenDynamic, adLockOptimistic funciona 'de
>>>>> categoría'.
>>>>>
>>>> Si abro la bbdd y el recorset directamente con toleauto funciona ok
>>>>
>>>> El problema lo tengo con los datacontrol Si creo:
>>>> AdoDataSource adUseServer
>>>> SqlTable adUseServer adOpenDynamic
>>>> DbBrowse enlazado al sqlTable
>>>> Me lo abre bien, pero sólo me muestra el primer registro de la tabla.
>>>>
>>>> No tengo sqlserver instalado. ¿Alguien lo puede probar con mysql o
>>>> sqlserver a ver si le pasa lo mismo o es cosa mía?
>>>>
>>>> Un saludico,
>>>> Fredy
>>
>>
>>
>
>

C

Publicado: Mié Abr 25, 2007 1:11 am
por pablogarciau
Jose F. Gimenez escribió:
> En el caso de ADO, esta funcionalidad la aporta el propio "OLE provider",
> con sólo cambiar el valor de algunas propiedades. Pero en el caso de otros
> motores no es así­. P.ej., yo estoy usando SQLite desde hace meses, y tengo
> una clase equivalente a TSqlTable que se encarga de tratar una tabla casi
> como si fuese una dbf, incluidas actualizaciones. Pero si hago una consulta
> compleja tendrí­a que determinar sobre qué tabla se hacen las actualizaciones
> (lo que puede llegar a ser un auténtico lio). Por lo tanto, la clase que
> equivale a TSqlQuery no incorpora nada relativo a actualizaciones, y con eso
> se consigue mayor velocidad y menor consumo de recursos. Y con otros motores
> puede pasar exactamente lo mismo.
>
Jose, refiriendome a la clase que comentas, ¿ Me la podrias facilitar
para adaptarla a MySQL ? o tendras algo parecido para MySQL via ADO, me
refiero a poder tratar una tabla como una Dbf tal como sucede con un
ODBCDAtaSource que hace el manejo en dbf temporales, me interesa por el
uso de indices y seeks
Realmente te agradeceria que me apoyaras con dicha clase
Saludos

C

Publicado: Mié Abr 25, 2007 10:12 am
por jfgimenez
Juan Pablo,
> Jose, refiriendome a la clase que comentas, ¿ Me la podrias facilitar para
> adaptarla a MySQL ? o tendras algo parecido para MySQL via ADO, me refiero
> a poder tratar una tabla como una Dbf tal como sucede con un
> ODBCDAtaSource que hace el manejo en dbf temporales, me interesa por el
> uso de indices y seeks
Con ADO puedes usar TSQLTable y TSQLQuery para este fin. Revisa la
documentación.
Y respecto a SQLite y MySQL, estamos trabajando para que funcione
prácticamente igual que el datasource de ADO.
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info