Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Error en concatenacion de Sentencia SQL, Firebird 2.5 (https://www.clubdelphi.com/foros/showthread.php?t=71806)

Adrian Murua 12-01-2011 03:06:11

Error en concatenacion de Sentencia SQL, Firebird 2.5
 
Estimados Amigos :

Tengo esta sentencia SQL, definida en una variable de delphi, que luego al intentar ejecutarla en un dataset, me da un error :

el Error es :

" Dynamic SQL error
SQL error code = -104
Token unknown - line 1, column 715
,

"
la Sentencia SQL es :

Código SQL [-]

 FNegSQL := 'SELECT  EMPRESAS.CUIT,  EMPRESAS.NOMBRE as EMPRESA,                  '+
            ' BANCOS.redes_id RED,                                                '+
            ' BANCOS.zonas_id ZONA,                                               '+
            ' BANCOS.SUCURSAL,                                                    '+
            ' BANCOS.NOMBRE as BANCO,                                             '+
            ' PRODUCTOS.NOMBRE AS PRODUCTO,                                       '+
            ' SITUACIONES.NOMBRE AS SITUACION,                                    '+
            ' ESTADOS.NOMBRE AS ESTADO,                                           '+
            ' NEGOCIOS.COTIZACION,                                                '+
            ' NEGOCIOS.DETALLE,                                                   '+
            ' (CONTACTOS.APELLIDO || '+', '+ ' || CONTACTOS.NOMBRE) as CONTACTO,  '+
            ' (OPERADORES.APELLIDO || '+', '+ ' || OPERADORES.NOMBRE) AS OPERADOR,'+
            ' PRODUCTOS.COLOR AS PCOLOR,                                          '+
            ' SITUACIONES.COLOR AS SCOLOR,                                        '+
            ' ESTADOS.COLOR AS ECOLOR,                                            '+
            ' NEGOCIOS.ID AS NEGOCIOS_ID,                                         '+
            ' NEGOCIOS.bancos_id as BANCOS_ID,                                    '+
            ' NEGOCIOS.empresas_id AS EMPRESAS_ID,                                '+
            ' NEGOCIOS.productos_id PRODUCTOS_ID,                                 '+
            ' NEGOCIOS.situaciones_id AS SITUACIONES_ID,                          '+
            ' NEGOCIOS.estados_id AS ESTADOS_ID,                                  '+
            ' NEGOCIOS.contactos_id AS CONTACTOS_ID,                              '+
            ' NEGOCIOS.operadores_id AS OPERADORES_ID,                            '+
            ' NEGOCIOS.activo                                                     '+
            '                                                                     '+
            'FROM                                                                 '+
            ' NEGOCIOS                                                            '+
            ' INNER JOIN BANCOS ON (NEGOCIOS.BANCOS_ID = BANCOS.ID)               '+
            ' INNER JOIN EMPRESAS ON (NEGOCIOS.EMPRESAS_ID = EMPRESAS.ID)         '+
            ' INNER JOIN CONTACTOS ON (NEGOCIOS.CONTACTOS_ID = CONTACTOS.ID)      '+
            ' INNER JOIN OPERADORES ON (NEGOCIOS.OPERADORES_ID = OPERADORES.ID)   '+
            ' INNER JOIN PRODUCTOS ON (NEGOCIOS.PRODUCTOS_ID = PRODUCTOS.ID)      '+
            ' INNER JOIN SITUACIONES ON (NEGOCIOS.SITUACIONES_ID = SITUACIONES.ID)'+
            ' INNER JOIN ESTADOS ON (NEGOCIOS.ESTADOS_ID = ESTADOS.ID)';

Me imagino que el error se encuentra en la concatenación del apellido y el nombre del contacto.

La idea de la concatenacion es que se vea " Apellido, Nombre", a mi parecer la concatenacion esta bien echa, pero al parecer no es asi.

uso. Delphi 2010 y Firebird 2.5 , sobre Windows 7 y componentes IBX (Dataset).

Desde ya muchas gracias.

Casimiro Notevi 12-01-2011 03:35:38

¿Has verificado desde ibexpert, por ejemplo, de que la sentencia se ejecuta bien?

Chris 12-01-2011 05:01:44

Estoy casi seguro que es donde tú mencionas. Veo un error en la concanetación y es que estás utilizando unas Comas (,) que están de más. Eso es lo que te está indicando el error, que tienes un identificador desconocido, en este caso una coma. Tu concanetación debería de quedar así:

Código Delphi [-]
' (CONTACTOS.APELLIDO || ' + ''', ''' + ' || CONTACTOS.NOMBRE) as CONTACTO,  '+
' (OPERADORES.APELLIDO || ' + ''', ''' + ' || OPERADORES.NOMBRE) AS OPERADOR,' +

Saludos,
Chris

Casimiro Notevi 12-01-2011 11:49:36

Todavía no me he tomado el café, así que no tengo las neuronas en
funcionamiento, pero me parece que sobra todo eso, no?
O sea,:
Código:

' (CONTACTOS.APELLIDO || '+', '+ ' || CONTACTOS.NOMBRE) as CONTACTO,  '+
' (OPERADORES.APELLIDO || '+', '+ ' || OPERADORES.NOMBRE) AS OPERADOR,'+

Puede quedarse así:
Código:

' (CONTACTOS.APELLIDO || CONTACTOS.NOMBRE) as CONTACTO,  '+
' (OPERADORES.APELLIDO || OPERADORES.NOMBRE) AS OPERADOR,'+


pacopenin 12-01-2011 12:04:40

Hola.

también podrías usar

Código Delphi [-]
' (CONTACTOS.APELLIDO || ' + QuotedStr(', ') + ' || CONTACTOS.NOMBRE) as CONTACTO,  '+

Está en SysUtils.

Saludos.

Adrian Murua 13-01-2011 02:29:17

Cita:

Empezado por Casimiro Notevi (Mensaje 387259)
¿Has verificado desde ibexpert, por ejemplo, de que la sentencia se ejecuta bien?

Gracias Casimiro Notevi por responder, si la ejecute a la sentencia en el ibexpert y funciona bien , da el error cuando la ejecuto desde el dataset de las ibx de delphi.

Cita:

Empezado por Chris (Mensaje 387267)
Estoy casi seguro que es donde tú mencionas. Veo un error en la concanetación y es que estás utilizando unas Comas (,) que están de más. Eso es lo que te está indicando el error, que tienes un identificador desconocido, en este caso una coma. Tu concanetación debería de quedar así:

Código Delphi [-]
' (CONTACTOS.APELLIDO || ' + ''', ''' + ' || CONTACTOS.NOMBRE) as CONTACTO,  '+
' (OPERADORES.APELLIDO || ' + ''', ''' + ' || OPERADORES.NOMBRE) AS OPERADOR,' +

Saludos,
Chris

Gracias Chris por tu respuesta, tenes razon me hice un lio con las comillas simples, he probado tu correccion y me ha funcionado bien.

Cita:

Empezado por Casimiro Notevi (Mensaje 387282)
Todavía no me he tomado el café, así que no tengo las neuronas en
funcionamiento, pero me parece que sobra todo eso, no?
O sea,:
Código:

' (CONTACTOS.APELLIDO || '+', '+ ' || CONTACTOS.NOMBRE) as CONTACTO,  '+
' (OPERADORES.APELLIDO || '+', '+ ' || OPERADORES.NOMBRE) AS OPERADOR,'+

Puede quedarse así:
Código:

' (CONTACTOS.APELLIDO || CONTACTOS.NOMBRE) as CONTACTO,  '+
' (OPERADORES.APELLIDO || OPERADORES.NOMBRE) AS OPERADOR,'+


Gracias de Nuevo Casimiro, como le dije a Chris, me hice un lio con las comillas simples, ya habia probado como tu dices, pero la idea es tener el apellido, separado con una coma, del nombre.

Cita:

Empezado por pacopenin (Mensaje 387284)
Hola.

también podrías usar

Código Delphi [-]
' (CONTACTOS.APELLIDO || ' + QuotedStr(', ') + ' || CONTACTOS.NOMBRE) as CONTACTO,  '+

Está en SysUtils.

Saludos.

Gracias por tu respuesta pacopenin, he optado usar tu sugerencia ya que el codigo es mas simple que con las comillas.

Gracias a todos ustedes.

Ssludos.

Casimiro Notevi 13-01-2011 17:31:32

¿Pero lo has solucionado?

Adrian Murua 13-01-2011 19:03:49

Cita:

Empezado por Casimiro Notevi (Mensaje 387462)
¿Pero lo has solucionado?

Si Casimiro, Lo he solucionado, tanto el codigo propuesto por Chris, como el de pacopenin, me han funcionado, pero he optado por la Funcion
Código:

QuotedStr(', ');
de pacopenin, la cual no la conocía, ya que el codigo queda mas limpio, por decirlo de alguna manera. Muchas Gracias

g_ferrada 01-04-2011 16:25:54

Amigos
Tengo un problema con las comillas (') que no logro solucionar. Escribo la sentencia SQL en la propiedad SQL.TEXT, de la siguiente forma:

Query1.SQL.Append('delete from genericos where id_equipo = ''' + frListTB1.dsListTB.DataSet.FieldByName('id_equipo').AsString + '''');

pero Delphi insiste en colocarme las comillas dos veces y me lo deja así:

delete from genericos, where id_equipo = ''EQUIPO 100''
y me coloca dos veces las comillas.

No soy un maestro en Delphi, pero hago esto desde muchos años, y ahora he decidido comenzar a usar Delphi2010 y me encontrado con esta dificultad (entre otras). El código anterior me funciona en Delphi7.

He intentado usando chr(39), #39, QuotedStr, AnsiQuotedStr... Si usara la comilla doble el tema anda:

Query1.SQL.Append('delete from genericos where id_equipo = "' + frListTB1.dsListTB.DataSet.FieldByName('id_equipo').AsString + '"');

y queda asi:
delete from genericos, where id_equipo = "EQUIPO 100"
pero esto Firebird no me lo reconoce (el delimitador de texto es comilla simple).

Si le saco las comillas:

Query1.SQL.Append('delete from genericos where id_equipo = ' + frListTB1.dsListTB.DataSet.FieldByName('id_equipo').AsString + '');

el resultado tampoco me sirve:
delete from genericos, where id_equipo = EQUIPO 100

Lo que me falta es probar otro camino usando parámetros en la consulta, pero me figuro que también tendré que preparar cadenas de texto, y la verdad, me cuesta creer que Delphi haya caído en un error tan burdo (y que nadie más se haya dado cuenta) así que prefiero pensar que el problema soy yo.
¿Habrá que cambiar alguna opción en Delphi para que funcione como lo hacía en mi querido Delphi7?

Agradeceré ayuda, por favor.
Saludos

g_ferrada 01-04-2011 21:14:43

...Bueno, salí del paso usando parámetros:

SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Append('delete from genericos where id_equipo = :id_equipo');
SQLQuery1.Params.Clear;
SQLQuery1.Params.CreateParam(ftString,'id_equipo',ptUnknown);
SQLQuery1.ParamByName('id_equipo').AsString:= frListTB1.dsListTB.DataSet.FieldByName('id_equipo').AsString;
SQLQuery1.ExecSQL();

pero personalmente, la otra forma me acomodaba más. Si alguien sabe como hacerlo, se agradece la información.

Casimiro Notevi 01-04-2011 21:45:30

Bueno, yo eso lo resumiría un poco:

Código Delphi [-]
SQLQuery1.SQL.Close;
SQLQuery1.SQL.Text('delete from genericos where id_equipo = :id_equipo');
SQLQuery1.ParamByName('id_equipo').AsString:= frListTB1.dsListTB.DataSet.FieldByName('id_equipo').AsString;
SQLQuery1.ExecSQL;

Cita:

Empezado por g_ferrada (Mensaje 395475)
...Bueno, salí del paso usando parámetros:
pero personalmente, la otra forma me acomodaba más. Si alguien sabe como hacerlo, se agradece la información.

Debe funcionarte de la otra forma, copia aquí el código exacto que estás usando para que le echemos un vistazo.

g_ferrada 01-04-2011 22:28:42

Como soy porfiado, seguí con el tema, lo curioso es que este código si funciona correctamente en otro unit:

SQLQuery1.SQL.Append('select sucursal from sucursales where codigo_sucursal = ''' + sCodigoSucursal + '''');

donde sCodigoSucursal es un parámetro de entrada de tipo string a una función que contiene dicha línea.


Para probar, en el codigo anterior (donde no funciona) pase el valor del campo del Dataset a una variable string "s" y reemplacé en el SQL.Append:

s:= ClientDataSet1.FieldByName('id_equipo').AsString;
SQLQuery1.SQL.Append('delete from genericos where id_equipo = ''' + s + '''');

pero ocurre el mismo problema. Estoy confundido.

Casimiro Notevi 01-04-2011 22:37:29

¿Pero el problema es que te sale algún error o que no borra el registro?
Si es un error: ¿qué error es?

Por cierto, recuerda poner el código entre etiquetas, ejemplo:


g_ferrada 01-04-2011 23:07:15

Señores,
debo decirlo... estoy avergonzado.

Después que la pantalla de mi note se puso con rallitas de colores y se quedó pegado, tuve que resetear todo, y con ello se reseteo mi cerebro también.
Parece ser que el error era otro, inicialmente de sintaxis en la consulta, y buscando y buscando encontré extraño el tema de las doble comillas, y me quedé pegado ahí, no se... creo que me estoy volviendo viejo, o será falta de sexo.

Casimiro, gracias por la molestia en responder. Al menos aprendí a colocar los códigos en forma apropiada.
Un saludo

¡Viva Delphi!

Casimiro Notevi 01-04-2011 23:55:43

A todos se nos "cuelga" el cerebro de vez en cuando :)
Aunque siempre está bien decir cómo se solucionó, cuál era realmente el problema, así nos quedamos tranquilos :)

g_ferrada 02-04-2011 00:08:00

Si. Lo que decía, creo... había un error (una coma que aparece por ahí en los posts anteriores), y me fui a mirar con el watchList el SQL.Text y vi las dos comillas, seguramente corregí despues el otro error, pero me quede buscando como sacarlas, tratando de solucionar un problema que no existía :) . Lo único que puedo decir a mi favor, es que Delphi7 no muestra doble comillas, en el watchList, al menos.


La franja horaria es GMT +2. Ahora son las 11:08:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi