DB Firebird - Fonction inconnue à partir d'une application Delphi.
Bonjour,
Je teste la requête suivante dans IBExpert où elle fonctionne parfaitement.
Code:
1 2
| Select distinct NOM from "TableProprio" where
Lower(NOM) like Lower('%COUR%') order By NOM |
Exécutée dans une application en Delphi, un message d'erreur fatale m'est renvoyé :
Citation:
SQL Error: Dynamic SQL Error SQL error code = @1 Function unknown @1. Error Code: -804
S'agissant de la même base de données, je ne m'explique pas pourquoi cette requête me révèle que «Lower» est une fonction inconnue alors que ce n'est pas le cas dans IBExpert.
Je remercie d'avance celui qui aurait une explication.
DB Firebird - Fonction inconnue à partir d'une application Delphi.
J'en suis toujours au même point malgré de nombreux tests et recherches.
Pour rappel, ce qui fonctionne en requête directe sous IbExpert engendre une erreur ou un résultat faux exécuté par le composant Zquery de Zeos en Delphi.
C'était le cas pour l'instruction ayant initié ce sujet. Ce l'est encore pour celle proposée en correction de la mienne :
Code:
Select NOM from TableProprio where LOWER(NOM) SIMILAR TO '%cour%' group by NOM
J'ai cependant eu des doutes parce que bizarrement, parfois la requête ne donnait un résultat que si la chaîne recherchée était en début de champs dans la table.
Exécutée en Delphi, la requête produit l'erreur suivante :
Citation:
Le projet MonProjet.exe a provoqué une classe d'exception EZSQLException avec le message : 'Error SQL : Dynamic SQL error SQL error code = @1 Token unknown - line @1, column @2@1. Error Code: -104. Invalid token Thes SQL: Select NOM From "TableProprio" Where
Lower(NOM) SIMILAR TO '%COUR%' Order by NOM
;'. Processus stoppé.
J'ai alors tenté une voie différente.
Travailler directement sur la table en appliquant le filtre
Code:
1 2 3 4
|
CadaDataModule.TableProprio.FilterOptions:=[foCaseInsensitive];
CadaDataModule.TableProprio.Filter := 'NOM Like ' + QuotedStr('%RAUCA%');
CadaDataModule.TableProprio.Filtered := True; |
Aucune erreur mais la table filtrée est vide.
Par contre, avec
Code:
1 2
| CadaDataModule.TableProprio.Filter := 'LOWER(NOM) SIMILAR TO ' + QuotedStr('%cour%');
CadaDataModule.TableProprio.Filtered := True; |
L'exécution bloque sur l'affectation du filtre avec l'erreur suivante :
Citation:
Le projet MonProjet.exe a provoqué une classe d'exception TZparseError avec le message 'Syntax error near SIMILAR"'. Processus stoppé.
Je ne vois pas quelle autre piste explorer.
ce auquel je n'ai pas pensé puisqu'il s'agit de ZEOSDBO
J'ai fait un test rapide avec D7 et ZEOSDBO 7.1.3
j'ai complètement oublié que l'on avait affaire à une procédure :arf:
la solution consiste donc peut être à passer non par un Zquery mais un ZStoredProc
Code:
1 2 3 4 5 6 7 8 9 10 11
|
procedure TForm1.Button1Click(Sender: TObject);
begin
with ZStoredProc1 do
begin
ParamByName('TABLENAME').asString:='TEST';
ParamByName('COLNAME').asString:='NOM';
ParamByName('PARTIENOM').asString:='lè';
Open;
end;
end; |
ceci fonctionne avec l'environnement indiqué
à noter que un TZReadonlyQuery avec ce SQL 'SELECT * FROM TEST WHERE LOWER(NOM) LIKE LOWER('%Lè%')' fonctionne sans erreur :calim2:
quelque chose comme ceci
Code:
1 2 3 4 5 6 7
| with ZReadOnlyQuery1 do
begin
Close;
SQL.Text:='SELECT * FROM TEST WHERE LOWER(NOM) LIKE :A';
ParamByName('A').asString:='%lè%';
Open;
end; |
fonctionne aussi
Par contre un LowerCase('LÈ') ne fonctionne pas sous D7 (donne lÈ)