WD12 - Pour les pros de MySQL

Le
I.G.LOG
Bonjour,
Je développe une module comptabilité. Je cherche à partir d'un n° de compte
quelconque retrouver à quelle classe il appartient.
A titre d'exemple, pour le compte client "41100001" je voudrais récupérer la
classe "411" si elle existe, sinon la classe 41 ou 4
Pour arriver à ça, je boucle sur le compte en enlevant chaque fois le
dernier caractère, comme suit:

x = taille(COMPTE)
BOUCLE
SI x = 0 ALORS SORTIR
lCompte = Gauche(lCompte,x)
SQLExec("select from LIASSE where NUMCOMPTE = '" + lCompte + "'","ReqC")
SI SQLFetch("ReqC") = 0 alors
// Trouvé

FIN
x--
FIN

Ca fonctionne, mais ce n'est ni "élégant" ni optimal.
Connaissez vous une fonction "magique" sous MySQL 4.1 qui permette
d'optimiser ce code ?

Merci à tous
Bon dev.

Phil
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
Firetox
Le #16789461
Bonjour,


tout depend de ce tu veux reellement remonter
avec un left join sur liasse et des or tu devrais avoir ce que tu veux

select ..........
liasse.numCompte
from matable1
left join liasse on
( left(matable1.compte,3) = liasse.numCompte
or left(matable1.compte,2) = liasse.numCompte
or left(matable1.compte,1) = liasse.numCompte )
whre ......

ce qui aura pour effet de remonter le compte existant correspondant : 411 si
il existe sinon 41 si il existe sinon 4 si il existe sinon NULL
si la taille du compte est superieure a 3 il faut ajouter des or

