FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour TDolphin y FWH
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
TDolphin y FWH
Posted: Mon Sep 28, 2015 10:05 PM

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,

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 682
Joined: Tue Feb 14, 2006 09:48 AM
Re: TDolphin y FWH
Posted: Tue Sep 29, 2015 10:14 AM

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.

Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: TDolphin y FWH
Posted: Tue Sep 29, 2015 10:38 PM
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.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 46
Joined: Tue May 07, 2013 07:27 PM
Re: TDolphin y FWH
Posted: Wed Sep 30, 2015 01:31 PM
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
Endcas 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.
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: TDolphin y FWH
Posted: Wed Sep 30, 2015 03:28 PM
Bueno, yo no uso TDolphi. Lo mío es Eagle1 :-)
Aún así a ver si te puedo ayudar...

Code (fw): Select all Collapse
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 (fw): Select all Collapse
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 (fw): Select all Collapse
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 :-)
______________________________________________________________________________

Sevilla - Andalucía
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: TDolphin y FWH
Posted: Wed Sep 30, 2015 04:15 PM

Héctor, Manu,

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

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: TDolphin y FWH
Posted: Thu Oct 01, 2015 01:56 AM
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... :-)
Dios no está muerto...



Gracias a mi Dios ante todo!
Posts: 46
Joined: Tue May 07, 2013 07:27 PM
Re: TDolphin y FWH
Posted: Thu Oct 01, 2015 11:44 AM
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
Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: TDolphin y FWH
Posted: Thu Oct 01, 2015 01:08 PM
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... :-)
Dios no está muerto...



Gracias a mi Dios ante todo!

Continue the discussion