Pour Firetox

Le
I.G.LOG
Bonjour Firetox
Suite de mes recherches pour récupérer le plus grand compte existant par
rapport à un compte quelconque.

J'ai cherché la méthode la plus simple.
Voici ce que je fais:
Je construit une chaine avec tous les comptes < MonCompte 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 y a mieux ?
J'avoue qu'avec des jointures j'ai des difficultés pour avoir le même
résultat

Encore merci
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 #17233051
Bonjour,

c'est une solution mais a mon sens ce n'est pas la meilleure
quelle la requete de base : celle qui remonte les infos tu dois avoir je
pense une table memoire que se rempli avec la requete ou un etat.

le code que tu viens de mettre est fait a chque lecture de cette requete ?
tu part de la table cptPlan qu'il faut lier a la table liasse ?

si c'est la cas je peux te montrer comment faire la requete en fonction de
la longueur du compte
en fait il te faudra X jointure X etant la longueur de la colonne compte
ensuite avec un if un peu muscle je te l'accorde tu auras le compte le plus
adequate sur 1 seul ligne celle qui remonte avec ta requete principal

Bon dev
@+


"I.G.LOG" 48ce6cc1$0$886$
Bonjour Firetox
Suite de mes recherches pour récupérer le plus grand compte existant par
rapport à un compte quelconque.

J'ai cherché la méthode la plus simple.
Voici ce que je fais:
Je construit une chaine avec tous les comptes < MonCompte 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 y a mieux ?
J'avoue qu'avec des jointures j'ai des difficultés pour avoir le même
résultat

Encore merci





I.G.LOG
Le #17233751
"Firetox" 48ce75b5$0$7859$
Bonjour,

c'est une solution mais a mon sens ce n'est pas la meilleure
quelle la requete de base : celle qui remonte les infos tu dois avoir je
pense une table memoire que se rempli avec la requete ou un etat.

le code que tu viens de mettre est fait a chque lecture de cette requete ?
tu part de la table cptPlan qu'il faut lier a la table liasse ?

si c'est la cas je peux te montrer comment faire la requete en fonction de
la longueur du compte
en fait il te faudra X jointure X etant la longueur de la colonne compte
ensuite avec un if un peu muscle je te l'accorde tu auras le compte le
plus adequate sur 1 seul ligne celle qui remonte avec ta requete principal

Bon dev
@+




Lors d'un ajout d'un compte quelconque, je recherche les codes liasse dans
la table CPTPLAN. Il n'y a pas de jointure avec d'autres tables.

La structure de CPTPLAN est la suivante:

IDCPTPLAN int(11) // autoincrement
COMPTE varchar(11) // Index
INTITULE varchar(120)
LIASSED char(3)
LIASSEC char(3)

Par exmple, il y a dans cette table les comptes suivants:
"41" "Clients et comptes rattachés" "030" "031"
"411" "Clients" "032" "033"
Si je recherche les codes liasse pour le compte "41100000011" je dois
récupérer les codes "032" et "033".
Pour le compte "41000000001", je dois trouver "030" et "031"...

Effectivement, je cherche la requete la plus optimale, car je pourrais
éventuellement l'utiliser à chaque lecture dans un état par exemple.
Firetox
Le #17233921
Bonjour,


Effectivement, je cherche la requete la plus optimale, car je pourrais
éventuellement l'utiliser à chaque lecture dans un état par exemple.



