[Résolu][Base] Utiliser une fonction dans une requête SQL

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Cedric38
Fraîchement OOthentifié
Messages : 4
Inscription : 08 juin 2011 11:50

[Résolu][Base] Utiliser une fonction dans une requête SQL

Message par Cedric38 »

Bonjour,

Suite à une migration de Microsoft Access 97 à OOo 3.1 (dont je suis content: je ne ferais pas le chemin inverse !), je dois réécrire toutes mes macros et fonctions. :(

Je bute sur un bout de code qui ne posait pas de problème dans Access: j'ai besoin de rechercher des enregistrements dans une base en fonction d'un texte donné par l'utilisateur. Dans mon code, j'utilise l'instruction SQL suivante:

aSQL = "SELECT ""SPI"", ""Nom1"", ""Nom2"" FROM ""TABDossiers"" WHERE ""SPI"" LIKE '%" & nomSelect & "%' OR ""Nom1"" LIKE '%" & nomSelect & "%' OR ""Nom2"" LIKE '%" & nomSelect & "%' ORDER BY ""Nom1"", ""Nom2"", ""SPI"""

où "nomSelect" est la chaîne de caractères donnée par l'utilisateur.

Tel quelle, cette instruction fonctionne. Le problème est que l'opérateur "LIKE" est sensible à la casse.

Pour l'éviter, j'ai donc voulu faire une fonction que j'ai nommée "FChaineMajuscule(nomSelect)" qui me retourne la chaîne en majuscule et débarrassée de ses accents, trémas et autres (même des apostrophes): à=a=A, ù=u=U, ... . La fonction marche et me retourne ce que je veux.

Mais comment l'incorporer dans mon instruction SQL ? Je peux effectivement changer les "nomSelect" par "FChaineMajuscule(nomSelect)" (pas de problème) mais comment faire de même pour les colonnes (SPI, Nom1 et Nom2) de ma table ?

Merci d'avance.
Window XP SP3 et OOo 3.1
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12838
Inscription : 08 nov. 2005 16:23
Localisation : Brest, France

Re: Utilisation d'une fonction perso dans une instruction SQ

Message par Bidouille »

Bonjour,

Ce forum est organisé en sections et votre question a été déplacée. Elle a été balisée conformément aux règles mentionnées dans le bandeau rouge en haut de la page.

Merci de votre collaboration pour poster au bon endroit la prochaine fois.
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26195
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Utiliser une fonction dans une requête SQL

Message par Dude »

Salut,
Cedric38 a écrit :Pour l'éviter, j'ai donc voulu faire une fonction que j'ai nommée "FChaineMajuscule(nomSelect)" qui me retourne la chaîne en majuscule
Euh, pourquoi ne pas utiliser la commande SQL UPPER ?

:?:
Cedric38
Fraîchement OOthentifié
Messages : 4
Inscription : 08 juin 2011 11:50

Re: [Base] Utiliser une fonction dans une requête SQL

Message par Cedric38 »

Bonjour,

La fonction UPPER est sensible à la casse: du coup, les lettres avec accents gardent leurs accents. A chaque utilisateur sa façon de renseigner les zones de texte: en minuscule et/ou majuscule, avec ou sans accent. Cela rend complexe une recherche dans la base. C'est pour cela que je voudrais que "Aurélie" devienne "AURELIE" (sans accent sur le E) dans mon instruction SQL pour être sûr que tout les enregistrements contenant ce prénom soient sélectionnés, quelle que soit la casse.

N'étant pas expert en SQL, j'ai suivi votre lien (très interessant d'ailleurs même s'il a du mal à s'afficher sur mon écran) que vous avez fourni (http://wiki.services.openoffice.org/wik ... t.C3.A8res) et j'ai remarqué la fonction REPLACE. J'ai essayé de l'utiliser de la façon suivante:

"SELECT ""SPI"", ""Nom1"", ""Nom2"" FROM ""TABDossiers"" WHERE UPPER(REPLACE(""é"", Nom1, ""e"")) LIKE ...
puis "SELECT ""SPI"", ""Nom1"", ""Nom2"" FROM ""TABDossiers"" WHERE UPPER(REPLACE(""é"", ""Nom1"", ""e"")) LIKE ...

mais je tombe sur l'erreur suivante:
Une exception s'est produite
Type: com.sun.star.sdbc.SQLException
Message: Syntax error in SQL expression.

Visiblement, je ne dois pas l'utiliser correctement. Peut être que l'utilisation de deux fonctions l'une dans l'autre n'est pas autorisé ?

Sinon, j'ai une solution de repli mais qui ne me satisfait pas complétement: reprendre toute la table par une macro pour enlever tous les accents et autres afin que la fonction UPPER me retourne le résultat souhaité et empêcher par la suite l'enregistrement de chaînes qui comportent ces caractères. Mais cette solution ne me convient guère car les accents font parti de notre écriture.
Window XP SP3 et OOo 3.1
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 17219
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: [Base] Utiliser une fonction dans une requête SQL

Message par jeanmimi »

Bonjour,
l'opérateur "LIKE" est sensible à la casse
Sans voir ta base, c'est un peu moins facile de regarder les champs.
Mais je ne suis pas tout à fait de ton avis car :
La sensibilité à la casse doit être précisée avant la création des tables. Les tables existantes et leurs données ne sont pas affectées lors d'un changement de sensibilité à la casse. Lorsque vous choisissez d'ignorer la casse, les colonnes de type VARCHAR sont créées en tant que VARCHAR_IGNORECASE dans les nouvelles tables.
De même, cette FAQ illustre bien la possibilité d'interrogation par une requête sans contrainte de casse :
http://wiki.documentfoundation.org/FR/FAQ/Base/115
LibreOffice : Version : 25.8.4 (x64)(23 février 2026)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26195
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Utiliser une fonction dans une requête SQL

Message par Dude »

Pense à encadrer ton code afin de faciliter la lecture :

Code : Tout sélectionner

"SELECT ""SPI"", ""Nom1"", ""Nom2"" FROM ""TABDossiers"" WHERE UPPER(REPLACE(""é"", Nom1, ""e"")) LIKE ...
Cedric38 a écrit :Visiblement, je ne dois pas l'utiliser correctement. Peut être que l'utilisation de deux fonctions l'une dans l'autre n'est pas autorisé ?
Un petit tour sur le suprême de code : http://user.services.openoffice.org/fr/ ... =15&t=1454
Il faut distinguer les noms de champs, des variables.

Rien ne t'empêche d'avoir ta fonction de mise en majuscule intégrée dans la chaîne avant d'envoyer ta requête SQL.
Cedric38
Fraîchement OOthentifié
Messages : 4
Inscription : 08 juin 2011 11:50

Re: [Base] Utiliser une fonction dans une requête SQL

Message par Cedric38 »

Désolé pour la présentation...je ne peux que m'améliorer.
jeanmimi a écrit :Sans voir ta base, c'est un peu moins facile de regarder les champs.
Pour commencer, je vous joins ma base (allégée) et le fichier Calc dans lequel se trouve mes macros et fonctions. J'aurais dû le faire dès le début. :oops:

L'instruction SQl qui me pose problème se trouve dans la fonction "FObtenirDossier" (Lib "LibFonctionsBoitesDialogues", module "ModFObtenirDossier") à la ligne 47 du fichier Calc. Cette fonction affiche une boîte de dialogues avec laquelle je fais les essais.
La sensibilité à la casse doit être précisée avant la création des tables. Les tables existantes et leurs données ne sont pas affectées lors d'un changement de sensibilité à la casse. Lorsque vous choisissez d'ignorer la casse, les colonnes de type VARCHAR sont créées en tant que VARCHAR_IGNORECASE dans les nouvelles tables.
J'ai passé le type des colonnes "Nom1" et "Nom2" (de la table "TABDossiers") à VARCHAR_IGNORECASE: cela a réglé le problème des majuscules/minuscules mais les lettres accentuées n'ont toujours pas le même poids que leurs équivalentes en minuscules. Si vous faites un essai avec "Céline" et "Celine", vous verrez que le résultat obtenu est différent en utilisant l'instruction suivante:

Code : Tout sélectionner

"SELECT ""SPI"", ""Nom1"", ""Nom2"" FROM ""TABDossiers"" WHERE ""SPI"" LIKE '%" & nomSelect & "%' OR ""Nom1"" LIKE '%" & nomSelect & "%' OR ""Nom2"" LIKE '%" & nomSelect & "%' ORDER BY ""Nom1"", ""Nom2"", ""SPI"""
Après un petit tour sur le suprême de code (merci Dude), j'ai essayé l'instruction suivante:

Code : Tout sélectionner

"SELECT ""SPI"", ""Nom1"", ""Nom2"" FROM ""TABDossiers"" WHERE ""SPI"" LIKE '%" & nomSelect & _
			"%' OR REPLACE('é', ""Nom1"", 'e') LIKE '%" & nomSelect & "%'"
Et là, c'est la cata, je ne retrouve plus Céline, avec ou sans accent. Il me semble pourtant utiliser la fonction REPLACE correctement.
Dude a écrit :Rien ne t'empêche d'avoir ta fonction de mise en majuscule intégrée dans la chaîne avant d'envoyer ta requête SQL.
Désolé, mais je n'ai pas dû comprendre la manip. J'ai effectivement essayé l'instruction suivante:

Code : Tout sélectionner

"SELECT ""SPI"", ""Nom1"", ""Nom2"" FROM ""TABDossiers"" WHERE ""SPI"" LIKE '%" & nomSelect & "%' OR FChaineMajuscule(""Nom1"") LIKE '%" & nomSelect & "%' OR FChaineMajuscule(""Nom2"") LIKE '%" & nomSelect & "%' ORDER BY ""Nom1"", ""Nom2"", ""SPI"""
...mais ça ne marche pas. Peux-tu m'en dire plus ?

En tout cas, merci à tous pour votre aide.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Window XP SP3 et OOo 3.1
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26195
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Utiliser une fonction dans une requête SQL

Message par Dude »

Je n'avais pas compris que dans la base elle-même, les données pouvaient être avec une casse accentuée.
Dans ce cas, je ne vois que l'ajout d'une nouvelle colonne qui contiendra l'information sans accent. C'est sur ce principe que certains CMS fonctionnent pour la recherche par exemple.

Sinon, tu peux aussi voter pour la demande 49185 qui réclame la possibilité d'intégrer ses propres fonctions macro dans une requête.
Cedric38
Fraîchement OOthentifié
Messages : 4
Inscription : 08 juin 2011 11:50

Re: [Base] Utiliser une fonction dans une requête SQL

Message par Cedric38 »

Désolé, je m'étais sûrement mal exprimé.

La base pouvant être assez volumineuse, je préfère garder une seule colonne (mais effectivement, c'est une bonne idée !). Je vais donc opter pour l'éradication des accents dans la base.

Je vais aussi aller faire un tour du côté de la demande 49185...

Merci à tous.
Window XP SP3 et OOo 3.1