IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

DB Firebird - Fonction inconnue à partir d'une application Delphi.


Sujet :

Bases de données Delphi

  1. #1
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut DB Firebird - Fonction inconnue à partir d'une application Delphi.
    Bonjour,

    Je teste la requête suivante dans IBExpert où elle fonctionne parfaitement.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    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é :
    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.

  2. #2
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut la réponse est là
    Bonjour,

    je ne comprends pas tout, mais je pense que ta réponse peut être ici : https://firebirdsql.org/refdocs/lang...udf-lower.html

    Cordialement

    André

  3. #3
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Désolé mais la création d'une fonction alternative n'y change rien.
    Merci quand même.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    à mon avis le problème ne vient pas de Firebird la fonction interne LOWER est connue et fonctionne correctement

    mais des composants utilisés (lesquels ?) pour la requête,

    ceci étant la requête elle même est améliorable
    Select distinct NOM from "TableProprio" where Lower(NOM) like Lower('%COUR%') order By NOM
    Questions :
    pourquoi un nom de table avec de " " s'il s'agit de Firebird ?
    pourquoi un Lower('%COUR%') alors que '%cour%' fait aussi bien l'affaire ?
    pourquoi un distinct et un order by ?
    de quelle version de Firebird parle t-on ?

    pourrait devenir
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    Select NOM from TableProprio where LOWER(NOM) SIMILAR TO '%cour%' group by NOM
    en jouant sur le CHARSET et la COLLATION de nom on doit même pouvoir éviter le LOWER mais là ça c'est une autre histoire
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    C'est pour répondre à une demande d'un ancien client dont les données sources ont changé de format que j'ai dû remettre les mains dans le cambouis.
    Je n'ai plus programmé depuis plus de 15 ans et j'avais oublié l'existence de «SIMILAR».
    La base de données plus ancienne encore est sous Firebird 1.5, version de l'époque, et j'utilise un TZQuery de Zeos.
    J'ai essayé de la convertir mais FDBConvert me renvoie
    20:08:22: Copying database file:
    (D:\ProgramsSources\Delphi4\CadacomCsvData\CadaCom.Fdb >> D:\ProgramsSources\Delphi4\CadacomCsvData\CadaCom_CONVERT_COPY.fdb)
    20:08:43: Checking database for corruption
    20:08:57: Checking NOT NULL fields for NULL values

    20:08:57: NULL values in NOT NULL columns has been detected
    Dynamic SQL Error
    SQL error code = -204
    Table unknown
    MAPMINMAX
    At line 1, column 25
    J'ai supprimé et recréé cette table mais l'erreur subsiste.
    De toute façon, le problème n'est pas là mais effectivement dans la source Delphi.

    Un grand merci pour la simplification.
    Pour les guillemets qui encadrent le nom de la table, c'est IBExpert qui les ajoute automatiquement.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Re,


    pour la convertir en fb2.5 il vaut mieux faire un backup avec la version 1.5 puis restaurer avec la version 2.5
    mais pour les contraintes c'est autre chose ....
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut 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 sql : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    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.

  8. #8
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut Filtre Delphi
    Bonjour,

    le filter du composant, c'est de la syntaxe Delphi mais plus SQL.
    Tu écris que ça fonctionne avec la chaine recherchée en début de chaine.

    Je ne sais pas si la méthode existe en fb 1.5, mais on n'a l'expression containing, pour remplacer like en firebird: http://www.janus-software.com/fbmanu...=psql&topic=83

    Cordialement

    André

  9. #9
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Merci alheuredudejeuner,

    Malheureusement, le filtre avec CONTAINING génère la même erreur que SIMILAR
    Le projet MonProjet.exe a provoqué une classe d'exception TZparseError avec le message 'Syntax error near CONTAINING"'. Processus stoppé.
    Je commence à désespérer.

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    si tu me fournissais un SQL qui me créerait une table et la remplirait (en gros un create et des inserts) je pourrai alors faire des tests.
    J'ai un poste avec D7 et Tokyo Starter ZEOSDBO installé, seule inconnue Firebird 1.5 mais il me faut peu de temps pour installer une version

    pour info SIMILAR TO n'est apparu qu'avec la version Firebird 2.5
    CONTAINING avec la version 2.0
    donc, si tu continue à taper sur une version 1.5 cela ne peut fonctionner

    Coincé avec la version 1.5 ? tu peux toujours utiliser des UDF je pense par exemple à FreeAdHoc qui contient des fonctions de recherche par exemple F_FINDWORD.
    Attention aux restrictions sur l'UTF8

    toutefois, selon moi, le mieux serait de passer à Firebird 2.5 ce qui devrait se faire sans difficultés (contrairement aux contraintes pour FB3)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 857
    Points : 11 291
    Points
    11 291
    Billets dans le blog
    6
    Par défaut
    Est-ce que le SQL qui fonctionne à partir de IBExpert peut être lancé par Delphi en dehors d'un composant "complexe" qui récupère des données ?
    Style un ZeosConnection (ou autre), par une sorte de ExecuteDirect, en créant une table temporaire pour insérer le résultat de la requête, puis lire cette table temporaire, selon le pseudo-schéma :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ZConnection1.ExecuteDirect( 'CREATE TABLE nom_temp (nom_proprio TEXT)' );
    ZConnection1.ExecuteDirect( 'Insert Into nom_temp (nom_proprio) Select Distinct NOM from TableProprio where LOWER(NOM) like Lower(''%COUR%'')' );
    ZQuery1.SQL.Text := 'SELECT * FROM nom_temp ORDER BY nom_proprio' ;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  12. #12
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    SergioMaster,

    J'ai pensé à Firebird 2.5 mais la liste déroulante des protocoles de ZConnection s'arrête à la version 1.5.

    tourlourou,

    ExecuteDirect n'est apparu qu'avec la version Zeos6 compatible avec Delphi 5 et ultérieure de Delphi.
    Or, pour rappel, cette application est très ancienne et a été programmée en Delphi 4 Pro.
    J'examine toutes les solutions avant de m'embarquer dans une voie radicale comme un changement de version de Delphi et de Firebird qui risque de me coûter beaucoup de temps. Sans savoir si une version plus récente de Delphi pourrait cohabiter avec Delphi 4 que je dois conserver pour comparaison des tests. Or le deuxième pc dont je dispose est sous Linux.
    Comme les requêtes fonctionnent dans IbExpert, j'ai aussi pensé à une procédure stockée mais il y a longtemps que je n'ai plus fait cette manipulation.

  13. #13
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 857
    Points : 11 291
    Points
    11 291
    Billets dans le blog
    6
    Par défaut
    Pour SQLite, le SGBD est contenu dans une dll dont on peut importer les fonctions. Une "connexion" au SGBD est conservée par un handle, et on exécute une requête sur le SGBD en passant un SQL à ce handle au moyen d'une fonction exportée de la dll.
    Je ne sais pas comment fonctionne FireBird, mais il y a pê moyen de procéder de façon similaire pour obtenir un pseudo-ExecuteDirect ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par defluc Voir le message
    J'ai pensé à Firebird 2.5 mais la liste déroulante des protocoles de ZConnection s'arrête à la version 1.5.
    déjà ça dépende de la version des ZEOSDBO la mienne propose même la version 3 de Firebird
    Or, pour rappel, cette application est très ancienne et a été programmée en Delphi 4 Pro.
    cela veux donc dire que tu utilises D4 ? ce n'était indiqué nulle part !

    Sans savoir si une version plus récente de Delphi pourrait cohabiter avec Delphi 4 que je dois conserver pour comparaison des tests.
    Bien sûr que oui, sur mon ancien poste j'ai d3, d7, d2010, quelques versions XE non effacées et Tokyo starter


    Comme les requêtes fonctionnent dans IbExpert, j'ai aussi pensé à une procédure stockée mais il y a longtemps que je n'ai plus fait cette manipulation.
    j'allais le proposer et c'est relativement simple par exemple

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SET TERM ^ ;
    CREATE PROCEDURE RECHERCHE 
     ( partieNom varchar(30) ) 
    RETURNS 
     ( Nom varchar(30))
    AS
    DECLARE VARIABLE S VARCHAR(30); 
    BEGIN
     S='%'||LOWER(:PARTIENOM)||'%';
     FOR SELECT NOM FROM TableProprio where LOWER(NOM) LIKE :S INTO :NOM 
      DO SUSPEND;  
    END^
    SET TERM ; ^
    un simple SELECT * FROM RECHERCHE('cour') devrait fonctionner
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  15. #15
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Un grand merci pour cet exemple.
    Sans vouloir abuser, est-il possible de passer le nom de la table et du champs en paramètre ?

  16. #16
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    J'essaie d'avancer avec une procédure comportant le nom de la table et du champs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    SET TERM ^ ;
    CREATE PROCEDURE FIELD_FROM_SUBSTR
     ( TableName VARCHAR(30), FieldName VARCHAR(30), ( StrSubStr varchar(30) )
    RETURNS 
     ( NOM varchar(180))
    AS
    DECLARE VARIABLE S VARCHAR(50);
    BEGIN
     S='%'||LOWER(:StrSubStr)||'%';
     WITH SELECT :FieldName FROM :TableName where LOWER(:FieldName) LIKE :S INTO :NOM 
      DO SUSPEND;  
    END
    ^
     
    SET TERM ; ^
     
     
    SET TERM ^ ;
    La compilation génère une erreur (parsing error) sur le mot clé "Select" suivant le "With".

    J'ai donc testé le code plus court de SergioMaster qui me donne la même erreur.

  17. #17
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    tout d'abord, mes excuses, un coquille de ma part, il s'agissait de FOR à mettre à la place de WITH (j'ai corrigé mon post précédent)

    Non, vous ne pouvez pas passer les noms de tables ou de colonnes en paramètres, du moins pas de cette manière. Si vous voulez mettre des noms de table ou de colonnes il faut faudra passer par la composition d'un SQL Statement (une variable VARCHAR) que vous exécuterez ensuite via un EXECUTE STATEMENT, une chance, existant déjà en FB 1.5 mais beaucoup moins complet

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    SET TERM ^ ;
    CREATE PROCEDURE FIELD_FROM_SUBSTR
     ( TableName VARCHAR(30), FieldName VARCHAR(30), ( StrSubStr varchar(30) )
    RETURNS 
     ( NOM varchar(180))
    AS
    DECLARE VARIABLE S VARCHAR(50); // 50, taille trop grande au maximum elle serait de 32
    DECLARE VARIABLE STMT VARCHAR(1024); 
    BEGIN
     S=LOWER(:StrSubStr); 
     // ici je fait une concaténation complète, FB1.5 ne permet un execute statement avec paramètre
     STMT='SELECT '||:FieldName||'  FROM '||:TableName||' WHERE  LOWER('||:FieldName||') LIKE "%'||S||'%" ';  
     //   FOR EXECUTE STATEMENT STMT  INTO :NOM 
      DO SUSPEND;  
    END
    ^

    ATTENTION DE BIEN VÉRIFIER LA CONSTRUCTION DU SQL STMT
    , il n'y a aucun contrôle de syntaxe de la part de Firebird sauf à l'exécution !

    en espérant ne pas avoir fait de fautes (SQL écrit à la volée)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  18. #18
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Merci SergioMaster grâce à qui je fais des bonds en avant dans la voie de LA solution.
    Voici ta source remaniée suite aux erreurs révélées par la compilation de IBExpert.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    begin
     S=:"StrSubStr";
     STMT='SELECT '||:"FieldName"||' FROM '||:"TableName"||' WHERE LOWER('||:"FieldName"||') LIKE "%'||S||'%"';
        FOR EXECUTE STATEMENT STMT  INTO :NOM
      DO SUSPEND;  
    end
    A l'exécution, une erreur incompréhensible est générée.
    Column does not belong to referenced table.
    Dynamic SQL Error.Sql error code = -206.
    Column unknown.
    %defg%.
    At line 1, column 49
    Incompréhensible pour moi parce que je ne vois pas pourquoi la sous-chaine de recherche est interprétée comme un nom de champs.

  19. #19
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Oui, il y a un problème de concaténation pour la partie LIKE, en fait j'ai hésité sur la formulation à faire double apostrophe ou guillemets et comme je n'ai pas pu tester, pas évident !
    Par contre j'avais testé avec succès la procédure que j'avais proposé initialement c'est juste une erreur de transcription (le WITH au lieu de FOR) qui coinçait

    j'ai testé (avec FlameRobin que je préfère à IBExpert) la procédure qui suit sur la base démo employee

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SET TERM ^ ;
    CREATE PROCEDURE RECHERCHE_P (
        TABLENAME CHAR(30),
        COLNAME CHAR(30),
        PARTIENOM VARCHAR(30) )
    RETURNS (
        NOM VARCHAR(30) )
    AS
    DECLARE VARIABLE S VARCHAR(30); 
    DECLARE VARIABLE STMT VARCHAR(1024);
    BEGIN
     S=LOWER(:PARTIENOM);
    STMT='SELECT '||COLNAME||' FROM '||TABLENAME||' where LOWER('||COLNAME||') LIKE (''%'||S||'%'')'; 
     FOR EXECUTE STATEMENT STMT INTO :NOM 
      DO SUSPEND;  
    END^
    SET TERM ; ^
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    SET TERM ^ ;
    CREATE PROCEDURE RECHERCHE_P (
        TABLENAME CHAR(30),
        COLNAME CHAR(30),
        PARTIENOM VARCHAR(30) )
    RETURNS (
        NOM VARCHAR(30) )
    AS
    -- DECLARE VARIABLE S VARCHAR(30);  inutile
    DECLARE VARIABLE STMT VARCHAR(1024);
    BEGIN
    -- S=LOWER(:PARTIENOM); inutile
    -- STMT='SELECT '||COLNAME||' FROM '||TABLENAME||' where LOWER('||COLNAME||') LIKE (''%'||S||'%'')';  remplacé
    STMT='SELECT '||COLNAME||' FROM '||TABLENAME||' where LOWER('||COLNAME||') LIKE (''%'||LOWER(PARTIENOM)||'%'')';
     FOR EXECUTE STATEMENT STMT INTO :NOM 
      DO SUSPEND;  
    END^
    SET TERM ; ^
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT p.NOM FROM RECHERCHE_P ('EMPLOYEE', 'FIRST_NAME', 'ar') p;
    avec succès les '' sont des doubles apostrophes pas des guillemets, en fait ma première intention était bien ces doubles apostrophes mais j'ai joué à pile ou face ce matin.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  20. #20
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    La procédure FIELD_FROM_SUBSTR fonctionne parfaitement avec l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    STMT='SELECT '||:"FieldName"||' FROM '||:"TableName"||' WHERE LOWER('||:"FieldName"||') LIKE (''%'||LOWER(S)||'%'')';
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NOM FROM field_from_substr('"TableProprio"', 'NOM', 'aryl')
    Trouve tous les enregistrements de champs NOM avec «Marylène» comme «Deprêtre, Marylène»

    Comme je m'y attendais, avec la sous-chaîne «arylè», la procedure FIELD_FROM_SUBSTR ne renvoit rien. Dommage, il faudra bien que je m'en accommode puisque SIMILAR est indisponible.

    Reste à tester à partir de Delphi. Je vous tiens au courant à ce propos.
    Un tout grand merci aux membres qui m'ont permis de franchir ce premier stade.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Appel d'Internet à partir d'une application Delphi
    Par JP.NUAGE dans le forum Web & réseau
    Réponses: 3
    Dernier message: 30/06/2008, 10h52
  2. Réponses: 5
    Dernier message: 22/05/2008, 14h42
  3. compresser un fichier à partir d'une application
    Par Julian21 dans le forum C++
    Réponses: 6
    Dernier message: 20/06/2007, 22h32
  4. Lancement de Outlook à partir d'une application Delphi
    Par meghaoui dans le forum Bases de données
    Réponses: 1
    Dernier message: 27/02/2007, 13h37
  5. [Print]Imprimer a partir d'une application web
    Par Chiabni dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 03/01/2006, 13h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo