TDolphin error oQry:Save()

TDolphin error oQry:Save()

Postby Sebastián Almirón » Fri Nov 15, 2013 10:41 am

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
Sebastián Almirón
 
Posts: 155
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: TDolphin error oQry:Save()

Postby cmsoft » Fri Nov 15, 2013 11:08 am

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

Re: TDolphin error oQry:Save()

Postby Sebastián Almirón » Fri Nov 15, 2013 11:24 am

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 definidos campos no null en la tabla, y con esa instruccion dejas todos los campos en blancos e intentas grabar. Tal vez venga por ahí el error.
User avatar
Sebastián Almirón
 
Posts: 155
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: TDolphin error oQry:Save()

Postby cmsoft » Fri Nov 15, 2013 12:47 pm

No se si es la forma mas adecuada, pero funciona.
Code: Select all  Expand view

base := oQry:GetBlankRow()
base:condition := "new"
oQry:oRow := base
oQry:Save()
User avatar
cmsoft
 
Posts: 1191
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: TDolphin error oQry:Save()

Postby Sebastián Almirón » Fri Nov 15, 2013 1:02 pm

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  Expand view

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

Re: TDolphin error oQry:Save()

Postby Marcelo Roggeri » Sat Nov 16, 2013 10:13 pm

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
User avatar
Marcelo Roggeri
 
Posts: 325
Joined: Sat Jul 22, 2006 9:04 pm
Location: Venado Tuerto - Santa Fe -Argentina

Re: TDolphin error oQry:Save()

Postby Sebastián Almirón » Mon Nov 18, 2013 8:48 am

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: 155
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: TDolphin error oQry:Save()

Postby Sebastián Almirón » Mon Nov 18, 2013 12:19 pm

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 los campos:
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: 155
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: TDolphin error oQry:Save()

Postby Sebastián Almirón » Mon Nov 18, 2013 4:37 pm

Bueno, al final lo he solucionado.

Para añadir un registro he tenido que usar INSERT INTO y ponerle en VALUES todos los campos 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
Sebastián Almirón
 
Posts: 155
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: TDolphin error oQry:Save()

Postby Hector Pedro Lerda » Mon Nov 18, 2013 4:47 pm

Sebastian

" Me inserta un nuevo registro, pero luego cuando quiero cambiarle los valores de los campos:
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
Hector Pedro Lerda
 
Posts: 46
Joined: Tue May 07, 2013 7:27 pm
Location: Buenos Aires - Argentina

Re: TDolphin error oQry:Save()

Postby Sebastián Almirón » Wed Nov 20, 2013 12:31 pm

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
Sebastián Almirón
 
Posts: 155
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: TDolphin error oQry:Save()

Postby Hector Pedro Lerda » Wed Nov 20, 2013 12:59 pm

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
Hector Pedro Lerda
 
Posts: 46
Joined: Tue May 07, 2013 7:27 pm
Location: Buenos Aires - Argentina

Re: TDolphin error oQry:Save()

Postby Daniel Garcia-Gil » Wed Nov 20, 2013 1:49 pm

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
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: TDolphin error oQry:Save()

Postby Daniel Garcia-Gil » Wed Nov 20, 2013 1:58 pm

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  Expand view
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 "
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: TDolphin error oQry:Save()

Postby Sebastián Almirón » Wed Nov 20, 2013 5:34 pm

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  Expand view
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 "
User avatar
Sebastián Almirón
 
Posts: 155
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 8 guests