Page 1 of 1

TDolphin y FWH

PostPosted: Mon Sep 28, 2015 10:05 pm
by FiveWiDi
Hola a todos,

A alguién le ha pasado que estas instruciones no le funcionen:

oQry:FieldPut( "REFESOLI", 91 )
If oQry:Save()
../ .. lo que sea
EndIf

Estoy usando TDolphin para acceder, consultar, modificar y borrar datos de una BB.DD. MySql, ayer funcionaba correctamente y hoy pués no.
El oQry:Save() está dando .T. pero accedo a los datos y no se ha modificado nada.

Y si pruebo con oConDB:Query( "UPDATE latabla SET REFESOLI = 91" ) revienta el programa con un error de Windows

No se por donde tirar.

Gracias,

Re: TDolphin y FWH

PostPosted: Tue Sep 29, 2015 10:14 am
by Biel EA6DD
Cual es la sentencia SELECT, y la clave primaria.

"UPDATE latabla SET REFESOLI = 91 "
Esto cambiaria todos los registros de la tabla.

Con un gestor tipo HeidiSQL, puedes probar las sentencias SQL de manera interactiva, y de no ser correcta se visualizará el error, dándote alguna pista de lo que está mal.

Re: TDolphin y FWH

PostPosted: Tue Sep 29, 2015 10:38 pm
by FiveWiDi
Biel EA6DD wrote:Cual es la sentencia SELECT, y la clave primaria.

"UPDATE latabla SET REFESOLI = 91 "
Esto cambiaria todos los registros de la tabla.

Con un gestor tipo HeidiSQL, puedes probar las sentencias SQL de manera interactiva, y de no ser correcta se visualizará el error, dándote alguna pista de lo que está mal.


Gracias Biel,

Si, ya sé que se cambiarían todos los registros a 91,pero es sólo una pureba
No tiene clave primaria y las sentencias que le preceden son:

cSqlA := "SELECT * FROM latabla WHERE (TIPUSOLI = 'A' OR TIPUSOLI = 'B') AND ESTAT = 1 LIMIT 1"
(Pongo 'LIMIT 1' porque quiero trabajar registro a registro).

oQry := oConDB:Query( cSqlA )

While oQry:nRecCount > 0

../... resto de código.
oQry := oConDB:Query( cSqlA )
End

El flujo del programa entra en el 'While' y cuando llega a la instrucción que cambia REFESOLI=91 antes del nuevo oQry antes del End, pués peta.

Sigo haciendo variaciones a ve si doy con ello y además entiendo lo que pasa.

Re: TDolphin y FWH

PostPosted: Wed Sep 30, 2015 1:31 pm
by Hector Pedro Lerda
Buen día colega,
De los problemas que planteas a mi entender deberias:

FiveWiDi wrote:No tiene clave primaria y las sentencias que le preceden son:

cSqlA := "SELECT * FROM latabla WHERE (TIPUSOLI = 'A' OR TIPUSOLI = 'B') AND ESTAT = 1 LIMIT 1"
(Pongo 'LIMIT 1' porque quiero trabajar registro a registro).


La clave primaria es fundamental para la modificación UPDATE y el borrado DELETE de registros específicos que no idéntifi
End[/quote]cas a través de un WHERE directo, por cual agrega una clave primaria autoincremental y después hace este tipo de pruebas, la referencia se hará sola.

[quote="FiveWiDi"]cSqlA := "SELECT * FROM latabla WHERE (TIPUSOLI = 'A' OR TIPUSOLI = 'B') AND ESTAT = 1 LIMIT 1"
(Pongo 'LIMIT 1' porque quiero trabajar registro a registro).

oQry := oConDB:Query( cSqlA )

While oQry:nRecCount > 0

../... resto de código.
oQry := oConDB:Query( cSqlA )

Acá si en la sentencia colocas LIMIT 1 te va a traer un solo registro, o sea que el while que haces después lo debes cambiar por un if y ademas siempre se va a traer al primero que encuentre que puede ser el mismo que antes.
Y como tu dices te peta es porque no haces un skip en los datos se queda trabado en el primero.

Saludos y espero te sea de ayuda.

Re: TDolphin y FWH

PostPosted: Wed Sep 30, 2015 3:28 pm
by xmanuel
Bueno, yo no uso TDolphi. Lo mío es Eagle1 ;-)
Aún así a ver si te puedo ayudar...

Code: Select all  Expand view

cSqlA := "SELECT * FROM latabla WHERE (TIPUSOLI = 'A' OR TIPUSOLI = 'B') AND ESTAT = 1 LIMIT 1"
(Pongo 'LIMIT 1' porque quiero trabajar registro a registro).

oQry := oConDB:Query( cSqlA )

While oQry:nRecCount > 0

../... resto de código.
// Pon esto a lo peor se está recargando la memoria:
oQry:end()
oQry := oConDB:Query( cSqlA )
End
 


El select lo podrías hacer más fácil así:
Code: Select all  Expand view

cSqlA := "SELECT * FROM latabla WHERE TIPUSOLI IN ( 'A', 'B') AND ESTAT = 1 LIMIT 1"
 


Además como te dice Hector P. siempre vas a traer la primera que cumpla la sentencia.
Si quieres que te traiga las siguientes cambia a esto otro:

Code: Select all  Expand view

local inc := 0 // Pon esta variable
...
cSqlA := "SELECT * FROM latabla WHERE TIPUSOLI IN ( 'A', 'B') AND ESTAT = 1 LIMIT "  // fijate que termino en LIMIT sin parametro