oui car dans le cas de ton compte c'est une requete pas mal
dans ce que je disais ou c'etait pas optimal c'est quand tu dis le passage
precedent. il y a un moyen de recuperer ces information sans faire a chaque
lecture une requete (imagine 100 ligne a imprimer = 100 requetes comme celle
que tu as faites = environ sous mySQL 3 centiemes par requete = 3 secondes
pour 1000 = 30 secondes !! pour 3000 = 1 minute 30 !!

pour le mode creation de compte si ta requete met moins de 1 seconde alors
c'est tolerable et de toute façon pas de jointure a faire

par contre imaginons que tu fasse un select remontant ces informations

select matable.Macol, matable.macol2, matable.compte

case
when CP1.compte is not null then CP1.compte
when CP1.compte is not null then CP1.compte
when CP1.compte is not null then CP1.compte
when CP1.compte is not null then CP1.compte
when CP1.compte is not null then CP1.compte
when CP1.compte is not null then CP1.compte

From matable

left join cptPlan as CP1 on CP1.compte = matable.compte
left join cptPlan as CP2 on CP2.compte = left(maTable.compte,10)
left join cptPlan as CP3 on CP3.compte = left(maTable.compte,9)
left join cptPlan as CP4 on CP4.compte = left(maTable.compte,8)
left join cptPlan as CP5 on CP5.compte = left(maTable.compte,7)
left join cptPlan as CP6 on CP6.compte = left(maTable.compte,6)
left join cptPlan as CP7 on CP7.compte = left(maTable.compte,5)
left join cptPlan as CP8 on CP8.compte = left(maTable.compte,4)
left join cptPlan as CP9 on CP9.compte = left(maTable.compte,3)
left join cptPlan as CP10 on CP10.compte = left(maTable.compte,2)
left join cptPlan as CP11 on CP11.compte = left(maTable.compte,1)

WHERE ..........

"I.G.LOG" 48ce84b9$0$956$

"Firetox" 48ce75b5$0$7859$
Bonjour,

c'est une solution mais a mon sens ce n'est pas la meilleure
quelle la requete de base : celle qui remonte les infos tu dois avoir je
pense une table memoire que se rempli avec la requete ou un etat.

le code que tu viens de mettre est fait a chque lecture de cette requete
?
tu part de la table cptPlan qu'il faut lier a la table liasse ?

si c'est la cas je peux te montrer comment faire la requete en fonction
de la longueur du compte
en fait il te faudra X jointure X etant la longueur de la colonne compte
ensuite avec un if un peu muscle je te l'accorde tu auras le compte le
plus adequate sur 1 seul ligne celle qui remonte avec ta requete
principal

Bon dev
@+




Lors d'un ajout d'un compte quelconque, je recherche les codes liasse dans
la table CPTPLAN. Il n'y a pas de jointure avec d'autres tables.

La structure de CPTPLAN est la suivante:

IDCPTPLAN int(11) // autoincrement
COMPTE varchar(11) // Index
INTITULE varchar(120)
LIASSED char(3)
LIASSEC char(3)

Par exmple, il y a dans cette table les comptes suivants:
"41" "Clients et comptes rattachés" "030" "031"
"411" "Clients" "032" "033"
Si je recherche les codes liasse pour le compte "41100000011" je dois
récupérer les codes "032" et "033".
Pour le compte "41000000001", je dois trouver "030" et "031"...

Effectivement, je cherche la requete la plus optimale, car je pourrais
éventuellement l'utiliser à chaque lecture dans un état par exemple.



Firetox
Le #17233911
oui car dans le cas de ton compte c'est une requete pas mal
dans ce que je disais ou c'etait pas optimal c'est quand tu dis le passage
precedent. il y a un moyen de recuperer ces information sans faire a chaque
lecture une requete (imagine 100 ligne a imprimer = 100 requetes comme celle
que tu as faites = environ sous mySQL 3 centiemes par requete = 3 secondes
pour 1000 = 30 secondes !! pour 3000 = 1 minute 30 !!

pour le mode creation de compte si ta requete met moins de 1 seconde alors
c'est tolerable et de toute façon pas de jointure a faire

par contre imaginons que tu fasse un select remontant ces informations


select matable.Macol, matable.macol2, matable.compte,
case
when CP1.compte is not null then CP1.compte
when CP2.compte is not null then CP2.compte
when CP3.compte is not null then CP3.compte
when CP4.compte is not null then CP4.compte
when CP5.compte is not null then CP5.compte
when CP6.compte is not null then CP6.compte
when CP7.compte is not null then CP7.compte
when CP8.compte is not null then CP8.compte
when CP9.compte is not null then CP9.compte
when CP10.compte is not null then CP10.compte
when CP11.compte is not null then CP11.compte
end as Idcompte
From matable

left join cptPlan as CP1 on CP1.compte = matable.compte
left join cptPlan as CP2 on CP2.compte = left(maTable.compte,10)
left join cptPlan as CP3 on CP3.compte = left(maTable.compte,9)
left join cptPlan as CP4 on CP4.compte = left(maTable.compte,8)
left join cptPlan as CP5 on CP5.compte = left(maTable.compte,7)
left join cptPlan as CP6 on CP6.compte = left(maTable.compte,6)
left join cptPlan as CP7 on CP7.compte = left(maTable.compte,5)
left join cptPlan as CP8 on CP8.compte = left(maTable.compte,4)
left join cptPlan as CP9 on CP9.compte = left(maTable.compte,3)
left join cptPlan as CP10 on CP10.compte = left(maTable.compte,2)
left join cptPlan as CP11 on CP11.compte = left(maTable.compte,1)

WHERE ..........

aura pour effet de te donner sur la ligne le compte correspondant ou NULL
s'il n'existe pas


mais comme je l'ai dis pour un compte seul (1 fiche compte ta requete va
très bien)
mais dans un select devant remonté l'information il faut eviter pour chaque
ligne de faire une autre requete : ca ralenti enormement les traitements

Bon dev
@+

"I.G.LOG" 48ce84b9$0$956$

"Firetox" 48ce75b5$0$7859$
Bonjour,

c'est une solution mais a mon sens ce n'est pas la meilleure
quelle la requete de base : celle qui remonte les infos tu dois avoir je
pense une table memoire que se rempli avec la requete ou un etat.

le code que tu viens de mettre est fait a chque lecture de cette requete
?
tu part de la table cptPlan qu'il faut lier a la table liasse ?

si c'est la cas je peux te montrer comment faire la requete en fonction
de la longueur du compte
en fait il te faudra X jointure X etant la longueur de la colonne compte
ensuite avec un if un peu muscle je te l'accorde tu auras le compte le
plus adequate sur 1 seul ligne celle qui remonte avec ta requete
principal

Bon dev
@+




Lors d'un ajout d'un compte quelconque, je recherche les codes liasse dans
la table CPTPLAN. Il n'y a pas de jointure avec d'autres tables.

La structure de CPTPLAN est la suivante:

IDCPTPLAN int(11) // autoincrement
COMPTE varchar(11) // Index
INTITULE varchar(120)
LIASSED char(3)
LIASSEC char(3)

Par exmple, il y a dans cette table les comptes suivants:
"41" "Clients et comptes rattachés" "030" "031"
"411" "Clients" "032" "033"
Si je recherche les codes liasse pour le compte "41100000011" je dois
récupérer les codes "032" et "033".
Pour le compte "41000000001", je dois trouver "030" et "031"...

Effectivement, je cherche la requete la plus optimale, car je pourrais
éventuellement l'utiliser à chaque lecture dans un état par exemple.



I.G.LOG
Le #17235181
Merci je vais essayer tout de suite
Publicité
Poster une réponse
Anonyme