Page 1 of 2

TDolphin error oQry:Save()

Posted: Fri Nov 15, 2013 10:41 am
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

Re: TDolphin error oQry:Save()

Posted: Fri Nov 15, 2013 11:08 am
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.

Re: TDolphin error oQry:Save()

Posted: Fri Nov 15, 2013 11:24 am
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.

Re: TDolphin error oQry:Save()

Posted: Fri Nov 15, 2013 12:47 pm
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()

Re: TDolphin error oQry:Save()

Posted: Fri Nov 15, 2013 1:02 pm
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()

Re: TDolphin error oQry:Save()

Posted: Sat Nov 16, 2013 10:13 pm
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

Re: TDolphin error oQry:Save()

Posted: Mon Nov 18, 2013 8:48 am
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

Re: TDolphin error oQry:Save()

Posted: Mon Nov 18, 2013 12:19 pm
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

Re: TDolphin error oQry:Save()

Posted: Mon Nov 18, 2013 4:37 pm
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

Re: TDolphin error oQry:Save()

Posted: Mon Nov 18, 2013 4:47 pm
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

Re: TDolphin error oQry:Save()

Posted: Wed Nov 20, 2013 12:31 pm
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.

Re: TDolphin error oQry:Save()

Posted: Wed Nov 20, 2013 12:59 pm
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

Re: TDolphin error oQry:Save()

Posted: Wed Nov 20, 2013 1:49 pm
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

Re: TDolphin error oQry:Save()

Posted: Wed Nov 20, 2013 1:58 pm
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 "

Re: TDolphin error oQry:Save()

Posted: Wed Nov 20, 2013 5:34 pm
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 "