[Lazarus-es] Sentencia larga Sql
francisco prieto
fajprieto en gmail.com
Jue Ago 13 17:14:33 CEST 2015
Falsa alarma...
El select y los parametros los toma, pero cuando lo ejecuta da el siguiente
error
El proyecto Bal9900 ha lanzado una excepcion 'EIBDatabaseError' con el
mensaje:
:PrepareStatement:
-Dynamic SQL Error
-SQL error code=-104
-Token unknown - line 2, column 1
-Select
Con esto pienso que cada Add que se hace debe ser una sentencia completa...
Los mantengo al tanto.
Saludos,
Pancho
Córdoba
Argentina
El 13 de agosto de 2015, 11:08, francisco prieto <fajprieto en gmail.com>
escribió:
> Me contesto solito...
>
> Se corrige asi...
>
> ModuloDatos.qAccionSql.SQL.Add('SELECT RF.RDB$FIELD_NAME AS
> FIELD_NAME,CASE FL.RDB$FIELD_TYPE ');
> ModuloDatos.qAccionSql.SQL.Add(' WHEN 7 THEN ''SMALLINT''');
> ModuloDatos.qAccionSql.SQL.Add(' WHEN 8 THEN ''INTEGER''');
> ModuloDatos.qAccionSql.SQL.Add(' WHEN 9 THEN ''QUAD''');
> ModuloDatos.qAccionSql.SQL.Add(' WHEN 10 THEN ''FLOAT''');
> ModuloDatos.qAccionSql.SQL.Add(' WHEN 11 THEN ''D_FLOAT''');
> ModuloDatos.qAccionSql.SQL.Add(' WHEN 12 THEN ''DATE''');
> ModuloDatos.qAccionSql.SQL.Add(' WHEN 13 THEN ''TIME''');
> ModuloDatos.qAccionSql.SQL.Add(' WHEN 14 THEN ''CHAR''');
> ModuloDatos.qAccionSql.SQL.Add(' WHEN 16 THEN ''INT64''');
> ModuloDatos.qAccionSql.SQL.Add(' WHEN 27 THEN ''DOUBLE''');
> ModuloDatos.qAccionSql.SQL.Add(' WHEN 35 THEN ''TIMESTAMP''');
> ModuloDatos.qAccionSql.SQL.Add(' WHEN 37 THEN ''VARCHAR''');
> ModuloDatos.qAccionSql.SQL.Add(' WHEN 40 THEN ''CSTRING''');
> ModuloDatos.qAccionSql.SQL.Add(' WHEN 261 THEN ''BLOB''');
> ModuloDatos.qAccionSql.SQL.Add(' ELSE ''DESCONOCIDO''');
> ModuloDatos.qAccionSql.SQL.Add(' END AS FIELD_TYPE,');
> ModuloDatos.qAccionSql.SQL.Add(' FL.RDB$FIELD_LENGTH AS FIELD_LENGTH,');
> ModuloDatos.qAccionSql.SQL.Add(' COALESCE(CS.RDB$CHARACTER_SET_NAME,'''')
> AS FIELD_CHARSET');
> ModuloDatos.qAccionSql.SQL.Add(' FROM RDB$RELATION_FIELDS RF ');
> ModuloDatos.qAccionSql.SQL.Add(' LEFT JOIN RDB$FIELDS FL ON
> RF.RDB$FIELD_SOURCE = FL.RDB$FIELD_NAME');
> ModuloDatos.qAccionSql.SQL.Add(' LEFT JOIN RDB$CHARACTER_SETS CS ON
> FL.RDB$CHARACTER_SET_ID = CS.RDB$CHARACTER_SET_ID');
> ModuloDatos.qAccionSql.SQL.Add(' WHERE RF.RDB$RELATION_NAME=:nomTabla AND
> RF.RDB$FIELD_NAME=:nomCampo');
> ModuloDatos.qAccionSql.SQL.Add(' ORDER BY RF.RDB$FIELD_POSITION');
>
> Saludos y gracias,
>
> Pancho
> Córdoba
> Argentina
>
> El 13 de agosto de 2015, 10:55, francisco prieto <fajprieto en gmail.com>
> escribió:
>
>> Grupo esta es una de las tantas sentencias Sql que tiene mi sistema...
>> Aclaro que trabajo con Lazarus y no con Delphi....
>>
>> lcSql:='SELECT RF.RDB$FIELD_NAME AS FIELD_NAME,CASE FL.RDB$FIELD_TYPE ';
>> lcSql:=lcSql+' WHEN 7 THEN ''SMALLINT''';
>> lcSql:=lcSql+' WHEN 8 THEN ''INTEGER''';
>> lcSql:=lcSql+' WHEN 9 THEN ''QUAD''';
>> lcSql:=lcSql+' WHEN 10 THEN ''FLOAT''';
>> lcSql:=lcSql+' WHEN 11 THEN ''D_FLOAT''';
>> lcSql:=lcSql+' WHEN 12 THEN ''DATE''';
>> lcSql:=lcSql+' WHEN 13 THEN ''TIME''';
>> lcSql:=lcSql+' WHEN 14 THEN ''CHAR''';
>> lcSql:=lcSql+' WHEN 16 THEN ''INT64''';
>> lcSql:=lcSql+' WHEN 27 THEN ''DOUBLE''';
>> lcSql:=lcSql+' WHEN 35 THEN ''TIMESTAMP''';
>> lcSql:=lcSql+' WHEN 37 THEN ''VARCHAR''';
>> lcSql:=lcSql+' WHEN 40 THEN ''CSTRING''';
>> lcSql:=lcSql+' WHEN 261 THEN ''BLOB''';
>> lcSql:=lcSql+' ELSE ''DESCONOCIDO''';
>> lcSql:=lcSql+' END AS FIELD_TYPE,';
>> lcSql:=lcSql+' FL.RDB$FIELD_LENGTH AS FIELD_LENGTH,';
>> lcSql:=lcSql+' COALESCE(CS.RDB$CHARACTER_SET_NAME,'''') AS
>> FIELD_CHARSET';
>> lcSql:=lcSql+' FROM RDB$RELATION_FIELDS RF ';
>> lcSql:=lcSql+' LEFT JOIN RDB$FIELDS FL ON RF.RDB$FIELD_SOURCE =
>> FL.RDB$FIELD_NAME';
>> lcSql:=lcSql+' LEFT JOIN RDB$CHARACTER_SETS CS ON
>> FL.RDB$CHARACTER_SET_ID = CS.RDB$CHARACTER_SET_ID';
>> lcSql:=lcSql+' WHERE RF.RDB$RELATION_NAME=:nomTabla AND
>> RF.RDB$FIELD_NAME=:nomCampo';
>> lcSql:=lcSql+' ORDER BY RF.RDB$FIELD_POSITION';
>>
>> La cargue asi y tambien la cargue directamente en un variable.
>>
>> Pero en tiempo de ejecucion solo se cargan las primeras 255 posiciones,
>> es decir...
>>
>> 'SELECT RF.RDB$FIELD_NAME AS FIELD_NAME,CASE FL.RDB$FIELD_TYPE WHEN 7
>> THEN ''SMALLINT'' WHEN 8 THEN ''INTEGER'' WHEN 9 THEN ''QUAD'' WHEN 10
>> THEN ''FLOAT'' WHEN 11 THEN ''D_FLOAT'' WHEN 12 THEN ''DATE'' WHEN 13
>> THEN ''TIME'' WHEN 14 THEN ''...
>>
>> Y obviamente no funciona.
>>
>> La variable lcSql la defini tanto como String como AnsiString, que según
>> dice en este link es ilimitado...
>>
>> http://www.freepascal.org/docs-html/ref/refsu12.html
>>
>> Pero de todos modos solo toma los primeros 255 caracteres.
>>
>> Estoy trabajando con el objeto TSQLQuery
>>
>> Si pruebo mi sentencia directamente en FlameRobin funciona con lo cual
>> debo pensar que todo el problema recae en TSqlQuery.
>>
>>
>> En este caso todos los when los puedo hacer del lado de Lazarus para
>> acortar la sentencia, pero en muchos caso no voy a poder hacer eso, con lo
>> cual esta es una solución para salir del paso pero no una solución real.
>>
>> Se les ocurre alguna otra solución?
>>
>> Saludos,
>>
>> Pancho
>> Córdoba
>> Argentina
>>
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20150813/7305cc48/attachment-0002.html>
More information about the Lazarus-es
mailing list