[Lazarus-es] Sentencia larga Sql

Maxi maximiliano.duarte en gmail.com
Vie Ago 14 15:46:49 CEST 2015


EL ADD te falló por las comillas

const
cte_consulta='select * from mi tabla where %s'

en feneral yo uso

sql.text:= format(cte_consulta,[parametros]);


igualmente, esa informacion te la dan los objetos de la consulta.
Y si usas las ZeosLib tienen un componente TSqlMetaData que te ofrece
cualquier informacion sin importar el motor.



El día 14 de agosto de 2015, 8:05, francisco prieto
<fajprieto en gmail.com> escribió:
> José
> Te respondo cada una.
> 1) estoy generando una clase genérica, con la cual surgen distintas
> combinaciones, algunas más lógicas que otras, pero todas válidas.
> 2) Eso fue simplemente una prueba, pero de todos modos, a tiempo de
> ejecución si dividido la sentencia en distintos add da error de prepare.
> 3) La idea ahí era hacer una función, sin depender del motor. Se me ocurrió
> probar en este caso, con una consulta medianamente compleja.
>
> Muchas gracias igual por tus apreciaciones.
>
> Saludos
> Pancho
> Córdoba
> Argentina
>
>
> El vie, 14 de agosto de 2015 03:43, Jose antonio Cuello Principal
> <jcuello en artextrading.com> escribió:
>>
>> Hola, comentar alguna cosa que he visto.
>>
>> 1) Si usas una variable string para montar la sentencia, ¿por qué usar
>> parámetros? directamente suma los valores a la cadena. A menos que vayas a
>> usar el sql en un bucle donde se ejecutará con distintos valores, pero en el
>> ejemplo no indicabas esa condición.
>>
>> 2) Si usas un TString, como la propiedad SQL del dataset, no necesitas
>> insertar los espacios para separar las distintas partes de la sentencia. Ni
>> al final de la linea anterior ni al comienzo de la nueva.
>>         ejplo:    midataset.SQL.Add('SELECT *')
>>                      midataset.SQL.Add('FROM mitabla');
>>
>> 3) Dependiendo del motor de bases de datos, puedes crear una vista o una
>> función que te realice la conversión del FIELD_TYPE quedando la sentencia
>> más limpia y no teniendo que escribir el case en cada uso.
>>
>> Espero pueda ser de ayuda. Un saludo
>>
>> ________________________________
>> De: "francisco prieto" <fajprieto en gmail.com>
>> Para: "Spanish version of Lazarus List"
>> <lazarus-es en lists.lazarus.freepascal.org>
>> Enviados: Viernes, 14 de Agosto 2015 3:00:47
>> Asunto: Re: [Lazarus-es] Sentencia larga Sql
>>
>>
>>
>> El 13 de agosto de 2015, 13:34, Maxi <maximiliano.duarte en gmail.com>
>> escribió:
>>>
>>> quotedString()
>>
>>
>>
>> Excelente lo suyo...
>>
>> Quedo asi,
>>
>>  lcSql:='SELECT RF.RDB$FIELD_NAME AS FIELD_NAME,CASE FL.RDB$FIELD_TYPE '+
>>  ' WHEN   7 THEN '+QuotedStr('SMALLINT')+
>>  ' WHEN   8 THEN '+QuotedStr('INTEGER')+
>>  ' WHEN   9 THEN '+QuotedStr('QUAD')+
>>  ' WHEN  10 THEN '+QuotedStr('FLOAT')+
>>  ' WHEN  11 THEN '+QuotedStr('D_FLOAT')+
>>  ' WHEN  12 THEN '+QuotedStr('DATE')+
>>  ' WHEN  13 THEN '+QuotedStr('TIME')+
>>  ' WHEN  14 THEN '+QuotedStr('CHAR')+
>>  ' WHEN  16 THEN '+QuotedStr('INT64')+
>>  ' WHEN  27 THEN '+QuotedStr('DOUBLE')+
>>  ' WHEN  35 THEN '+QuotedStr('TIMESTAMP')+
>>  ' WHEN  37 THEN '+QuotedStr('VARCHAR')+
>>  ' WHEN  40 THEN '+QuotedStr('CSTRING')+
>>  ' WHEN 261 THEN '+QuotedStr('CSTRING')+
>>  ' ELSE '+QuotedStr('DESCONOCIDO')+
>>  ' END AS FIELD_TYPE,'+
>>  ' FL.RDB$FIELD_LENGTH AS FIELD_LENGTH,'+
>>  ' COALESCE(CS.RDB$CHARACTER_SET_NAME,'''') AS FIELD_CHARSET'+
>>  ' FROM RDB$RELATION_FIELDS RF '+
>>  ' LEFT JOIN RDB$FIELDS FL ON RF.RDB$FIELD_SOURCE = FL.RDB$FIELD_NAME'+
>>  ' LEFT JOIN RDB$CHARACTER_SETS CS ON FL.RDB$CHARACTER_SET_ID =
>> CS.RDB$CHARACTER_SET_ID'+
>>  ' WHERE RF.RDB$RELATION_NAME=:nomTabla AND RF.RDB$FIELD_NAME=:nomCampo'+
>>  ' ORDER BY RF.RDB$FIELD_POSITION';
>>  ModuloDatos.qAccionSql.SQL.Text:=lcSql;
>>  ModuloDatos.qAccionSql.Params.ParamByName('nomTabla').AsString:=lcTabla;
>>  ModuloDatos.qAccionSql.Params.ParamByName('nomCampo').AsString:=lcCampo;
>>
>> Saludos y Gracias,
>>
>> Pancho
>> Córdoba
>> Argentina
>>
>> _______________________________________________
>> Lazarus-es mailing list
>> Lazarus-es en lists.lazarus.freepascal.org
>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>>
>>
>>
>> --
>> José Antonio Cuello
>> Artex Trading sa
>> Gold Football sl
>> _______________________________________________
>> Lazarus-es mailing list
>> Lazarus-es en lists.lazarus.freepascal.org
>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>
>
> _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>



-- 
El que pregunta aprende, y el que contesta aprende a responder.

No a la obsolecencia programada:
http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml

Linux User #495070
http://domonetic.com/blog




More information about the Lazarus-es mailing list