oQry := oConDB:Query( cSqlA + str( inc ) + ", 1" ) // Fijate aqui

While oQry:nRecCount > 0


../... resto de código.

oQry:end()
oQry := oConDB:Query( cSqlA + str( ++inc ) + ", 1" ) // Mira aqui
End

 


Espero que valga, y si tienes dudas dimelo, OK

Saludos de Manu Exposito :P

Re: TDolphin y FWH

PostPosted: Wed Sep 30, 2015 4:15 pm
by FiveWiDi
Héctor, Manu,

Muchas gracias a ambos por el interés.
Esta noche empezaré a probar de nuevo teniendo en cuenta vuestros consejos.

Re: TDolphin y FWH

PostPosted: Thu Oct 01, 2015 1:56 am
by joseluisysturiz
Hector Pedro Lerda wrote:Buen día colega,
De los problemas que planteas a mi entender deberias:

FiveWiDi wrote:No tiene clave primaria y las sentencias que le preceden son:

cSqlA := "SELECT * FROM latabla WHERE (TIPUSOLI = 'A' OR TIPUSOLI = 'B') AND ESTAT = 1 LIMIT 1"
(Pongo 'LIMIT 1' porque quiero trabajar registro a registro).


La clave primaria es fundamental para la modificación UPDATE y el borrado DELETE de registros específicos que no idéntifi
End
cas a través de un WHERE directo, por cual agrega una clave primaria autoincremental y después hace este tipo de pruebas, la referencia se hará sola.

FiveWiDi wrote:cSqlA := "SELECT * FROM latabla WHERE (TIPUSOLI = 'A' OR TIPUSOLI = 'B') AND ESTAT = 1 LIMIT 1"
(Pongo 'LIMIT 1' porque quiero trabajar registro a registro).

oQry := oConDB:Query( cSqlA )

While oQry:nRecCount > 0

../... resto de código.
oQry := oConDB:Query( cSqlA )

Acá si en la sentencia colocas LIMIT 1 te va a traer un solo registro, o sea que el while que haces después lo debes cambiar por un if y ademas siempre se va a traer al primero que encuentre que puede ser el mismo que antes.
Y como tu dices te peta es porque no haces un skip en los datos se queda trabado en el primero.

Saludos y espero te sea de ayuda.


Lo de la clave primaria dependeria si no se requiere duplicidad de registros, como por lo menos un maestro de productos, de clientes, etc..en cambio no seria necesaria para los movimientos de los productos..por decir algo, todo dependera de lo que se requiera, saludos... :shock:

Re: TDolphin y FWH

PostPosted: Thu Oct 01, 2015 11:44 am
by Hector Pedro Lerda
FiveWiDi wrote:Lo de la clave primaria dependeria si no se requiere duplicidad de registros, como por lo menos un maestro de productos, de clientes, etc..en cambio no seria necesaria para los movimientos de los productos..por decir algo, todo dependera de lo que se requiera, saludos...


La clave primaria en modo autoincremental identifica al registro de la tabla, si queremos tener indices únicos los podemos crear sin necesidad de que sean primarios, cuando se tiene mucho volumen de datos es fundamental poder identificar un REGISTRO UNICO, no es solo para tablas maestras, dados que los UPDATE y DELETE son muy comunes en este tipo de tablas, si quisiera modificar o eliminar registros de una base donde los datos en los campos se repiten, si no tengo la identificación individual es imposible.
Para tablas donde no todos los datos son iguales la cadena de identificación única para un registro despues de del where (and ... or ...in()..=...) siempre va a ser mas complicada que un simple where id_XXXX = XXXXX que da la seguridad de no fallar.
Igual son formas de pensar y trabajar.
Saludos Pedro lerda

Re: TDolphin y FWH

PostPosted: Thu Oct 01, 2015 1:08 pm
by joseluisysturiz
Hector Pedro Lerda wrote:
FiveWiDi wrote:Lo de la clave primaria dependeria si no se requiere duplicidad de registros, como por lo menos un maestro de productos, de clientes, etc..en cambio no seria necesaria para los movimientos de los productos..por decir algo, todo dependera de lo que se requiera, saludos...


La clave primaria en modo autoincremental identifica al registro de la tabla, si queremos tener indices únicos los podemos crear sin necesidad de que sean primarios, cuando se tiene mucho volumen de datos es fundamental poder identificar un REGISTRO UNICO, no es solo para tablas maestras, dados que los UPDATE y DELETE son muy comunes en este tipo de tablas, si quisiera modificar o eliminar registros de una base donde los datos en los campos se repiten, si no tengo la identificación individual es imposible.
Para tablas donde no todos los datos son iguales la cadena de identificación única para un registro despues de del where (and ... or ...in()..=...) siempre va a ser mas complicada que un simple where id_XXXX = XXXXX que da la seguridad de no fallar.
Igual son formas de pensar y trabajar.
Saludos Pedro lerda

Estamos claros en ese punto, sin polemica no seria un campo de llave primaria, solo un campo asociativo para relacion con la tabla maestra, es a lo que me queria referir, el hacer un campo autoincremento para mi es solo tener un campo mas, ya que para realizar un delete o update lo haria por el campo relacionado a la tabla maestra y no por el campo auto...de todos modos entre gustos y colores, jejeje...es bueno igual tener y saber diferentes alternativas y formas de trabajar, saludos... :shock: