Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

WD12 - Aux spécialistes des expressions régulières

7 réponses
Avatar
iglog
Bonjour,
Je cherche a extraire d'une requete select tous les noms des tables
concernées.
Pour ça j'utilise les expressions régulières. C'est vrai que je pourrais le
faire plus simplement avec ExtraitChaine() !! mais c'est moins rapide
d'après ce que je sais.. et puis, j'ai mis la main dans les regexp (pour ma
culture personnelle donc)

Voici le code que j'utilise:

// Renvoi les tables de la requete
lExp = ".* [from]* (.*)" // Nom qui suit le "from"
SI VérifieExpressionRégulière(:SQLBrut,lExp,lRes) ALORS
lRet = ExtraitChaîne(lRes,1," ") + ","
lEval = lRes
lExp = ".* join (.*) on (.*)" // Nom entre "join" et "on"
BOUCLE
SI PAS VérifieExpressionRégulière(lEval,lExp,lRes,lSuite) ALORS
SORTIR
SI lRes <> "" ALORS
lRet += lRes + ","
lEval = lSuite // on prend la
sous-chaine restante
FIN
FIN
FIN

Malheureusement je viens de m'apercevoir que dans la deuxième évaluation
(VérifieExpressionRégulière dans la boucle), si il y a plusieurs "join ...
on" seule la dernière occurrence est prise !!! Alors que je voudrais, au
contraire, que seule la 1ere soit prise pour pouvoir traiter ensuite la
chaine restante (se trouvant dans lSuite)

Voici une requete pour laquelle le code précédent me retourne
"tiers,t_donnc" au lieu de "tiers,article,t_donnc" !!!

select * from tiers inner join article on article.IDTIERS = tiers.IDTIERS
inner join t_donnc on t_donnc.ID_LIGNE = article.IDARTICLE

Merci pour vos idées

7 réponses

Avatar
TT
Le Thu, 18 Mar 2010 16:24:39 +0100, iglog a écrit :

Bonjour,
Je cherche a extraire d'une requete select tous les noms des tables
concernées.
Pour ça j'utilise les expressions régulières. C'est vra i que je pourrais
le
faire plus simplement avec ExtraitChaine() !! mais c'est moins rapide
d'après ce que je sais.. et puis, j'ai mis la main dans les regex p (pour
ma
culture personnelle donc)

Voici le code que j'utilise:

// Renvoi les tables de la requete
lExp = ".* [from]* (.*)" // Nom qui suit le "f rom"
SI VérifieExpressionRégulière(:SQLBrut,lExp,lRes) ALORS
lRet = ExtraitChaîne(lRes,1," ") + ","
lEval = lRes
lExp = ".* join (.*) on (.*)" // Nom entre "join" et "on"
BOUCLE
SI PAS VérifieExpressionRégulière(lEval,lExp,lR es,lSuite) ALORS
SORTIR
SI lRes <> "" ALORS
lRet += lRes + ","
lEval = lSuite // on prend la
sous-chaine restante
FIN
FIN
FIN

Malheureusement je viens de m'apercevoir que dans la deuxième à ©valuation
(VérifieExpressionRégulière dans la boucle), si il y a plusieurs "join
...
on" seule la dernière occurrence est prise !!! Alors que je voudr ais, au
contraire, que seule la 1ere soit prise pour pouvoir traiter ensuite l a
chaine restante (se trouvant dans lSuite)

Voici une requete pour laquelle le code précédent me retourn e
"tiers,t_donnc" au lieu de "tiers,article,t_donnc" !!!

select * from tiers inner join article on article.IDTIERS = tiers.ID TIERS
inner join t_donnc on t_donnc.ID_LIGNE = article.IDARTICLE

Merci pour vos idées




Bonjour

Je ne suis pas un gourou en expressions régulières, mais nous en utilisons
(essentiellement en perl) et
c'est leur comportement normal elles sont avides et essaient toujours de
mettre en correspondance la chaîne la
plus longue possible. Je ne suis pas sûr que les regexp de WD dispo sent de
syntaxes permettant de traiter ce cas.


--
TT
Avatar
TT
Le Thu, 18 Mar 2010 18:32:24 +0100, TT a écrit:

Le Thu, 18 Mar 2010 16:24:39 +0100, iglog a écr it:

Bonjour,
Je cherche a extraire d'une requete select tous les noms des tables
concernées.
Pour ça j'utilise les expressions régulières. C'est vr ai que je




[...]

Malheureusement je viens de m'apercevoir que dans la deuxième à ©valuation
(VérifieExpressionRégulière dans la boucle), si il y a plusieurs "join
...
on" seule la dernière occurrence est prise !!! Alors que je voud rais, au
contraire, que seule la 1ere soit prise pour pouvoir traiter ensuite la
chaine restante (se trouvant dans lSuite)

Voici une requete pour laquelle le code précédent me retour ne
"tiers,t_donnc" au lieu de "tiers,article,t_donnc" !!!

select * from tiers inner join article on article.IDTIERS =
tiers.IDTIERS
inner join t_donnc on t_donnc.ID_LIGNE = article.IDARTICLE

Merci pour vos idées




Bonjour

Je ne suis pas un gourou en expressions régulières, mais nou s en
utilisons (essentiellement en perl) et
c'est leur comportement normal elles sont avides et essaient toujours de
mettre en correspondance la chaîne la
plus longue possible. Je ne suis pas sûr que les regexp de WD dis posent
de syntaxes permettant de traiter ce cas.




Voir (au hasard) ici :
http://www.bigre.ulb.ac.be/Users/defrance/Enseignements/2004/Ressources/ regex.pdf
(pages 16 sq)