sinon au debut j'avais compris autre chose prendre le compte le plus grand
si par exemple 411, 41, 4 existent en meme temps
alors il faudra changer la requete et faire 3 jointures (les or seront
remplacer par une jointure sur liasse et ensuite dans le select mettre des
IF pour selectionner le plus important ou celui qui doit remonter en premier

tu obtien ton info en meme temps que la requete de depart au lieu pour
chaque ligne de faire un autre select

Bon dev
@+

Firetox


"I.G.LOG" 48c9674b$0$908$
Bonjour,
Je développe une module comptabilité. Je cherche à partir d'un n° de
compte quelconque retrouver à quelle classe il appartient.
A titre d'exemple, pour le compte client "41100001" je voudrais récupérer
la classe "411" si elle existe, sinon la classe 41 ou 4...
Pour arriver à ça, je boucle sur le compte en enlevant chaque fois le
dernier caractère, comme suit:

x = taille(COMPTE)
BOUCLE
SI x = 0 ALORS SORTIR
lCompte = Gauche(lCompte,x)
SQLExec("select from LIASSE where NUMCOMPTE = '" + lCompte +
"'","ReqC")
SI SQLFetch("ReqC") = 0 alors
// Trouvé
...
FIN
x--
FIN

Ca fonctionne, mais ce n'est ni "élégant" ni optimal.
Connaissez vous une fonction "magique" sous MySQL 4.1 qui permette
d'optimiser ce code ?

Merci à tous
Bon dev.

Phil



Firetox
Le #16792161
oui donc c'est la deuxieme j'avais bien vu
si tu as un probleme je peux te la donner en fait une fois compris le
mecanisme c'est simple a ecrire

bon dev
@+


"I.G.LOG" 48ca3985$0$898$
Bonjour

tout depend de ce tu veux reellement remonter
avec un left join sur liasse et des or tu devrais avoir ce que tu veux

select ..........
liasse.numCompte
from matable1
left join liasse on
( left(matable1.compte,3) = liasse.numCompte
or left(matable1.compte,2) = liasse.numCompte
or left(matable1.compte,1) = liasse.numCompte )
whre ......

ce qui aura pour effet de remonter le compte existant correspondant : 411
si il existe sinon 41 si il existe sinon 4 si il existe sinon NULL
si la taille du compte est superieure a 3 il faut ajouter des or




En fait je cherche à récupérer le compte le plus "approchant".
Pour "4110001" je voudrais réupérer le compte qui se rapproche le plus,
cad "411" si il existe, sinon "41" etc...
Cette requete va me remonter n'importe lequel non ?

sinon au debut j'avais compris autre chose prendre le compte le plus
grand si par exemple 411, 41, 4 existent en meme temps
alors il faudra changer la requete et faire 3 jointures (les or seront
remplacer par une jointure sur liasse et ensuite dans le select mettre
des IF pour selectionner le plus important ou celui qui doit remonter en
premier

tu obtien ton info en meme temps que la requete de depart au lieu pour
chaque ligne de faire un autre select



Oui c'est bien ce que je cherche (récupérer le plus grand), c'est donc sur
cette requete que je dois miser.
Je vais essayer de la construire.

Merci beaucoup
A+
Phil



I.G.LOG
Le #16792151
Bonjour

tout depend de ce tu veux reellement remonter
avec un left join sur liasse et des or tu devrais avoir ce que tu veux

select ..........
liasse.numCompte
from matable1
left join liasse on
( left(matable1.compte,3) = liasse.numCompte
or left(matable1.compte,2) = liasse.numCompte
or left(matable1.compte,1) = liasse.numCompte )
whre ......

ce qui aura pour effet de remonter le compte existant correspondant : 411
si il existe sinon 41 si il existe sinon 4 si il existe sinon NULL
si la taille du compte est superieure a 3 il faut ajouter des or




En fait je cherche à récupérer le compte le plus "approchant".
Pour "4110001" je voudrais réupérer le compte qui se rapproche le plus, cad
"411" si il existe, sinon "41" etc...
Cette requete va me remonter n'importe lequel non ?

sinon au debut j'avais compris autre chose prendre le compte le plus grand
si par exemple 411, 41, 4 existent en meme temps
alors il faudra changer la requete et faire 3 jointures (les or seront
remplacer par une jointure sur liasse et ensuite dans le select mettre des
IF pour selectionner le plus important ou celui qui doit remonter en
premier

tu obtien ton info en meme temps que la requete de depart au lieu pour
chaque ligne de faire un autre select



Oui c'est bien ce que je cherche (récupérer le plus grand), c'est donc sur
cette requete que je dois miser.
Je vais essayer de la construire.

Merci beaucoup
A+
Phil
I.G.LOG
Le #16792571
"Firetox" 48ca3a98$0$16991$
oui donc c'est la deuxieme j'avais bien vu
si tu as un probleme je peux te la donner en fait une fois compris le
mecanisme c'est simple a ecrire




Je vais essayer de la mettre en place (faut bien que je fasse travailler un
peu mes vieux neurones)
Je te tiens au courant.
Encore merci
I.G.LOG
Le #17232701
"Firetox" 48ca3a98$0$16991$
oui donc c'est la deuxieme j'avais bien vu
si tu as un probleme je peux te la donner en fait une fois compris le
mecanisme c'est simple a ecrire

bon dev
@+




Bonjour Firetox

J'ai cherché la méthode la plus simple pour rammener le plus grand compte.
Voici ce que je fais:
Je construit une chaine avec tous les comptes < compte et j'effectue la
recherche avec la clause in, ordonné par compte descendant en récupérant le
1er (limit 1)

lCond est une chaîne
lLong est un entier
lId est un entier

// Recherche des codes liasse
lCond = :mGet("COMPTE")
lLong = Taille(:mGet("COMPTE"))
BOUCLE
lLong--
SI lLong = 0 ALORS SORTIR
lCond += ("," + Gauche(lCond,lLong)) // me donne une chaine sous la
forme "4110005,411000,41100,4110,411,41,4"
FIN
lCond = Milieu(lCond,2) // Enleve la 1ere virgule
lCond = "select LIASSED,LIASSEC,COMPTE,IDCPTPLAN" +...
" from cptplan" +...
" where COMPTE in (" + lCond + ")" +...
" order by compte desc limit 1"
SI SQLExec(lCond,"ReqL") ALORS
SI SQLFetch("ReqL") = 0 ALORS
:mSet("LIASSED",SQLLitCol("ReqL",1))
:mSet("LIASSEC",SQLLitCol("ReqL",2))
lId = SQLLitCol("ReqL",4)
FIN
FIN
SQLFerme("ReqL")
RENVOYER lId

Est-ce la méthode la plus rapide ou il ya mieux ?
J'avoue qu'avec des jointures j'ai des difficultés pour avoir le même
résultat

Encore merci
Publicité
Poster une réponse
Anonyme