Bonjour,
Je suis en train de réaliser une application qui peut gérer des mouvements de matière au sein d’une entreprise.
Voici mon modèle : ( du moins les tables importantes pour le problème )
TB_ALLIAGES
Pk_alliage Clé primaire Numéro Auto
Nom_alliage Texte
Titre_Au Numérique
Titre_Ag Numérique
Titre_Pd Numérique
Titre_Pt Numérique
TB_OFS
Pk_of Clé primaire Numéro Auto
Numero_of Texte
Fk_alliage_of Clé étrangère TB_ALLIAGES Numérique
Masse_of Numérique
TB_DETAILS
Pk_mouvement_détails Clé primaire Numéro Auto
Fk_mouvement Clé étrangère TB_MOUVEMENTS Numérique
Fk_of Clé étrangère TB_OFS Numérique
Fk_lingot Clé étrangère TB_LINGOTS Numérique
Fk_description Clé étrangère TB_DESCRIPTIONS Numérique
Fk_type Clé étrangère TB_TYPES Numérique
TB_MOUVEMENTS
Pk_mouvement Clé primaire Numéro Auto
Date_mouvement Date
Numero_mouvement Texte
Fk_departement_provenance Clé étrangère TB_DEPARTEMENTS Numérique
Voici sur quoi mon formulaire est basé :
SELECT TB_MOUVEMENTS.pk_mouvement, TB_MOUVEMENTS.date_mouvement, TB_MOUVEMENTS.numero_mouvement, TB_MOUVEMENTS.fk_departement_provenance, TB_DETAILS.fk_of, TB_DETAILS.fk_lingot, TB_DETAILS.fk_description, TB_DETAILS.fk_type, TB_DETAILS.fk_mouvement, TB_DETAILS.fk_type FROM TB_OFS INNER JOIN (TB_MOUVEMENTS INNER JOIN TB_DETAILS ON TB_MOUVEMENTS.pk_mouvement = TB_DETAILS.fk_mouvement) ON TB_OFS.pk_of = TB_DETAILS.fk_of;
Précisions pour le formulaire :
J’ai ajouté comme champ un champ indépendant qui se nomme : champ_of_independant. Ce champ m’es utile car c’est là que je rentre mon numéro d’OF. Et c’est à partir de là que je fais mes tests principaux.
J’ai ajouté une case à cocher et je la coche (grâce à du code) seulement si c’est un nouvel OF qui est rentré dans le champ : champ_of_independant.
Voici sur quoi mon sous-formulaire est basé :
SELECT TB_ALLIAGES.pk_alliage, TB_ALLIAGES.nom_alliage, TB_ALLIAGES.titre_Au, TB_ALLIAGES.titre_Ag, TB_ALLIAGES.titre_Pd, TB_ALLIAGES.titre_Pt, TB_OFS.fk_alliage_of FROM TB_ALLIAGES INNER JOIN TB_OFS ON TB_ALLIAGES.pk_alliage=TB_OFS.fk_alliage_of;
Précisions pour le sous-formulaire :
J’ai ajouter une zone de liste déroulante qui se nomme zdld_alliage et qui à pour fonction d’être afficher pour sélectionner un Alliage si la petite case est cochée (case dans le formulaire principal).
Fonction qui va rechercher si l’of existe si c’est le cas il va rien faire de spéciale mis à part afficher les données et si ce n’est pas le cas il va l’ajouter dans la table TB_OFS
Fonction :
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 Function fn_recherche_of(var_ContenuChampOf As Variant,
.......
rst_Of.FindFirst str_ReqOf
'On test si l'OF existe dans la table
'L'OF EXISTE
If (rst_Of.NoMatch = False) Then
'On stoque la valeur de la pk de l'of dans une variable
int_PkOf = rst_Of("pk_of")
'On se place sur le dernier enregistrement
'rst_of.FindLast
Forms(str_NomFormulaire)![casac_NouveauOf] = False
Forms(str_NomFormulaire).Form(str_NomSousFormulaireAlliage)![titre_Au].SetFocus
Forms(str_NomFormulaire).Form(str_NomSousFormulaireAlliage)![nom_alliage].Visible = True
Forms(str_NomFormulaire).Form(str_NomSousFormulaireAlliage)![zdld_alliage].Visible = False
Forms(str_NomFormulaire).Form(str_NomSousFormulaireAlliage)![titre_Au].SetFocus
End If |
ICI ON CREER L’ENREGISTREMENT MAIS IL FAUDRA LE MODIFIER PAR LA SUITE … VOIR PLUS BAS
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
|
'L'OF N'EXISTE PAS
If (rst_Of.NoMatch = True) Then
'Ajout d'un nouvel enregistrement
rst_Of.AddNew
'On ajoute la valeur rentree dans le numéro d'of
rst_Of("numero_of") = var_ContenuChampOf
'On ajoute la valeur rentree dans l'alliage
'rst_of("fk_alliage_of") = var_ContenuAlliage
int_PkOf = rst_Of("pk_of")
'Mise à jour de l'enregistrement
rst_Of.Update
Forms(str_NomFormulaire).Form(str_NomSousFormulaireAlliage)![titre_Au].SetFocus
Forms(str_NomFormulaire)![casac_NouveauOf] = True
Forms(str_NomFormulaire).Form(str_NomSousFormulaireAlliage)![nom_alliage].Visible = False
Forms(str_NomFormulaire).Form(str_NomSousFormulaireAlliage)![zdld_alliage].Visible = True
Forms(str_NomFormulaire).Form(str_NomSousFormulaireAlliage)![titre_Au].SetFocus
End If
fn_recherche_of = int_PkOf
End Function |
C’est ici que j’appel ma fonction c'est-à-dire dès que je quitte mon champ dans lequel je rentre les coordonnées de mon OF.
Appel de la fonction :
1 2 3 4 5 6 7 8 9 10
| Private Sub champ_of_independant_LostFocus()
.......
int_RetourFonction = fn_recherche_of(var_ContenuChampOf, var_ContenuAlliage, str_NomFormulaire, str_NomSousFormulaireAlliage)
Me.fk_of = int_RetourFonction
Me.fk_of.Requery
End Sub |
Une fois que tout est exécuté il faut que j’attribue un alliage à mon OF (voir dans la table TB_OFS le champ fk_alliage_of qui n’est pas encore remplir) , pour faire cela j’ai créer une fonction qui me permet de copier la pk de mon alliage dans mon champ fk_alliage_of.
Fonction qui permet de copier la pk_alliage dans la table TB_OFS
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
|
Public Function fn_CopieFkAlliageOf(str_NomFormulaire As String, str_NomSousFormulaire As String)
'Déclaration des variables
Dim int_PkAlliage As Integer
Dim int_PkOf As Integer
Dim rst_Of As DAO.Recordset
Dim base_donnee As DAO.Database
Dim str_ReqOf As String
Dim str_NumeroOf As String
'Attribution de valeurs aux variable
int_PkAlliage = Forms(str_NomFormulaire).Form(str_NomSousFormulaire)![pk_alliage].Value
int_PkOf = Forms(str_NomFormulaire)![fk_of].Value
str_NumeroOf = Forms(str_NomFormulaire)![champ_of_independant].Value
'Ouverture des recordsets
Set base_donnee = Application.CurrentDb
Set rst_Of = base_donnee.OpenRecordset("TB_OFS")
Set rst_Of = base_donnee.OpenRecordset("SELECT * FROM TB_OFS WHERE pk_of LIKE '" & int_PkOf & "'")
'On se place sur le premier enregistrement
rst_Of.MoveFirst
'Début de la boucle While // On parcours la boucle si la pk de l'OF est dans la table |
LA MODIFICATION DE L’ENREGISTREMENT CE FAIT ICI …
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
While rst_Of.EOF = False
'Modification du recordset
rst_Of.Edit
'Champ à modifier
rst_Of("numero_of") = str_NumeroOf
rst_Of("fk_alliage_of") = int_PkAlliage
'Mise à jour de l'enregistrement
rst_Of.Update
'On se positionne sur l'enregistrement suivant
rst_Of.MoveNext
Wend
End Function |
Appel de la fonction
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
| Private Sub zdld_alliage_Change()
......
'Il faut tester si le champ casac_NouveauOf est à oui ou non ( si oui alors nouveau Of )
If (Forms(str_NomFormulaire)![casac_NouveauOf] = True) Then
'Ouverture des recordsets
Set base_donnee = Application.CurrentDb
Set rst_alliage = base_donnee.OpenRecordset("TB_ALLIAGES")
'Requête pour parcourir la table TB_ALLIAGES
str_ReqAlliage = ("SELECT * FROM TB_ALLIAGES WHERE pk_alliage LIKE '" & int_PkAlliage & "'")
Set rst_alliage = base_donnee.OpenRecordset(str_ReqAlliage, dbOpenDynaset)
rst_alliage.MoveFirst
'Début de la boucle While // Si l'alliage existe on la parcours
While rst_alliage.EOF = False
'On attribue la valeur des titres à des variables pour les faire apparaître dans les champs du formulaire
var_TitreAu = rst_alliage("titre_Au")
var_TitreAg = rst_alliage("titre_Ag")
var_TitrePd = rst_alliage("titre_Pd")
var_TitrePt = rst_alliage("titre_Pt")
'On se positionne sur le dernier enregistrement de la table
rst_alliage.MoveNext
Wend
'On affiche les valeurs dans les champs du formulaire'On ajoute le nom de l'alliage dans le champ prévu à cet effet
Me.fk_alliage_of = str_ContenuZdldAlliage
Me.titre_Au.Value = var_TitreAu
Me.titre_Ag.Value = var_TitreAg
Me.titre_Pd.Value = var_TitrePd
Me.titre_Pt.Value = var_TitrePt
Me.fk_alliage_of.Requery
Me.titre_Au.Requery
Me.titre_Ag.Requery
Me.titre_Pd.Requery
Me.titre_Pt.Requery
'Il faut copier la clé de l'alliage dans la table TB_OFS pour attribuer un alliage à un OF appelle de la fonction
fn_CopieFkAlliageOf str_NomFormulaire, str_NomSousFormulaire
Else
MsgBox ("Rien à faire")
End If
End Sub |
Problème :
Le problème c’est que dans mon formulaire si je rentre comme nouvel OF : OF_0001 et que je lui attribue ensuite dans le sous-formulaire l’alliage ALI_2 ( qui à pour clé primaire le n°32 ) ben dans ma table TB_OFS j’aurai ceci comme données d’enregistées :
1/OF_0001/32/ NULL
2/NULL/32/NULL
Je ne comprends pas pourquoi cela me fait 2 lignes … …
Si vous avez une idée elle est la bienvenue …
PS : Dsl pour la longueur du code et du post … mais si je ne mets pas tout ce n’est pas facile à expliquer … …
PS 2 : J'ai rédité mon poste pour qu'il soit plus lisible ... ... Si jamais dans le code vous voyer des ..... cela signifique que y a du code mais c'est genre déclaration de variable... etc .. pas trop trop important pour le problème ...
Merci pour tout ...
Partager