--
TT
Avatar
iglog
Bonsoir,
En effet, le problème parrait assez compliqué (voire "insoluble").
Je vais peut-être m'orienter sur des fonctions plus usuelles Windev.
En tous cas merci de t'être interessé à ce sujet.
Bon dev.
Avatar
Tanguy
Bonjour,
Je cherche a extraire d'une requete select tous les noms des tables
concernées.
Pour ça j'utilise les expressions régulières. C'est vrai que je pourrais le
faire plus simplement avec ExtraitChaine() !! mais c'est moins rapide d'après
ce que je sais.. et puis, j'ai mis la main dans les regexp (pour ma culture
personnelle donc)

Voici le code que j'utilise:

// Renvoi les tables de la requete
lExp = ".* [from]* (.*)" // Nom qui suit le "from"
SI VérifieExpressionRégulière(:SQLBrut,lExp,lRes) ALORS
...
Merci pour vos idées




Il y a deja un gros probleme : la syntaxe [from] veut dire "f" ou "r"
ou "o" ou "m"

Ce serait deja plutot de la forme "(.*)(from|From|FROM)(.*)"

Mais en général il faut éviter au maximum les .* dans une exp.
régulière...

Je te conseille donc de séparer les colonnes de la requete pour ne
conserver que le "FROM ..." avec
sReq = sReq[[Position(sReq,"from",1,SansCasse) A]]


--
Contact : http://tanguy.ath.cx
Avatar
iglog


Il y a deja un gros probleme : la syntaxe [from] veut dire "f" ou "r" ou
"o" ou "m"

Ce serait deja plutot de la forme "(.*)(from|From|FROM)(.*)"

Mais en général il faut éviter au maximum les .* dans une exp.
régulière...

Je te conseille donc de séparer les colonnes de la requete pour ne
conserver que le "FROM ..." avec
sReq = sReq[[Position(sReq,"from",1,SansCasse) A]]





Bonjour,
Merci pour la remarque.
J'ai ajouté ces crochets - effectivement c'est une erreur - lors de mes
essais.
Je ne teste que "from" car j'ai préalablement converti la requete en
minuscules (par Minuscule(pRequete))
Je vais éviter les .*, mais de toute façon je crois que ça ne va pas être
facile avec les regexp d'extraire tous les noms de tables d'une requète
quelconque. Je vais peut-être passer par "explain ..." de MySQL, mais qui
n'est pas applicable à toutes les SGBD et qui peut être long lorsque la
requète est complexe (d'après mes essais)
Encore merci
Avatar
Firetox
"iglog" a écrit dans le message de
news:4ba319bb$0$17864$



Il y a deja un gros probleme : la syntaxe [from] veut dire "f" ou "r" ou
"o" ou "m"

Ce serait deja plutot de la forme "(.*)(from|From|FROM)(.*)"

Mais en général il faut éviter au maximum les .* dans une exp.
régulière...

Je te conseille donc de séparer les colonnes de la requete pour ne
conserver que le "FROM ..." avec
sReq = sReq[[Position(sReq,"from",1,SansCasse) A]]





Bonjour,
Merci pour la remarque.
J'ai ajouté ces crochets - effectivement c'est une erreur - lors de mes
essais.
Je ne teste que "from" car j'ai préalablement converti la requete en
minuscules (par Minuscule(pRequete))
Je vais éviter les .*, mais de toute façon je crois que ça ne va pas être
facile avec les regexp d'extraire tous les noms de tables d'une requète
quelconque. Je vais peut-être passer par "explain ..." de MySQL, mais qui
n'est pas applicable à toutes les SGBD et qui peut être long lorsque la
requète est complexe (d'après mes essais)
Encore merci




Bonjour,

pour avoir essayer au moment du developpement du Data Center j'ai pris
l'option de laisser les requetes quelconques telles quelles et ne pas faire
de modif dessus par contre j'ai mis en place un explorateur de base (like
wdmap) pour voir les tables unitairement (avec possibilité de limiter le nb
enreg et de faire des filtres) cette table remonte toutes les colonnes de la
table et permet la mise a jour en cascade (on modifie plusieurs ligne et on
enregistre).

comme cela on peut faire des requetes complexes et voir les differents
resultats et en mode table on peut etre en ajout modif (les update etant
fait sur les seules colonnes qui ont changées de valeurs)

tu as cela dans le source du data center duspo sur SQLManagerX
http://www.sqlmanagerx.com/websqlx/html/modules/mydownloads/visit.php?cid=3&lid&

cordialement
Avatar
iglog

Bonjour,

pour avoir essayer au moment du developpement du Data Center j'ai pris
l'option de laisser les requetes quelconques telles quelles et ne pas
faire de modif dessus par contre j'ai mis en place un explorateur de base
(like wdmap) pour voir les tables unitairement (avec possibilité de
limiter le nb enreg et de faire des filtres) cette table remonte toutes
les colonnes de la table et permet la mise a jour en cascade (on modifie
plusieurs ligne et on enregistre).

comme cela on peut faire des requetes complexes et voir les differents
resultats et en mode table on peut etre en ajout modif (les update etant
fait sur les seules colonnes qui ont changées de valeurs)

tu as cela dans le source du data center duspo sur SQLManagerX
http://www.sqlmanagerx.com/websqlx/html/modules/mydownloads/visit.php?cid=3&lid&




Bonjour,
Oui, ca semble être le meilleur compromis.
Merci pour cette idée, je vais creuser ça.
Bon dev
Phil