à tous
J'ai un problème d'optimisation de requête. En effet, je manipule des données issues du sgbd MySQL 5 dans mon appli VB6. Le hic est que je n'arrive pas à supprimer les lignes d'enregistrement vides ne respectant pas mon critère d'affichage (celui de la formation d'affectation).
Il est question d'afficher des agents d'une part par Grades et catégorie de grades récents dans 2 TextBox par le biais d'une première requête(Parent)
D'autre part afficher les infos relatives à l'identification d'agents lorsque ceux appartiennent à une formation choisie par l'utilisateur(requête fille).
Ci-dessus voici la procédure sous vb6 (elle fonctionne) et les 2 requêtes et le schéma des tables mises en jeu:
Les requêtes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 La procédure sous vb6 *************************************************** Dim WithEvents adoVisual As Recordset Dim varUser As New ADODB.Recordset Dim idMaRegion As Long Dim idMonSecteur As Long Dim idMonUnite As Long Private Sub cmdVisual_Click() Dim db As Connection Dim oText As TextBox 'Connection à la bd à la travers la source de données Set db = New Connection db.CursorLocation = adUseClient db.Open "PROVIDER=MSDataShape;Data PROVIDER=MSDASQL;dsn=SrceGemomil;uid=;pwd=;" 'Passage des lignes d'enregistrement Set adoVisual = New Recordset Set DataGrid1.DataSource = Nothing adoVisual.Open "SHAPE {SELECT P.`ID`, G.`LibelleGrade`, C.`LibelleCategorie`, P.`DatePromotion`" _ & " FROM `promotion_agents` AS P INNER JOIN `grades` AS G ON G.`IDgrade`=P.`IDgrade`" _ & " INNER JOIN `categorie` AS C ON C.`IDcategorie`=G.`IDcat` WHERE (SELECT COUNT(*)" _ & " FROM `promotion_agents` AS P2 WHERE P2.`ID` = P.`ID` AND P.`DatePromotion` < P2.`DatePromotion`) < 1} AS ParentCMD APPEND" _ & " ({SELECT A.`ID`, Nom, Prenom, DateEmbauche, DateAffectation" _ & " FROM `agents` as A INNER JOIN `affectation_agents` as AA ON AA.`ID`=A.`ID`" _ & " INNER JOIN `formations` as F ON F.`IDformation`=AA.`IDformation`" _ & " INNER JOIN `secteur` as S ON S.`IDsecteur`=F.`IDsecteur`" _ & " INNER JOIN `region` as R ON R.`IDregion`=S.`IDsecteur` WHERE" _ & " F.`IDformation`=" & idMonUnite & " AND (SELECT COUNT(*) FROM `affectation_agents` as AA2 WHERE" _ & " AA2.`ID`=AA.`ID` AND AA.`DateAffectation`<AA2.`DateAffectation`)<1} AS ChildCMD RELATE ID TO ID) AS ChildCMD", db, adOpenStatic, adLockOptimistic 'Lier les zones de texte au fournisseur de données For Each oText In Me.txtFields Set oText.DataSource = adoVisual Next Set DataGrid1.DataSource = adoVisual("ChildCMD").UnderlyingValue End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 La requête parent dont l'objet est l'affichage du grade et de la catégorie récents des agents vérifiant le critère d'appartenence à la formation choisie par l'utilisateur dans la requête fille ************************************* SELECT P.`ID`, G.`LibelleGrade`, C.`LibelleCategorie`, P.`DatePromotion` FROM `promotion_agents` AS P INNER JOIN `grades` AS G ON G.`IDgrade`=P.`IDgrade` INNER JOIN `categorie` AS C ON C.`IDcategorie`=G.`IDcat` WHERE (SELECT COUNT(*) FROM `promotion_agents` AS P2 WHERE P2.`ID` = P.`ID` AND P.`DatePromotion` < P2.`DatePromotion`) < 1Les tables associées:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 La requête fille dont l'objet est l'affichage des infos de tous les agents vérifiant le critère d'appartenance à la formation choisi par l'utilisateur à travers un combox ************************************* SELECT A.`ID`, Nom, Prenom, DateEmbauche, DateAffectation, LibelleFormation, LibelleSecteur FROM `agents` as A INNER JOIN `affectation_agents` as AA ON AA.`ID`=A.`ID` INNER JOIN `formations` as F ON F.`IDformation`=AA.`IDformation` INNER JOIN `secteur` as S ON S.`IDsecteur`=F.`IDsecteur` INNER JOIN `region` as R ON R.`IDregion`=S.`IDsecteur` WHERE F.`IDformation`=27 AND (SELECT COUNT(*) FROM `affectation_agents` as AA2 WHERE AA2.`ID`=AA.`ID` AND AA.`DateAffectation`<AA2.`DateAffectation`)<1
Merci d'avance de votre sollitude.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 CREATE TABLE `agents` ( `ID` smallint(6) unsigned NOT NULL auto_increment, `Nom` varchar(50) NOT NULL, `Prenom` varchar(50) NOT NULL, `DateNaissance` date NOT NULL, `DateEmbauche` date NOT NULL, `Sexe` enum('Masculin','Féminin') NOT NULL, `IDtitre` int(11) unsigned NOT NULL, `LieuNaissance` varchar(70) NOT NULL, `MatriculeSolde` varchar(7) NOT NULL, `MatriculeIncorporation` varchar(10) NOT NULL, PRIMARY KEY (`ID`), KEY `IDtitre` (`IDtitre`), CONSTRAINT `agents_fk` FOREIGN KEY (`IDtitre`) REFERENCES `titre` (`IDtitre`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `grades` ( `IDgrade` int(11) unsigned NOT NULL auto_increment, `LibelleGrade` varchar(70) NOT NULL, `IDcat` int(11) unsigned NOT NULL, `IDsouscat` int(11) unsigned NOT NULL, `AgeLimite` int(2) unsigned NOT NULL, PRIMARY KEY (`IDgrade`), KEY `IDcat` (`IDcat`), KEY `IDsouscat` (`IDsouscat`), CONSTRAINT `grades_fk` FOREIGN KEY (`IDcat`) REFERENCES `categorie` (`IDcategorie`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `grades_fk1` FOREIGN KEY (`IDsouscat`) REFERENCES `souscategorie` (`IDsouscategorie`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `categorie` ( `IDcategorie` int(11) unsigned NOT NULL auto_increment, `LibelleCategorie` varchar(20) NOT NULL, PRIMARY KEY (`IDcategorie`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `formations` ( `IDformation` int(11) unsigned NOT NULL auto_increment, `LibelleFormation` varchar(70) NOT NULL, `IDsecteur` int(11) unsigned NOT NULL, `VilleLocalisation` varchar(50) NOT NULL, PRIMARY KEY (`IDformation`), KEY `IDsecteur` (`IDsecteur`), CONSTRAINT `formations_fk` FOREIGN KEY (`IDsecteur`) REFERENCES `secteur` (`IDsecteur`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `promotion_agents` ( `ID` smallint(6) unsigned NOT NULL, `NumDMpromotion` varchar(70) NOT NULL, `DateSignature` date NOT NULL, `IDgrade` int(11) unsigned NOT NULL, `DatePromotion` date NOT NULL, PRIMARY KEY (`ID`,`NumDMpromotion`,`DateSignature`), KEY `ID` (`ID`), KEY `NumDMpromotion` (`NumDMpromotion`,`DateSignature`), KEY `IDgrade` (`IDgrade`), CONSTRAINT `promotion_agents_fk` FOREIGN KEY (`ID`) REFERENCES `agents` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `promotion_agents_fk1` FOREIGN KEY (`NumDMpromotion`, `DateSignature`) REFERENCES `dm_promotion` (`NumDMpromotion`, `DateSignature`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `promotion_agents_fk2` FOREIGN KEY (`IDgrade`) REFERENCES `grades` (`IDgrade`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `affectation_agents` ( `ID` smallint(6) unsigned NOT NULL, `NumDMaffectation` varchar(70) NOT NULL, `DateSignature` date NOT NULL, `DateAffectation` date NOT NULL, `IDformation` int(11) unsigned NOT NULL, `IDfonction` smallint(6) unsigned NOT NULL, PRIMARY KEY (`ID`,`NumDMaffectation`,`DateSignature`), KEY `ID` (`ID`), KEY `NumDMaffectation` (`NumDMaffectation`,`DateSignature`), KEY `IDformation` (`IDformation`), KEY `IDfonction` (`IDfonction`), CONSTRAINT `affectation_agents_fk` FOREIGN KEY (`ID`) REFERENCES `agents` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `affectation_agents_fk1` FOREIGN KEY (`NumDMaffectation`, `DateSignature`) REFERENCES `dm_affectation` (`NumDMaffectation`, `DateSignature`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `affectation_agents_fk2` FOREIGN KEY (`IDformation`) REFERENCES `formations` (`IDformation`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `affectation_agents_fk3` FOREIGN KEY (`IDfonction`) REFERENCES `fonctions` (`IDfonction`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Partager