Bonjour Phil Rob
Grace à ton fichier exemple, j'ai réussi a adapter mon projet et maintenant j'arrive a transférer les données d'un formulaire à l'autre.
Encore un tout grand merci pour ton aide.
Très bonne journée à toi
Bonjour Phil Rob
Grace à ton fichier exemple, j'ai réussi a adapter mon projet et maintenant j'arrive a transférer les données d'un formulaire à l'autre.
Encore un tout grand merci pour ton aide.
Très bonne journée à toi
Il s'agit d'une gestion des contacts dans les filiales d'une société. Cela n'a rien de plus parlant sauf si c'est cette gestion que tu veux faire.
Cette gestion répond aux questions suivantes :
- Un enregistrement de Filiale est-il en relation avec au moins 1 enregistrement de Contact ? => OUI (Il y a au moins un contact à la filiale, sauf si on gère aussi les filiales avec lesquelles nous ne communiquons jamais, peu probable)
- Un enregistrement de Filiale peut-il être en relation avec plusieurs enregistrements de Contact ? => OUI (Il peut y avoir plusieurs un contacts à la filiale, un à la compta, un au service commercial, ...)
- Un enregistrement de Contact est-il en relation avec au moins 1 enregistrement de Filiale ? => OUI (C'est le but de cette partie de gestion, on n'encode pas là quelqu'un qui n'est pas un contact dans la filiale, on n'encode pas le clarkiste sauf si on peut effectivement être en contact avec lui, peu probable)
- Un enregistrement de Contact peut-il être en relation avec plusieurs enregistrements de Filiale ? => NON (sauf s'il existe un contact itinérant qui représente plusieurs filiales, peu probable).
Pour la gestion que tu envisages, toi seul peut apporter les réponses à ces questions. Cette méthode des questions est la plus simple que je connaisse pour structurer correctement un DB. Et ce n'est qu'après qu'on peut définir les relations et contraintes d'intégrité référentielles. Il n'y a pas de solution universelle. Chacune dépend strictement de la gestion effectivement en place.
La définition des relations est secondaire à l'analyse. Cela peut se faire et comme je l'écrivais ce matin, c'est un garde-fou contre les mauvaises manipulations. Il est prudent de le faire mais pas obligatoire. Dans l'exemple que j'ai envoyé ce matin, je n'ai pas défini la relation ni les propriétés de jointure. Cela n'empêche nullement l'encodage et la gestion de l'information. Simplement, ma DB de ce matin réponds à un jeu de questions. Si tu changes les réponses, cela fera une autre DB.
Enfin, l'interface est absolument secondaire. Ce n'est pas l'interface qui détermine l'organisation des tables mais bien le contraire : les réponses faites aux questions induisent certains types de présentation des données et en interdisent d'autres. Dans l'exemple des contacts des filiales, le détail des contact est présenté dans une ListView ou un DataGridView. Cela aurait pu être aussi une cascade de ComboBox ou une batterie de ListBox. Mais ce serait bien moins confortable avec seulement des TextBox ou avec un TreeView, par exemple.
...![]()
Bonjour Phil Rob
Désolé pour le modèle, mais le principe de mon projet sera plus ou moins identique
Un enregistrement de T_General est-il en relation avec au moins 1 enregistrement de T_Fichier ? => OUI
Un enregistrement de T_General peut-il être en relation avec plusieurs enregistrements de T_Fichier ? => OUI
Un enregistrement de T_Fichier est-il en relation avec au moins 1 enregistrement de T_General ? => OUI
Un enregistrement de T_Fichier peut-il être en relation avec plusieurs enregistrements de T_General ? => NON
Bonne journée
Bonjour,
Normal, la sélection de ligne est perdue pendant le tri et la procédure ChargeDetails ne peut trouver de CurrentRow.
Pour te dépanner, tu peux ajouter la procédure DGVTout_Sorted et modifier le code de ChargeDetails :
Si j'ai un peu de temps, je verrai s'il n'y a pas une méthode plus "convenable". Mais sûrement qu'il serait préférable d'interdire le tri "automatique" sur le clic d'un Header et programmer toi-même ce tri en refaisant la requête principale (sur Astuce) avec une clause ORDER BY sur le champ concerné par le Header cliqué.
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 Private Sub ChargeDetails() '... ... ... Dim IdAstuceEnCours As Integer Try IdAstuceEnCours = DGVTout.Item("IdAstuce", DGVTout.CurrentRow.Index).Value Catch Exit Sub End Try SQL = "SELECT Fichier FROM T_FICHIER WHERE XIdAstuceFichier = " & IdAstuceEnCours ' ... ... ... Private Sub DGVTout_Sorted(sender As Object, e As EventArgs) Handles DGVTout.Sorted DGVTout_SelectionChanged(Me, Nothing) End Sub
...![]()
Bonjour,
Là, je vois bien ton problème mais je ne vois pas comment le résoudre ...
Je te propose d'essayer ceci :
L’illustration que tu envoies semble montrer 2 Form différents. Mais dans le code que tu as envoyé, je ne vois que le Frm_Edition.
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 ' ... ... ... With oleGr While oleGr.Read() TboxGAMME.Items.Add(oleGr.GetString(1)) End While End With ' Ici remettre la valeur de zone de texte : TboxGAMME.Text = ................. ' ... ... ...
Si ce Form est appelé d'un autre, ne peux-tu affecter la zone de texte à partir du Form appelant en désignant le Form appelé par son nom : Frm_Edition.TboxGAMME.Text = ..................
Enfin, dans le code que je t'ai envoyé, j'ai placé la Combo CBTest en DropDownList et ne vois aucune différence quant aux données qu'elle présente.
![]()
Bonjour Phil Rob
Maintenant j'arrive à avoir la valeur de base dans ma combobox en dropdownlist avec :
Mais n'est pas affichée par défaut dans la combobox
Code : Sélectionner tout - Visualiser dans une fenêtre à part TboxGAMME.Items.Add(Frm_Recherche.TboxGAMME.Text) ' est afficher dans combobox mais pas par défaut
Je continue mes investigation
Bonne journée
Suite ... après vérif.
J'ai effectivement la référence Microsoft.Office.Interop.Access ajoutée à la solution. Cela se voit déjà sur l'illustration de l'autre jour où je te montrais la référence pour XLS. Vois celle pour Access juste au-dessus. Pas de compialtion sans cette référence ajoutée.
A part cela, j'ai écrit mes codes de ce matin dans la procédure FTestDB_Load() du projet de test que je t'ai envoyé avec les codes d’exportation vers XLS et je n'ai rien changer d'autre dans les codes de ce projet :
Par ailleurs, c'est vrai que l'exécution de la macro produit une erreur s'il subsiste un processus Access sur cette DB (par exemple parce qu'elle ouverte par Access, ou bien parce que j'ai stoppé le programme en cours de travail sur la DB, sans clôturer correctement la connexion). Je suppose qu'une meilleure maîtrise des macros Access devrait permettre d'exécuter cette macro même quand la DB est ouverte par ailleurs (on peut le faire DANS Access).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Private Sub FTestDB_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim ACCApp As New Access.Application ACCApp.OpenCurrentDatabase("D:\Tmp\TestAccesDBSimpleConMostrar\MonStock2013.accdb", True) ACCApp.DoCmd.RunMacro("MaMacro", 2) ACCApp.CloseCurrentDatabase() ACCApp = Nothing End Sub
C'est pourquoi, quand je soupçonne ce genre de problème, je supprime tous les processus encore actifs, en Word, ou en XLS, ou en Access. Illustration après interruption du programme après l'ouverture de la DB et avant sa fermeture :
Bonne soirée ...![]()
Bonjour Phil Rob
Encore en tout grand merci pour tout le temps que tu as passé pour m'aider.
Mais je vais abandonner l'idée d'exporter ma DB vers Excel, en fait la solution était devant mes yeux.
Je t'explique un peu mon projet :
d'un coté j'ai un fichier excel "Listing fiche technique" dans le quel je gère un listing de suivi de fiche technique ce fichier est en liaison avec un autre fichier excel qui me sert de tampon pour alimenté mon fichier avec différent modèle de matériel.
De l'autre coté, j'ai mon projet VB qui le sert de bibliothèque pour gérer les différent matériels et je voulais exporter la DB vers le fichier tampon qui réalimente mon fichier "listing fiche technique".
Donc la solution est toute simple dans mon fichier excel "Listing fiche technique" je n'ai qu'a créer une liaison vers mon fichier access et le tour est joué.
Encore merci
Bonne journée
Bonjour,
Pour faire très simple, et pas trop réfléchir si tôt le matin, je te propose d'essayer ceci.
Juste avant d'ajouter des données :Et quand l'ajout est terminé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part TboxGAMME.DropDownStyle = ComboBoxStyle.DropDownSi cela ne fonctionne pas, je ferai des tests, j'aurai sans doute un peu de temps dans l'après-midi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part TboxGAMME.DropDownStyle = ComboBoxStyle.DropDownList
Bonne journée ...![]()
Bonjour Phil Rob
Je reviens vers toi, car j'ai encore une question concernant ma comboxbox.
Tout fonctionne nickel garce à toi, mais j'ai ajouté un formulaire pour remplir les valeurs que la comboxbox doit aller chercher et ce formulaire je l'appelle depuis mon premier formulaire.
Mais la comboxbox ne se met pas a jour avec les nouvelles valeurs je sis obliger de fermer mon premier formulaire et le ré ouvrir.
Aurais-tu une idée comment je dois faire le refresh du combobox a partir d'un autre formulaire.
Merci
Bonne journée
Pour dire vrai, je ne vois pas la différence fonctionnelle entre DropDown et DropDownList.
Peux-tu regarder la vidéo https://www.dropbox.com/s/wfszlfsxyt...ombos.mp4?dl=0 et m'expliquer pourquoi mon test n'est pas adéquat.
Voici le code du test :
Merci d'avance
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 Public Class Form0_2ComboBox Private Sub Form0_2ComboBox_Load(sender As Object, e As EventArgs) Handles Me.Load ComboBox1.DropDownStyle = ComboBoxStyle.DropDown ComboBox2.DropDownStyle = ComboBoxStyle.DropDownList End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If TextBox1.Text = String.Empty Then Exit Sub End If ComboBox1.Items.Add(TextBox1.Text) ComboBox1.Text = ComboBox1.Items(0) End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click If TextBox2.Text = String.Empty Then Exit Sub End If ComboBox2.Items.Add(TextBox2.Text) ComboBox2.Text = ComboBox2.Items(0) End Sub End Class![]()
Bonjour Phil ROb
En fait cela fonctionne, je n'avait pas mis le bon paramètre.
Merci de ton aide
Bon week-end
Oui, je peux voir ta DB mais tu dois l'envoyer ou bien la déposer en Dropbox (au autre) et m'envoyer le lien par messagerie privée. Je dois pouvoir ouvrir la DB avec Access 2013, je n'ai pas de version plus récente.
Il faudra que tu m'expliques les contenus. Vois-tu, quand tu montres la gestion des contacts, je vois une table Adresse et une table Contact : je sais ce que signifient ces mots.
Mais quand tu parles de General et de Fichier pour ton projet, je ne sais de quoi il s'agit : je sais ce que tu entends par Fichier, mais je ne sais ce que sont ces fichiers et je ne sais pas ce qu'est un General.
La méthode des questions pour définir les relations est plus facile si on sait ce que sont réellement les entités évoquées.
...![]()
Si tu n'as pas d'erreur de compilation, ce n'est pas une question de référence (dis-moi quoi à ce sujet).
Mais j'ai aussi eu des difficultés à exécuter : tel que programmé là, il faut qu'il n'y ait aucun processus déjà actif sur cette DB. Pour vérifier ce cas, ton programme devrait fonctionner après le redémarrage de l'ordi (perso, j'utilise un killer de process égarés car ça arrive souvent lorsqu'on fait des tests).
Si tu ne vois pas de solution dans ce message, envoie un extrait de la DB avec la macro de test.
Merci pour le feedback.
Très bonne journée à toi aussi...)))
Bonjour Phil Rob
Petit retour, voila j'ai juste un petit soucis pour que cela fonctionne je dois mettre ma combobox en Dropdown mais j'aimerais la laisser en dropdownlist, il y a une solution pour pouvoir écrire dans une combobox dropdownlist ou une petite astuce
Bonne journée
Suite ...
Discussion du jeu de réponses :
Un enregistrement de T_General est-il en relation avec au moins 1 enregistrement de T_Fichier ? => OUI
On ne peut pas accepter un enregistrement dans T_General qui ne désigne pas un fichier.
Un enregistrement de T_General peut-il être en relation avec plusieurs enregistrements de T_Fichier ? => OUI
Un enregistrement donné de T_General peut référencer plusieurs fichiers (ils pourront être présentés dans une liste de fichiers UN SEUL enregistrement de T_General).
Un enregistrement de T_Fichier est-il en relation avec au moins 1 enregistrement de T_General ? => OUI
On ne peut enregistrer pas dans T_Fichier un fichier qui n'est pas aussitôt utilisé par T_General. Probablement qu'une réponse NON serait meilleure de sorte à pouvoir encoder des fichiers qui ne seront utilisés que plus tard.
Un enregistrement de T_Fichier peut-il être en relation avec plusieurs enregistrements de T_General ? => NON
Un fichier ne pourra pas être référencé plusieurs fois dans T_General.
Il est possible de répondre OUI à cette dernière question et cela donnera encore une autre DB dans laquelle un T_General pourra référencer plusieurs T_Fichier et un T_Fichier pourra être référencé dans plusieurs T_General. Cette situation existe par exemple dans la gestion des rues désservies par les facteurs : une rue est déservie par plusieurs facteur et un facteur dessert plusieurs rues.
Voici les tables créés et remplies (selon le jeu de réponses) :
Préparation d'une requête test avec l'assistant d'accès :
Je n'ai toujours pas défini les relations, contraintes d'intégrités, propriétés de jointure ...
Visualisation de la requête en SQL :
Visualisation de la requête en SQL après ajout de la clause ORDER (le résultat est plus lisible, c'est celle-ci qui sera copiée en VB) :
Le résultat de l'exécution :
Et voila ...
Pour affiner davantage l'analyse, il serait bien que tu envoies un jeu de résultats (cela peut être écrit sous XLS) avec les noms des champs représentatifs de leur rôle et quelques données fictives mais plausibles. Il faudra sans doute répondre aussi à d'autres questions.
Bonne journée ...![]()
Ok, je te fais un exemple avec ce jeu de réponses dans la matinée et je te l'envoie ...
Bonne journée !
![]()
Re,
Tu peux désactiver le tri par clic des Header en ajoutant ces lignes de code à la fin de MontreDonnees() :
Tu peux ensuite remettre ChargeDetails en ordre comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 For C As Integer = 0 To DGVTout.ColumnCount - 1 DGVTout.Columns(C).SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Programmatic Next
et supprimer la procédure DGVTout_Sorted().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Private Sub ChargeDetails() ' ... ... ... Dim IdAstuceEnCours As Integer 'Try IdAstuceEnCours = DGVTout.Item("IdAstuce", DGVTout.CurrentRow.Index).Value 'Catch ' Exit Sub 'End Try ' ... ... ...
Pour la suite, si tu veux programmer un tri basé sur une colonne en particulier, le mieux sera de le faire sur la DataTable, ou bien recommencer la requête avec la clause ORDER BY (plus lourd pour le système, et aussi pour le programmeur ... ). Le déclenchement de ce tri peut être programmé dans la procédure :
Pour ce qui est de l'erreur Microsoft.ACE.OLEDB.12.0' n'est pas inscrit sur l'ordinateur local, il te faut changer de plateforme et choisir x64 (au besoin, tu peux l'ajouter dans le "Gestionnaire de configuration ...") :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub DGVTout_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DGVTout.ColumnHeaderMouseClick ' End Sub
...![]()
Tu dois savoir à quel indice tu places l'info.
Le dernier TboxGAMME.Items.Add te place la donnée à l'indice TboxGAMME.Items.Count-1 et le premier TboxGAMME.Items.Add te place la donnée à l'indice 0. Ceux-ci sont faciles. Autrement, il te faut rechercher à quel endroit se trouve la donnée et faire :
Mais vu ce que tu viens de programmer, peut-être te suffit-il d'écrire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part TboxGAMME.Text = TboxGAMME.Items(LIndiceEnQuestion)
Mais ça a l'air trop facile ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 TboxGAMME.Items.Add(Frm_Recherche.TboxGAMME.Text) ' est afficher dans combobox mais pas par défaut TboxGAMME.Text = Frm_Recherche.TboxGAMME.Text
Partager