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

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
TT
Le #21397951
Le Thu, 18 Mar 2010 16:24:39 +0100, 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 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
TT
Le #21398011
Le Thu, 18 Mar 2010 18:32:24 +0100, TT
Le Thu, 18 Mar 2010 16:24:39 +0100, 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 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
iglog
Le #21398251
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.
Tanguy
Le #21399211
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
iglog
Le #21400281


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
Firetox
Le #21400351
"iglog" 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
iglog
Le #21400411

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
Publicité
Poster une réponse
Anonyme