Bonjour,
Désolé :
Oups, mille excuses.
Ca devrait être bon pour toi (version Access2000) : 03072014BdD-graphes_souterrain.7z
Je peux lire la BdD, mais je ne comprends pas la question !
Peux-tu donner un exemple concret de ce que tu cherches ?
Bonjour,
Veux-tu savoir pour les 663 enregistrements, combien de fois on rencontre les suites :
G_SS/I_SS_6
I_SS_8/ G_SS
I_SS_8/ I_SS_6
En_SS_1/ En_SS_2
En_SS_2/ I_SS_6
I_SS_2/ G_SS
I_SS_2/ I_SS_6
…
C’est ça ?
Comme ceci ?
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 Public Function CombinAB() Dim i As Integer Dim sSQL As String DoCmd.SetWarnings False 'purge DoCmd.RunSQL "DELETE * FROM tCouples;" 'créer les couples For i = 1 To 6 sSQL = "INSERT INTO tCouples ( A, B ) SELECT N°" & i & ", N°" & i + 1 _ & " FROM TousLesTrains WHERE N°" & i & " Is Not Null AND N°" & i + 1 & " Is Not Null;" DoCmd.RunSQL sSQL Next i DoCmd.SetWarnings True 'Afficher résultats DoCmd.OpenQuery "rCombinAB" End Function
BdD ici : http://claudeleloup.developpez.com/&...souterrain.mdb
Bonjour,
Désolé pour ma demande qui n'était peut-être pas claire au début... mais tu as pourtant exactement fait ce que je souhaitais !
Merci infiniment.
Bonjour Claude,
Je reposte une question sur cette discussion après des mois d'absence. J'aurais besoin d'un coup de main, toujours sur le même boulot.
Suite à nos échanges (jusqu'au billet 59 pour être très précis, ensuite c'était autre chose), j'aurais besoin de faire une requête supplémentaire à partir de la requête "rAuFinal" (voir la Bdb que je t'ai mis en PJ). En effet, celle-ci contient plusieurs enregistrements composés de "Num_compo" séparés par des "||". J'aimerais ajouté une info supplémentaire à tout ça.
A partir de la table "Delai_douce" (qui associe pour chaque "Num_compo" une valeur "Delai_douce"), je souhaiterai une nouvelle requête qui consisterait à ajouter à la requête "rAuFinal" une colonne supplémentaire (que l'on pourrait appeler "MaxDelai_douce") contenant la plus grande valeur "Delai_douce" de tous les "Num_compo" présents dans la colonne "AuFinal". Par exemple pour l'enregistrement n°22 : "|| SMR_2 || MR_A || I_A_6" je souhaiterais que la colonne MaxDelai_douce m'affiche "1 à plusieurs années" car :
- SMR_2 : 1 à plusieurs années
- MR_A : 1 à plusieurs années
- I_A_6 : qq semaines à qq mois
- et le plus grand des trois est bien "1 à plusieurs années".
L'ordre croissant à suivre est un ordre logique : 0 à qq heures < qq heures à qq jours < qq jours à qq semaines < qq semaines à qq mois < 1 à plusieurs années.
Merci de ton aide !!
Michaël
Bonjour,
Voici une proposition de démarche.
1° J’ai créé une table :
2° J’ai ajouté une colonne à ta table Delai_douce
3° Ensuite, cette requête :
Pour obtenir ceci :
4° j’ai écrit cette petite fonction :
5° pour l’utiliser dans cette requête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Public Function PlusGrandDelai(AuFinal As String) As String Dim t() As String Dim i As Integer Dim sOrdre As String t = Split(AuFinal, " || ") For i = 1 To UBound(t) sOrdre = DLookup("Ordre", "Delai_douce", "Num_compo ='" & t(i) & "'") If sOrdre > PlusGrandDelai Then PlusGrandDelai = sOrdre End If Next i PlusGrandDelai = Right(PlusGrandDelai, Len(PlusGrandDelai) - 2) End Function
6° qui donne ceci :
C'est parfaitement clair et le résultat est exactement celui que j'attends
Mille mercis !
Bonjour Claude,
Je relance ce sujet quelques mois après, toujours sur le même travail concernant la même BdD.
A partir de la requête "rAuFinal" qui me donne une succession de composants (éléments encadrés par des : ||), j'aimerais associer un coût (une valeur donc) selon les composants successifs. Je suis parvenu à le faire via la fonction "cout_total_10puissance" qui va piocher les coûts composant par composant que j'ai indiqué dans la table "Cout".
Maintenant, j'aimerais ajouter un champ dans cette requête qui me donne un texte du type "de quelques XX euros à quelques YY euros" selon l'intervalle dans lequel se trouve la valeur "cout_tot_10puissance" précédemment calculée. J'ai écrit une fonction "cout_total_intervalle" mais elle ne fonctionne pas et m'affiche toujours le même texte qu'elle que soit la valeur "cout_tot_10puissance". As-tu une solution ?
Merci d'avance.
Ci-jointe la BdD au format Access 2000
Bonjour,
Voici :
Où était l’os :
- ta fonction « cout_total_10puissance » était définie en String : c’est du Double. Elle devient :
- J’ai réécrit ta fonction « cout_total_intervalle » :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Public Function cout_total_10puissance(AuFinal As String) As Double Dim t() As String Dim i As Integer Dim cout_t As String t = Split(AuFinal, " || ") For i = 1 To UBound(t) cout_t = DLookup("Cout_compo", "Cout", "Num_compo ='" & t(i) & "'") cout_total_10puissance = cout_total_10puissance + cout_t Next i End Function
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Public Function cout_total_intervalle(Nbre As Double) As String Select Case Nbre Case 0 To 999 cout_total_intervalle = "de 0 à quelques centaines d'euros" Case 999 To 9999 cout_total_intervalle = "de quelques centaines d'euros à quelques milliers d'euros" Case 9999 To 99999 cout_total_intervalle = "de quelques milliers d'euros à quelques dizaines de milliers d'euros" Case 99999 To 999999 cout_total_intervalle = "de quelques dizaines de milliers d'euros à quelques centaines de milliers d'euros" Case Is > 999999 cout_total_intervalle = "1 à plusieurs millions d'euros" End Select End Function
C'est parfait comme d'habitude, merci beaucoup !
Michaël
Bonjour,
Question que je me pose, toujours sur la BdD précédemment envoyée.
Est-il possible de construire une fonction qui permette :
- de sélectionner (menu déroulant par exemple) quelques Num_compo (CCS_A_1, CCS_A_2 etc.) que l'on souhaite (sans ordre dans cette sélection),
- de chercher parmi l'ensemble des enregistrements de "AuFinal" ceux qui contiennent les Num_compo sélectionnés précédemment (pas nécessairement ces Num_compo de façon consécutive dans les chaînes) ?
Par exemple, pour une liste de Num_compo A, B, C, D et E, ça donnerait :
- je sélectionne C et E
- la requête me retournerait les enregistrements de ce type :
- || A || B || D || C || E
- || E || B || A || C ||
- ...
C'est-à-dire tous les enregistrements dès lors qu'ils contiennent C et E (pas nécessairement C et E ou E et C successivement donc).
Merci pour ton aide !
Bonjour,
Voici un exemple :
- à l’ouverture, on affecte à la zone de liste, une table qui contient tous les Num_compo qui interviennent.
Lorsque tu choisis un Num_compo dans la liste, il s’ajoute dans la liste de ceux que tu as sélectionnés.
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 Private Sub Form_Open(Cancel As Integer) Dim rst As Recordset Dim tableau() As String Dim i As Integer 'Vidanger tNumCompo DoCmd.SetWarnings False DoCmd.RunSQL "DELETE * FROM tNumCompo;" 'Lire rAufinal et repeupler tNumCompo (les doublons sont rejetés Set rst = CurrentDb.OpenRecordset("rAufinal") Do Until rst.EOF tableau = Split(rst(0), "||") For i = 1 To UBound(tableau) DoCmd.RunSQL "INSERT INTO tNumCompo ( NumCompo ) SELECT """ & tableau(i) & """ AS Expr1;" Next i rst.MoveNext Loop DoCmd.SetWarnings True 'Déployer la zone de liste Me.cboNumCompo.RowSource = "tNumCompo" Me.cboNumCompo.SetFocus Me.cboNumCompo.Dropdown 'Libérer rst.Close Set rst = Nothing End Sub
Et quand tu cliques le bouton pour afficher, on crée une table tItemSelected que l’on affecte à la source du formulaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Private Sub cboNumCompo_AfterUpdate() If IsNull(Me.txtSelection) Then Me.txtSelection = Me.cboNumCompo Else Me.txtSelection = Me.txtSelection & ";" & Me.cboNumCompo End If End Sub
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 Private Sub btAfficher_Click() Dim i As Integer Dim tableau() As String If IsNull(Me.txtSelection) Then Exit Sub 'Vidanger tItemSelected DoCmd.SetWarnings False DoCmd.RunSQL "DELETE tItemSelected.ItemSelected FROM tItemSelected;" tableau = Split(Me.txtSelection, ";") For i = 0 To UBound(tableau) DoCmd.RunSQL "INSERT INTO tItemSelected ( ItemSelected ) " _ & "SELECT rAufinal.AuFinal,* FROM rAufinal WHERE AuFinal Like ""*" & tableau(i) & "*"" ; " Next i DoCmd.SetWarnings True Me.RecordSource = "tItemSelected" End Sub
Merci beaucoup pour ta rapide réponse !!
Il me semble par contre que le formulaire ne renvoie pas exactement ce que je souhaite. Par exemple, lorsque je sélectionne les 2 Num_compo "CCS_A_1" et "I_A_5", le formulaire me retourne les enregistrements de "rAuFinal" qui contiennent soit CCS_A_1 soit I_A_4. Or, je souhaiterais avoir les enregistrements qui contiennent à la fois CCS_A_1 et I_A_5. Pas nécessairement l'un directement à la suite de l'autre, mais par contre bien les deux dans le même enregistrement. Ainsi, les enregistrements suivants en vert sont ceux que je souhaite voir apparaître mais pas ceux en rouge :
Merci de ton aide.
OK, j'ai mal interprété la question.
Voici mieux, je crois :
Cette fois :
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 Private Sub btAfficher_Click() Dim rst As Recordset Dim i As Integer Dim tableau() As String If IsNull(Me.txtSelection) Then Exit Sub 'Vidanger tItemSelected DoCmd.SetWarnings False DoCmd.RunSQL "DELETE tItemSelected.ItemSelected FROM tItemSelected;" 'Spliter les NumCompo à trouver ensemble tableau = Split(Me.txtSelection, ";") 'Lire chaque enregistrement de rAufinal Set rst = CurrentDb.OpenRecordset("rAuFinal") Do Until rst.EOF For i = 0 To UBound(tableau) If rst("AuFinal") Like "*" & tableau(i) & "*" Then Else GoTo AuSuivant End If Next i DoCmd.RunSQL "INSERT INTO tItemSelected ( ItemSelected ) SELECT """ & rst("aufinal") & """ AS Expr1;" AuSuivant: rst.MoveNext Loop rst.Close Set rst = Nothing DoCmd.SetWarnings True Me.RecordSource = "tItemSelected" End Sub
Tes modifs sont bonnes, c'est parfait.
Je me demande juste (par pure curiosité presque) s'il n'est pas possible de se passer de la fonction "Form_Open" qui génère la table "tNum_compo". Parce qu'en fait cette table recense l'ensemble des Num_compo qui sont présents dans "rAufinal". Or cette liste existe déjà dans certaines tables telles que "Cout", "Delai_douce", "Delai_violente". Bon, mais c'est vraiment du détail là.
Encore une fois merci infiniment pour ton aide !
Bonjour,
Dans l'événement sur ouverture, on construit une table qui contient les NumCompo qui sont présents dans la table rAuFinal.
Si le contenu de rAuFinal n'évolue pas, alors tu peux supprimer l'événement sur ouverture et modifier le formulaire1 comme ceci :
Parfait, j'ai fait exactement comme tu me l'as indiqué. Merci Claude !
Bonjour Claude,
J'ai de nouveau besoin de tes précieux conseils.
Toujours sur la même BdD, pour poursuivre sur le formulaire que tu m'as aidé à faire la dernière fois, j'aimerais aller plus loin. Mon idée serait de pouvoir sélectionner une suite de Num_compo (= que j'appelle un "scénario"), affecter un nombre de Num_compo impactés et multiplier ce nombre par le coût unitaire d'un Num_compo pour obtenir un coût total du scénario. Et de plus, obtenir le délai total du scénario, on prendrait le max des délais de chaque Num_compo (on ferait ce travail à la fois pour les délais présents dans la table "Délai_douce" et dans la table "Délai_violente").
Voilà à peu près comment je verrais le formulaire (je me suis permis de faire des petits schémas pour être, je l'espère, plus clair) :
- D'abord, on repart sur la base du précédent formulaire ("Recherche_scenarios") avec une liste déroulante pour sélectionner les Num_compo souhaités et une zone de texte affichant ceux sélectionnés
- Ensuite, on afficherait les différents Num_compo sélectionnés et en face de chacun d'entre eux, il y aurait : une case dans laquelle l'utilisateur indique un nombre (correspondant à un coefficient multiplicateur en fait), à côté tu aurais l'unité de ce cout (qui est disponible dans la table "Cout", champ "Cout_unite"), puis ensuite s'afficherait le délai_douce et le délai_violente (disponibles dans les tables "Delai_douce" et "Delai_violente", champ "Delai_douce" et "Delai_violente) de ce Num_compo.
- Enfin, un bouton nous permettrait d'afficher : le cout total du scénario (qui correspond donc à la somme des coeff multiplicateur * coût unitaire), le délai_douce (qui est le max du délai_douce des Num_compo présents dans le scénario) et le délai_violente (qui est le max du délai_violente des Num_compo présents dans le scénario).
Penses-tu qu'un tel formulaire serait possible ?
En PJ, la BdD.
Encore merci pour ton aide,
Michaël
Partager