TDolphin error oQry:Save()

User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

TDolphin error oQry:Save()

Post by Sebastián Almirón »

Hola,

En un proceso de insertar un registro en una tabla, algo tan simple como:

ccadena := 'select * from ps_product'
oQry := oServer:Query(ccadena )
oQry:GetBlankRow(.f.)
oQry:Save()
oQry:end()

me arroja un error:
Error description: Error MYSQL/1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'condition='new',show_price=1,indexed=0,visibility='both',cache_is_pack=0,cache_h' at line 1

El caso es que en otras tablas, algo similar no me da error, si bien es cierto que la tabla ps_product tiene muchos más campos que otras que estoy utilizando, en total tiene 44 campos y algunos con unos nombre muy largos (es la tabla ps_product de Prestashop)
¿Tendrá eso algo que ver ?

Saludos
User avatar
cmsoft
Posts: 653
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: TDolphin error oQry:Save()

Post by cmsoft »

Hola Sebastian:
Posiblemente no tengas _ no null en la tabla, y con esa instruccion dejas todos _ en blancos e intentas grabar. Tal vez venga por ahí el error.
User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: TDolphin error oQry:Save()

Post by Sebastián Almirón »

Hola, efectivamente el problema es en un campo no null, en concreto el campo condition, que es de tipo enum('new','used','refurbished') con un valor predeterminado de new.

He ejecutado en phpMyAdmin la consulta que genera tdolpsrv en el método SQLQuery y falla en condition = ''.

Ahora la pregunta de ignorante:
¿Como doy a oQry:condition el valor new ?, si pongo oQry:condition = 'new' tambien falla.

Gracias por tu tiempo, saludos

cmsoft wrote:Hola Sebastian:
Posiblemente no tengas _ no null en la tabla, y con esa instruccion dejas todos _ en blancos e intentas grabar. Tal vez venga por ahí el error.
User avatar
cmsoft
Posts: 653
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: TDolphin error oQry:Save()

Post by cmsoft »

No se si es la forma mas adecuada, pero funciona.

Code: Select all

base := oQry:GetBlankRow()
base:condition := "new"
oQry:oRow := base
oQry:Save()
User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: TDolphin error oQry:Save()

Post by Sebastián Almirón »

Gracias, acabo de solucionarlo con:
ccadena := "INSERT INTO ps_product(reference) VALUES('123456')"
oServer:Execute(ccadena)

Esto que me sugieres, a mi no me funcionaba
Gracias



cmsoft wrote:No se si es la forma mas adecuada, pero funciona.

Code: Select all

base := oQry:GetBlankRow()
base:condition := "new"
oQry:oRow := base
oQry:Save()
User avatar
Marcelo Roggeri
Posts: 275
Joined: Sat Jul 22, 2006 9:04 pm
Location: Venado Tuerto - Santa Fe -Argentina
Contact:

Re: TDolphin error oQry:Save()

Post by Marcelo Roggeri »

Hola Sebastian podrias poner la cadena de creación de la estructura de la tabla? tal cual la creaste si es que lo hiciste por código.
Saludos
Marcelo
FWH - Harbour - BCC7 - PellesC - FivEdit (Cristobal Navarro)
User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: TDolphin error oQry:Save()

Post by Sebastián Almirón »

Hola Marcelo,
La estructura no la cree yo, como he indicado se trata de una base de datos Prestashop y se crea durante la instalación de este, pero en PhpMyAdmin es así:

