à 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:

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
Les requêtes:
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`) < 1
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
Les tables associées:
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;
Merci d'avance de votre sollitude.