Tuto VB/Access
MrSlave
Messages postés
2587
Date d'inscription
Statut
Membre
Dernière intervention
-
Rikkunter Messages postés 6023 Date d'inscription Statut Membre Dernière intervention -
Rikkunter Messages postés 6023 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je dois réaliser une base de temps avec le couple VB6 / Access.
Je recherche donc des tutos car je n'ai jamais utilisé ni l'un, ni l'autre.
Merci.
Je dois réaliser une base de temps avec le couple VB6 / Access.
Je recherche donc des tutos car je n'ai jamais utilisé ni l'un, ni l'autre.
Merci.
A voir également:
- Tuto VB/Access
- Vb - Télécharger - Langages
- Tuto tableau croisé dynamique - Guide
- Tuto torrent - Guide
- Tuto chromecast - Guide
- Tuto rufus windows 11 - Guide
284 réponses
Oui mais tu ne passes pas ta 1ère requête à la base donc, tu ne récupères pas l'id ...
Testes avec cette requête :
C'est fait à la volée, sans filet ... peux pas tester ici .. :oS
;o)
Testes avec cette requête :
Dim Query As String Query = "SELECT LIB_Sujet FROM ENT_STD where id_std = " Query = Query & "(Select id_std from ent_std where lib_verbe ='" & Combo1.Text & "')" Vrai = ModuleBdD.OpenRecordset(Query, sujet) ...
C'est fait à la volée, sans filet ... peux pas tester ici .. :oS
;o)
j'avais bien compris ça :o) et je pensai qu'avec une requête imbriquée ça marcherait :-s ...
Tu peux également fait une variable qui récupère ta première requête :
enfin j'espère ..
;o)
Tu peux également fait une variable qui récupère ta première requête :
Dim myId As Integer Dim query As String Dim rs As ADODB.RecordSet query = "SELECT id_std FROM ENT_STD WHERE lib_verbe ='" & Combo1.Text & "'" set rs = New ADODB.Recordset Vrai = ModuleBdD.OpenRecordset(Query, rs) myId = rs.Fields(0) set rs = Nothing query = ""SELECT LIB_Sujet FROM ENT_STD WHERE id_std =" & myId set rs = New ADODB.Recordset Vrai = ModuleBdD.OpenRecordset(Query, rs) Vrai = ModuleBdD.RSLirePremier(sujet) While Vrai = True Combo2.AddItem sujet.Fields(0) Vrai = ModuleBdD.RSLireSuivant(sujet) Wend ...
enfin j'espère ..
;o)
ça veut dire que ta requête ne retourne rien alors ... où qu'il y a eu un problème dans le passage vers la base.
Mets un point d'arrêt sur vrai = ModBdd.OpenRequête(query, rs) et passe le code pas à pas (F8) pour voir s'il y a une erreur dans la fonction OpenRequete() .. Regardes au niveau de If Err.Number <> 0 then ...
Mets un point d'arrêt sur vrai = ModBdd.OpenRequête(query, rs) et passe le code pas à pas (F8) pour voir s'il y a une erreur dans la fonction OpenRequete() .. Regardes au niveau de If Err.Number <> 0 then ...
J'ai trouvé l'erreur (enfin je crois).
Au niveau du 2eme vrai, il passe dans
Et quand je passe la souris sur la ligne
Il me met vrai = "faux".
Ps : pratique les points d'arrêt et F8, je ne connaissais pas. ^^
Set rs = New ADODB.Recordset vrai = ModuleBdD.OpenRecordset(Query, rs) vrai = ModuleBdD.RSLirePremier(sujet) While vrai = True
Au niveau du 2eme vrai, il passe dans
If err <> 0 Then RSLirePremier = False Exit Function End If
Et quand je passe la souris sur la ligne
vrai = ModuleBdD.RSLirePremier(sujet)
Il me met vrai = "faux".
Ps : pratique les points d'arrêt et F8, je ne connaissais pas. ^^
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Peux tu mettres ça dans RSLireSuivant(byRef rs as adodb.Recordset) as boolean, stp ?
If err <> 0 Then RSLirePremier = False MsgBox Err.Numbre & ": " & Err.Description Exit Function End If
Sinon autre solution ... fais passer ton zinzin zipper avec la base par cjoint et je regarde ce soir.
c'est les doublons qui te gène ? parce que chez moi j'ai les 3 combos qui sont remplis ...
Bon je ne peux pas ouvrir Access ici ... je regarde ça ce soir, il faut que j'y aille là ... j'ai une réu
:S
Kisssouu Rikki
Bye MrSlave à demain
Bonne soirée à vous deux.
;o)
:S
Kisssouu Rikki
Bye MrSlave à demain
Bonne soirée à vous deux.
;o)
Hello,
Mes hommages du matin ... Comment vous allez bien ... ?
Je te passe le fichier que j'ai "un peu" modifié : https://www.cjoint.com/?gkiKTAf4ux
Remets le chemin de ta base dans ModuleBdD. J'ai juste le temps d'aller boire un café et je file en réunion ... je reviens vers 10 h.
N'hésites pas à laisser tes questions ici ...
M'a fallu 2 aspirines pour tout comprendre ...
nan, je rigole ... ca ferait tellement plaisir à Rikkitounette ...
;o)
Mes hommages du matin ... Comment vous allez bien ... ?
Je te passe le fichier que j'ai "un peu" modifié : https://www.cjoint.com/?gkiKTAf4ux
Remets le chemin de ta base dans ModuleBdD. J'ai juste le temps d'aller boire un café et je file en réunion ... je reviens vers 10 h.
N'hésites pas à laisser tes questions ici ...
M'a fallu 2 aspirines pour tout comprendre ...
nan, je rigole ... ca ferait tellement plaisir à Rikkitounette ...
;o)
Bon la réunion est annulée ... veulent pas faire leur boulot, moi je m'en fous, je suis pas pressé et je suis quand même payé et plus ça dur, plus je gagne d'argent ... :DDDD (petite parenthèse)
et il me rend un truc qu'il va falloir que j'assimile. mais qui fonctionne... lol
Pour ce qui est des modules, ce n'est en fait que l'équivalent d'une classe (pour faire simple) et ça permet de ne pas mélanger les torchons avec les petites cuillères.
Je vais pas te faire un cours sur l'architecture d'une application, mais en règle générale, on a trois couches. La couche supérieure qui reçois les données (l'interface utilisateur par exemple) où l'on saisie et remonte les données. La couche intermédiaire qui manipule les données (là on conditionne les données) soit en saisie, soit en affichage et la couche inférieure qui fait la liaison avec la source de données (fichiers ou base de données ...). Tu peux également avoir des sous couches. Une couche peut être composée d'un ou plusieurs modules. Il y a toujours un ou plusieurs modules qui font la liaison entre les divers couche.
Ce type d'architecture permet d'avoir des modules indépendants. Dans ton zinzin, j'ai fait un module qui gère ton formulaire Form2 que j'ai nommé ModfrmForm2. Et j'ai fait un module intermédiaire qui gère les données ModESEnt_STD. Ce module gère les données de la table ENT_STD. Il n'est pas complet, je n'ai pris que les données dont j'avais besoin. Mais tu dois le compléter pour prendre en compte tous les champs de la table. Tous les appels à la base font par le module ModuleBdD et ce module peut être utiliser par tous les autres modules. De même le module ModESEnt_STD peut être utilisé par tous les autres modules qui ont besoin des données de cette table.
Je te laisse digérer ça doucement ... je retourne boire un café et je vais remonter quelques bretelles et je re ...
;o)
PS: Rikki, prend des notes ... je vais pas répéter :DDDD
et il me rend un truc qu'il va falloir que j'assimile. mais qui fonctionne... lol
Pour ce qui est des modules, ce n'est en fait que l'équivalent d'une classe (pour faire simple) et ça permet de ne pas mélanger les torchons avec les petites cuillères.
Je vais pas te faire un cours sur l'architecture d'une application, mais en règle générale, on a trois couches. La couche supérieure qui reçois les données (l'interface utilisateur par exemple) où l'on saisie et remonte les données. La couche intermédiaire qui manipule les données (là on conditionne les données) soit en saisie, soit en affichage et la couche inférieure qui fait la liaison avec la source de données (fichiers ou base de données ...). Tu peux également avoir des sous couches. Une couche peut être composée d'un ou plusieurs modules. Il y a toujours un ou plusieurs modules qui font la liaison entre les divers couche.
Ce type d'architecture permet d'avoir des modules indépendants. Dans ton zinzin, j'ai fait un module qui gère ton formulaire Form2 que j'ai nommé ModfrmForm2. Et j'ai fait un module intermédiaire qui gère les données ModESEnt_STD. Ce module gère les données de la table ENT_STD. Il n'est pas complet, je n'ai pris que les données dont j'avais besoin. Mais tu dois le compléter pour prendre en compte tous les champs de la table. Tous les appels à la base font par le module ModuleBdD et ce module peut être utiliser par tous les autres modules. De même le module ModESEnt_STD peut être utilisé par tous les autres modules qui ont besoin des données de cette table.
Je te laisse digérer ça doucement ... je retourne boire un café et je vais remonter quelques bretelles et je re ...
;o)
PS: Rikki, prend des notes ... je vais pas répéter :DDDD
Heureusement que j'ai du café. :)
Mais bon, je crois avoir compris l'essentiel.
Par contre, il y a un truc pour lequel je ne suis pas sur.
ReDim Preserve myId(nb)
D'après ce que j'ai vu, ça servait à redimmensionner un tableau, alors qu'ici tu l'utilise avec un long.
Bon et je comprend pas pourquoi il ne me charge plus rien dans mon Datagrid.
Mais bon, je crois avoir compris l'essentiel.
Par contre, il y a un truc pour lequel je ne suis pas sur.
ReDim Preserve myId(nb)
D'après ce que j'ai vu, ça servait à redimmensionner un tableau, alors qu'ici tu l'utilise avec un long.
Bon et je comprend pas pourquoi il ne me charge plus rien dans mon Datagrid.
J'ai mis un type "Long" tout simplement pour anticiper sur le nombre d'enregistrement. Tu n'as qu'une dizaine de ligne aujourd'hui, rien ne dit que tu n'auras pas plus de lignes que peut supporter un Integer...
Je n'ai pas touché au datagrid ... qui ne m'affichait rien d'ailleur. Je voulais revoir aussi ta form1 mais équipe de france oblige ...
;o)
Je n'ai pas touché au datagrid ... qui ne m'affichait rien d'ailleur. Je voulais revoir aussi ta form1 mais équipe de france oblige ...
;o)
Premièrement vous avez fait quoi les Suisses ?
Deuxièmement, durant les qualifs, les Roumains ont fini devant les Pays Bas et leur ont même infligé une défaite.
Troisièmement, j'ai résolu mon erreur. C'était le champ DataSource qui n'était pas renseigné dans le Datagrid.
Et pour finir, je me demandais comment recharger une form.
Parce que si je met un bouton annuler, je pensais que form.hide et form.show suffiraient mais apparement non, car il garde en mémoire ce que j'avais déjà fait.
J'en conclu que hide et show ne servent qu'à cacher et montrer (d'où leurs noms ^^).
J'ai voulu me servir de unload et load mais ça ne fonctionne pas.
Donc je me demandais si vous aviez une solution. :)
Deuxièmement, durant les qualifs, les Roumains ont fini devant les Pays Bas et leur ont même infligé une défaite.
Troisièmement, j'ai résolu mon erreur. C'était le champ DataSource qui n'était pas renseigné dans le Datagrid.
Et pour finir, je me demandais comment recharger une form.
Parce que si je met un bouton annuler, je pensais que form.hide et form.show suffiraient mais apparement non, car il garde en mémoire ce que j'avais déjà fait.
J'en conclu que hide et show ne servent qu'à cacher et montrer (d'où leurs noms ^^).
J'ai voulu me servir de unload et load mais ça ne fonctionne pas.
Donc je me demandais si vous aviez une solution. :)
Pas compris
Tu veux faire quoi, rafraichir ton form ? Fait longtemps que j'ai pas touché à du VB pur, oublie pas...
Si tu veux rafraichir, je vois pas l'utilité du bouton annuler ... ?!
Enfin, y a pas une fonction Requery ou je ne sais plus quoi ? Ma mémoire me fait défaut... Je crois qu'il faut utiliser un Requery...
Tu veux faire quoi, rafraichir ton form ? Fait longtemps que j'ai pas touché à du VB pur, oublie pas...
Si tu veux rafraichir, je vois pas l'utilité du bouton annuler ... ?!
Enfin, y a pas une fonction Requery ou je ne sais plus quoi ? Ma mémoire me fait défaut... Je crois qu'il faut utiliser un Requery...
il faut utiliser Unload ... qui permet de libérer la mémoire utiliser par la form ... effectivement hide ne fait que masquer. Ensuite il faut relancer avec show qui lance et passe par le Form_load() du formulaire.
;o)
;o)
D'ou l'interet d'avoir un module à part avec des fonctions pour chaque chose :o).
Regarde le code de ModfrmForm2. Tu as une procédure initCombo1 ... (j'ai d'ailleur oublié de faire un combo1.Clear) ...
Pour remettre la form dans son état initiale, il suffit de faire une procédure du genre :
Regarde le code de ModfrmForm2. Tu as une procédure initCombo1 ... (j'ai d'ailleur oublié de faire un combo1.Clear) ...
Pour remettre la form dans son état initiale, il suffit de faire une procédure du genre :
Public Sub MaZ_Form With Form2 .Combo1.Enabled = True .Combo2.Enabled = True .Combo3.Enabled = True .Combo1.Clear .Combo2.Clear .Combo3.Clear .Text1.Enabled = True .Text2.Enabled = True .Text1.Text = "" .Text2.Text = "" End With InitFrm End Sub
Dans ce cas tu as 2 possiblités :
La propriété Fields du recordset renvoie le contenu d'un champ. Tu peux soit donner le nom du champs (ce qui est recommander si ta table est susceptible dévoluer) ou bien en indiquant de numéro du champ, sachant que le premier champ est zéro:
Table maTable (Id_matable, monChamp1, monChamp2)
myRecordset.Fields("monChamp1") ou myRecordset.Fields(1) pour le deuxième champ de la table. Ici myRecordset renvoie la même valeur.
;o)
La propriété Fields du recordset renvoie le contenu d'un champ. Tu peux soit donner le nom du champs (ce qui est recommander si ta table est susceptible dévoluer) ou bien en indiquant de numéro du champ, sachant que le premier champ est zéro:
Table maTable (Id_matable, monChamp1, monChamp2)
myRecordset.Fields("monChamp1") ou myRecordset.Fields(1) pour le deuxième champ de la table. Ici myRecordset renvoie la même valeur.
;o)
Je viens de passer 5min a essayer d'ajouter des valeurs fixes pour un combobox.
Je crois avoir testé toutes les manières possibles. xD
Mais bon, ça fonctionne c'est le principal. :)
Je crois avoir testé toutes les manières possibles. xD
Mais bon, ça fonctionne c'est le principal. :)
Atta, j'ai encore une question. :P
Est ce qu'il est possible de trier les valeurs du Datagrid ?
J'ai voulu les trier lors de l'appel avec un ORDER by mais ça me les met à la suite, sans tri.
Est ce qu'il est possible de trier les valeurs du Datagrid ?
J'ai voulu les trier lors de l'appel avec un ORDER by mais ça me les met à la suite, sans tri.
Raaaaaa. S'quoi ça ?
Sachant que j'ai 2 champs texte (txtLibelle et txtPosAff et 3 combo.
Je veux que soit txtLibelle ou les 3 combo concaténée et txtPosAff soit non vides pour passer à l'étape suivante.
Mais ça ne fonctionne pas du tout.
Si je ne met rien du tout, il me met :
Veuillez remplir le champ : position de la séquence. Oô
conca = Combo1.Text & " - " & Combo2.Text & " - " & Combo3.Text If (Me.txtLibelle.Text <> "" Or conca <> "" And Me.txtPosAff.Text = "") Then sup = MsgBox("Veuillez remplir le champ : position de la séquence", vbCritical + vbOKOnly + 0, "Position Séquence") Exit Sub ElseIf (Me.txtLibelle.Text = "" Or conca = "" And Me.txtPosAff.Text = "") Then sup = MsgBox("Vous devez renseigner les champs", vbCritical + vbOKOnly + 0, "Position Séquence") Exit Sub ElseIf (Me.txtPosAff.Text <> "" And Me.txtLibelle.Text = "" Or conca = "") Then sup = MsgBox("Tous les champs ne sont pas renseignés", vbCritical + vbOKOnly + 0, "Position Séquence") Exit Sub End If
Sachant que j'ai 2 champs texte (txtLibelle et txtPosAff et 3 combo.
Je veux que soit txtLibelle ou les 3 combo concaténée et txtPosAff soit non vides pour passer à l'étape suivante.
Mais ça ne fonctionne pas du tout.
Si je ne met rien du tout, il me met :
Veuillez remplir le champ : position de la séquence. Oô
En fait j'ai changé.
J'ai mis le bouton qui va valider en Enabled = false.
Et je le met à true si on écrit quelque chose dans le champ txtlibelle ou si la valeur du 3eme combo a été changée.
Après il ne me reste qu'à mettre une condition pour voir si le champ txtPosAff est rempli.
C'est plus simple.
J'ai mis le bouton qui va valider en Enabled = false.
Et je le met à true si on écrit quelque chose dans le champ txtlibelle ou si la valeur du 3eme combo a été changée.
Après il ne me reste qu'à mettre une condition pour voir si le champ txtPosAff est rempli.
C'est plus simple.
Euh .... siouplait. ^^
Je dois récupérer un ID grâce au verbe + sujet + complément.
Imaginons ma table :
Id - verbe - sujet - complement
1 - couper - fil - avec pince
2 - couper - sac - sans pince
Ma première combo va m'afficher couper.
Me deuxième fil et sac (disons que je choisisse sac)
Et ma troisième sans pince.
Il faut que je récupère l'ID dont le verbe est couper, le sujet sac et le complement sans pince.
Ma requête sera "Select id_std where verbe = " & combo1.text & " sujet ....
Mais comment je l'utilise ? :\
J'ai bien vu le post 176 de Polux mais c'est assez embrouillé.
J'suis désolé de vous prendre tant de temps, mais sans moi vous ne sauriez pas quoi faire. :)
Je dois récupérer un ID grâce au verbe + sujet + complément.
Imaginons ma table :
Id - verbe - sujet - complement
1 - couper - fil - avec pince
2 - couper - sac - sans pince
Ma première combo va m'afficher couper.
Me deuxième fil et sac (disons que je choisisse sac)
Et ma troisième sans pince.
Il faut que je récupère l'ID dont le verbe est couper, le sujet sac et le complement sans pince.
Ma requête sera "Select id_std where verbe = " & combo1.text & " sujet ....
Mais comment je l'utilise ? :\
J'ai bien vu le post 176 de Polux mais c'est assez embrouillé.
J'suis désolé de vous prendre tant de temps, mais sans moi vous ne sauriez pas quoi faire. :)
Donc ici tu auras :
myId = myRecordset.Fields("Id_Std")
Fait attention dans tes requêtes SQL ... les chaînes de caractères doivent être entre simple côte ... :
;o)
myId = myRecordset.Fields("Id_Std")
Fait attention dans tes requêtes SQL ... les chaînes de caractères doivent être entre simple côte ... :
query = "Select id_std From Ent_STD where Lib_verbe = '" & combo1.text & "' _ And Lib_sujet = ' " & combo2.text & " ' And Lib_Complement = ' " & combo3.Text & " ' "
;o)
par le module ModESEnt_STD
Admettons que tu veuilles mettre l'Id_Std dans un textbox (txtID_STD)
Tu places ce code dans le module sus cité :
Dans le module qui a besoin de l'Id_Std tu colles ce code dans l'évènement qui va bien:
Et là tu as un truc propre, digne d'un pro :DD
;o)
Admettons que tu veuilles mettre l'Id_Std dans un textbox (txtID_STD)
Tu places ce code dans le module sus cité :
Public Function SearchIdByMultiCritere(byval verbe As String, Byval sujet As String, Byval complement As String) As Boolean Dim query As String Dim rs As ADODB.Recordset Dim Vrai As Boolean query = "Select id_std From Ent_STD where Lib_verbe = '" & verbe & "' _ And Lib_sujet = ' " & sujet & " ' And Lib_Complement = ' " & complement & " ' " Set rs = New ADODB.Recordset vrai = ModuleBdD.openRequete(query, rs) If vrai = False Then SearchIdByMultiCritere = False Exit Function Else Call fillStruct(rs) SearchIdByMultiCritere = True End If End Function
Dans le module qui a besoin de l'Id_Std tu colles ce code dans l'évènement qui va bien:
Dim vrai As Boolean vrai = ModESEnt_STD.SearchIdByMultiCritere( combo1.text, combo2.text, combo3.text) If vrai = False Then MsgBox "Erreur blablabla",vbexclamation,"Erreur" Exit Sub 'ou Exit Function selon Else txtID_STD.Text = ModESEnt_STD.getIdStd End If
Et là tu as un truc propre, digne d'un pro :DD
;o)
c'est vrai que j'ai zappé les commentaires dans ce que je t'ai donné ... mais foot oblige. En gros je t'explique :
Comme je t'ai expliqué ce matin, j'ai décomposé en 3 couches une partie de ton appli. Le module ModESEnt_STD fait la communication entre la base de données (via le module ModuleBdD) pour récupérer ou pour enregistrer les données. J'ai fait une strucutre (TabEnt_STD) qui est en fait l'équivalent de ta table. Cette structure accueille les données de la table via le recordset. On place dedans toutes les méthodes dont on a besoin pour notre application pour communiquer avec la base de données. On pourrait y mettre une méthode pour enregistrer des données, les modifier ou les supprimer.
Le module ModfrmForm2, manipule les données pour les mettre dans les champs de l'interface (form2) et communique avec ModESEnt_STD. Si on avait des calculs à faire sur les données, c'est dans ce module qu'il faut les gérer.
De cette façon, c'est plus simple de travailler, chaque module est affecté à un travail bien précis avec des outils qui lui sont propres. S'il en manque un, on l'ajoute dans le module qui va bien.
épicétou ... :o)
Comme je t'ai expliqué ce matin, j'ai décomposé en 3 couches une partie de ton appli. Le module ModESEnt_STD fait la communication entre la base de données (via le module ModuleBdD) pour récupérer ou pour enregistrer les données. J'ai fait une strucutre (TabEnt_STD) qui est en fait l'équivalent de ta table. Cette structure accueille les données de la table via le recordset. On place dedans toutes les méthodes dont on a besoin pour notre application pour communiquer avec la base de données. On pourrait y mettre une méthode pour enregistrer des données, les modifier ou les supprimer.
Le module ModfrmForm2, manipule les données pour les mettre dans les champs de l'interface (form2) et communique avec ModESEnt_STD. Si on avait des calculs à faire sur les données, c'est dans ce module qu'il faut les gérer.
De cette façon, c'est plus simple de travailler, chaque module est affecté à un travail bien précis avec des outils qui lui sont propres. S'il en manque un, on l'ajoute dans le module qui va bien.
épicétou ... :o)
Je suis stupide, c'est tout. ^^
Récupérer l'id va poser problème je pense.
Ex :
Id - verbe - sujet ...
1 - couper - fil
2 - couper - sac
Là il ne va récupérer que fil, non ?
Si tu veux que le verbe ou le sujet ou le complement soit unique, il faut une table avec un identifiant par table et une table qui va lier les 3 autres ...
Table Verbe (Id_Verbe, verbe)
Table Sujet (Id_Sujet, sujet)
Table Complement (Id_Complement, complement)
Table Phrase(Id_Phrase,Id_Sujet, Id_Verbe, Id_Complement)
Il y a donc toute les chances qu'un sujet soit lié à un seul verbe et à un seul complément, idem pour un verbe et pour un complément, en ayant toutes les combinaisons possibles dans la table Phrase ... pas ça peut être ?
Je veux juste pouvoir les récupérer. ^^