CREATE TABLE `ps_product` (
`id_product` int(10) unsigned NOT NULL auto_increment,
`id_supplier` int(10) unsigned default NULL,
`id_manufacturer` int(10) unsigned default NULL,
`id_category_default` int(10) unsigned default NULL,
`id_shop_default` int(10) unsigned NOT NULL default '1',
`id_tax_rules_group` int(11) unsigned NOT NULL,
`on_sale` tinyint(1) unsigned NOT NULL default '0',
`online_only` tinyint(1) unsigned NOT NULL default '0',
`ean13` varchar(13) default NULL,
`upc` varchar(12) default NULL,
`ecotax` decimal(17,6) NOT NULL default '0.000000',
`quantity` int(10) NOT NULL default '0',
`minimal_quantity` int(10) unsigned NOT NULL default '1',
`price` decimal(20,6) NOT NULL default '0.000000',
`wholesale_price` decimal(20,6) NOT NULL default '0.000000',
`unity` varchar(255) default NULL,
`unit_price_ratio` decimal(20,6) NOT NULL default '0.000000',
`additional_shipping_cost` decimal(20,2) NOT NULL default '0.00',
`reference` varchar(32) default NULL,
`supplier_reference` varchar(32) default NULL,
`location` varchar(64) default NULL,
`width` decimal(20,6) NOT NULL default '0.000000',
`height` decimal(20,6) NOT NULL default '0.000000',
`depth` decimal(20,6) NOT NULL default '0.000000',
`weight` decimal(20,6) NOT NULL default '0.000000',
`out_of_stock` int(10) unsigned NOT NULL default '2',
`quantity_discount` tinyint(1) default '0',
`customizable` tinyint(2) NOT NULL default '0',
`uploadable_files` tinyint(4) NOT NULL default '0',
`text_fields` tinyint(4) NOT NULL default '0',
`active` tinyint(1) unsigned NOT NULL default '0',
`available_for_order` tinyint(1) NOT NULL default '1',
`available_date` date NOT NULL,
`condition` enum('new','used','refurbished') NOT NULL default 'new',
`show_price` tinyint(1) NOT NULL default '1',
`indexed` tinyint(1) NOT NULL default '0',
`visibility` enum('both','catalog','search','none') NOT NULL default 'both',
`cache_is_pack` tinyint(1) NOT NULL default '0',
`cache_has_attachments` tinyint(1) NOT NULL default '0',
`is_virtual` tinyint(1) NOT NULL default '0',
`cache_default_attribute` int(10) unsigned default NULL,
`date_add` datetime NOT NULL,
`date_upd` datetime NOT NULL,
`advanced_stock_management` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`id_product`),
KEY `product_supplier` (`id_supplier`),
KEY `product_manufacturer` (`id_manufacturer`),
KEY `id_category_default` (`id_category_default`),
KEY `indexed` (`indexed`),
KEY `date_add` (`date_add`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=144 ;



Saludos
Marcelo Roggeri wrote:Hola Sebastian podrias poner la cadena de creación de la estructura de la tabla? tal cual la creaste si es que lo hiciste por código.
Saludos
Marcelo
Last edited by Sebastián Almirón on Mon Nov 18, 2013 3:27 pm, edited 1 time in total.
User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: TDolphin error oQry:Save()

Post by Sebastián Almirón »

Hola, sigo con problemas, a ver si alguien me puede ayudar:

¿ TDolphin puede guardar sin problemas datos en campos enum ?

Parto de la tabla vacía, si ejecuto:
ccadena := "INSERT INTO ps_product(reference) VALUES('123456')"
oServer:Execute(ccadena)
Me inserta un nuevo registro, pero luego cuando quiero cambiarle los valores de _:
ccadena := ' select * from ps_product where reference = "123456" '
oQry := oServer:Query(ccadena )
oQry:condition := 'Used' //El valor predeterminado es 'new'
oQry:save()
no me lo hace, no da error, pero no cambia el valor de condition.

He intentado también hacerlo como me sugería cmsoft:
ccadena := 'select * from ps_product'
oQry := oServer:Query(ccadena)
onuevo := oQry:GetBlankRow()
onuevo:condition := 'New'
oQry:orow := onuevo
oQry:save()

En este caso me da un error:
Error description: Error MYSQL/1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'condition='new',show_price=1,indexed=0,visibility='both',cache_is_pack=0,cache_h' at line 1

La Query completa que genera el método SQLQuery de la clase TDolphinSrv, es así (he puesto un Msgget en el método para capturarla):
INSERT INTO ps_product SET id_product=140,id_supplier=0,id_manufacturer=0,id_category_default=40,id_shop_default=1,id_tax_rules_group=1,on_sale=0,online_only=0,ean13='884962894408',upc=NULL,ecotax=0,quantity=0,minimal_quantity=0,price=11.50,wholesale_price=0,unity=NULL,unit_price_ratio=0,additional_shipping_cost=0,reference='3090561',supplier_reference=NULL,location=NULL,width=0,height=0,depth=0,weight=0,out_of_stock=2,quantity_discount=0,customizable=0,uploadable_files=0,text_fields=0,active=1,available_for_order=1,available_date=' - - ',condition='new',show_price=1,indexed=0,visibility='both',cache_is_pack=0,cache_has_attachments=0,is_virtual=0,cache_default_attribute=0,date_add='2013-11-18 12:49:13',date_upd='2013-11-18 12:49:13',advanced_stock_management=0

Esta misma consulta en el SQL de PhpMyAdmin genera el mismo error, limpiandola veo que el problema es que no se puede hacer:
INSERT INTO ps_product SET condition='new'
condition es un campo enum.

¿Alguna idea?
Saludos
User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: TDolphin error oQry:Save()

Post by Sebastián Almirón »

Bueno, al final lo he solucionado.

Para añadir un registro he tenido que usar INSERT INTO y ponerle en VALUES todos _ por orden
Para modificar un registro he usado he usado una Query

No entiendo porque me daba tantos problemas, intentaré averiguar porqué más adelante, hay algo que se me escapa. Pero de momento me funciona.

Saludos
User avatar
Hector Pedro Lerda
Posts: 46
Joined: Tue May 07, 2013 7:27 pm
Location: Buenos Aires - Argentina

Re: TDolphin error oQry:Save()

Post by Hector Pedro Lerda »

Sebastian

" Me inserta un nuevo registro, pero luego cuando quiero cambiarle los valores de _:
ccadena := ' select * from ps_product where reference = "123456" '
oQry := oServer:Query(ccadena )
oQry:condition := 'Used' //El valor predeterminado es 'new'
oQry:save()
no me lo hace, no da error, pero no cambia el valor de condition."

a esta opción tuya podrias agregarle esto
ccadena := ' select * from ps_product where reference = "123456" '
oQry := oServer:Query(ccadena )

msginfo(oqry:lastrec()) /// te va retornar la cantidad de registros, si te retorna 0 , es porque no encontro nada y aqui esta tu error

luego agrega

oqry:getrow(1) para que se posecione en el primer registro

///// oQry:condition := 'Used' //El valor predeterminado es 'new'

oQry:condition := 'used' //con minúsculas lo tienes definido en la tabla y como usa el numero de letra para ordenar puede tener el error ahi

oQry:save()


Saludos Pedro Lerda

Aquí tienes la explicación del manual de mysql con respecto a los datos enum
http://dev.mysql.com/doc/refman/5.0/es/enum.html
User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: TDolphin error oQry:Save()

Post by Sebastián Almirón »

Ya se lo que ocurre, creo que es un problema de TDolpqry:

Cuando un campo numerico tiene un valor NULL (que puede haberse puesto como predeterminado), jamas ejecuta el oQry:save(), porque en el método Save de tDolpqry le añade en el WHERE campo = 0, creo que por método BuildDataWhere().

Por ejemplo, tengo un registro con un campo numerico llamado id_category_default que tiene valor NULL, si hago:
oQry:id_category_default := 3
oQry:Save()

la cQuery que crea el método Save() es así (resumido):

UPDATE ps_product_shop SET id_category_default=6 WHERE id_product = 3 AND id_category_default = 0

Ejecutando esa consulta en PhpMyAdmin no afecta a ningún registro, por el id_category_default = 0, sin embargo si le pongo:

UPDATE ps_product_shop SET id_category_default=6 WHERE id_product = 3

Es decir suprimiendo id_category_default = 0, la consulta se ejecuta sobre el registro apropiado y lo modifica.

Ahora la pregunta del millon: como hago para que no se añada a la cadena WHERE de la query de save(), cuando un campo numerico tiene el valor NULL en un registro, he probado a modificar el metodo BuildDataWhere(), pero no se como capturar si el valor de la variable uValue es NULL (con NIL no funciona).

P.D.: Gracias Hector por responder, el problema no tiene nada que ver con eso, lo de New con mayúsculas lo puse sin darme cuenta al escribir el mensaje, en realidad en el programa lo tengo en minúsculas.
User avatar
Hector Pedro Lerda
Posts: 46
Joined: Tue May 07, 2013 7:27 pm
Location: Buenos Aires - Argentina

Re: TDolphin error oQry:Save()

Post by Hector Pedro Lerda »

Sebastian

Para preguntar por un campo null debes poner

is null en tu ejemplo sería
UPDATE ps_product_shop SET id_category_default=6 WHERE id_product = 3 AND id_category_default is null

el valor null en mysql no equivale a 0, lo mismo si tenes que ejecutar comandos de sumas no suma valores null y te puede dar resultados erroneos


Saludos Pedro Lerda
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: TDolphin error oQry:Save()

Post by Daniel Garcia-Gil »

Sebastián Almirón wrote:Ahora la pregunta del millon: como hago para que no se añada a la cadena WHERE de la query de save(), cuando un campo numerico tiene el valor NULL en un registro, he probado a modificar el metodo BuildDataWhere(), pero no se como capturar si el valor de la variable uValue es NULL (con NIL no funciona).
lo verifico, hasta donde creo recordar, creo que si un valor esta en NIL deberia añadir a la sentencia IS NULL
Hector Pedro Lerda wrote:is null en tu ejemplo sería
UPDATE ps_product_shop SET id_category_default=6 WHERE id_product = 3 AND id_category_default is null
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: TDolphin error oQry:Save()

Post by Daniel Garcia-Gil »

Sebestian

en el codigo de TDolphin esta creada la validacion sin es NIL coloca "IS NULL"

aqui coloco la version del codigo que hace esa validacion en el metodo BuildDataWhere


tomado de TDolpqry.prg

linea 461 de la version actual de TDolphin

Code: Select all

cWhere += aField[ MYSQL_FS_NAME ] + If( uValue == NIL .OR. ( HB_IsString( uValue ) .AND. Empty( uValue ) ) .OR. ( HB_IsDate( uValue ) .AND. Empty( uValue ) ), " IS ", " = " ) + ;
                   ClipValue2Sql( uValue, , , .F. ) + " AND "
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: TDolphin error oQry:Save()

Post by Sebastián Almirón »

Hola,
Estoy perdido y desesperado, me voy a casa a ver si me despejo :D
El caso es que ese campo, que tiene valor NULL y es de tipo INT. Justo antes de las líneas que añaden el "IS" o el "=", tanto en MakePrimaryKeyWhere() como en BuildDataWhere(), la variable uValue tiene valor 0 y no NIL. Por lo tanto al tratarse de un número me añade un "=" en vez de un "IS" y la función ClipValue2Sql que va a continuación lo trata como un número y devuelve su mismo valor 0.

Aunque creo que no viene al caso, tengo puesto SET LOGICALVALUE OFF.
Mañana seguiré.

Gracias

Daniel Garcia-Gil wrote:Sebestian

en el codigo de TDolphin esta creada la validacion sin es NIL coloca "IS NULL"

aqui coloco la version del codigo que hace esa validacion en el metodo BuildDataWhere


tomado de TDolpqry.prg

linea 461 de la version actual de TDolphin

Code: Select all

cWhere += aField[ MYSQL_FS_NAME ] + If( uValue == NIL .OR. ( HB_IsString( uValue ) .AND. Empty( uValue ) ) .OR. ( HB_IsDate( uValue ) .AND. Empty( uValue ) ), " IS ", " = " ) + ;
                   ClipValue2Sql( uValue, , , .F. ) + " AND "
Post Reply