IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

[Vba] Ajout d'enregistrement avec recordset.Problème ss-form


Sujet :

Access

  1. #1
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut [Vba] Ajout d'enregistrement avec recordset.Problème ss-form
    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é :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    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 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
    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
     
    '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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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
     
    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 …
    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
     
            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

    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
    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 ...
    ... Je me méfie de l'irrespect mais je revendique le droit à la frénésie ...

  2. #2
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Je ne vois même pas où se fait l'ajout

    Tu peux pas synthétiser ton post et ne donner que l'essentiel, parce que là, c'est assez complexe à suivre

  3. #3
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    Mon poste vient d'être raccourcis un peu ...

    J'ai essayer de laisser que les choses les plus importantes ... ...

    ...
    ... Je me méfie de l'irrespect mais je revendique le droit à la frénésie ...

  4. #4
    Membre averti Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Points : 395
    Points
    395
    Par défaut
    J'ai pensé à quelque chose ...

    Je pense que mon erreur doit se trouver quand je fais une rst_OF.Update. En fait je mets à jour mon enregistrement et cela doit venir de là pour qu'il se vide dans mon formulaire et que cela m'enregistre n'importe quoi dans ma table.

    Je m'explique mieux :

    En fait si je mets le rst_OF.Update en commentaire ben cela fonctionne sauf que cela ne mets pas à jour ma table donc mon enregistrement ne se fait pas comme il faut.
    ... Je me méfie de l'irrespect mais je revendique le droit à la frénésie ...

Discussions similaires

  1. ajouter , modifier enregistrement avec vba
    Par lecaire dans le forum VBA Access
    Réponses: 4
    Dernier message: 30/10/2011, 21h59
  2. trouver le numero d"un enregistrement avec recordset
    Par moimemessssssssss dans le forum VBA Access
    Réponses: 4
    Dernier message: 23/03/2011, 09h17
  3. [AC-2007] VBA Ajout d'enregistrement
    Par Greg47 dans le forum VBA Access
    Réponses: 4
    Dernier message: 26/03/2010, 00h28
  4. ajouter plusieurs enregistrements avec un bouton
    Par triaguae dans le forum IHM
    Réponses: 3
    Dernier message: 27/05/2008, 16h55
  5. [DAO][VBA]Ajout d'enregistrement : erreur objet requis
    Par charlix dans le forum VBA Access
    Réponses: 7
    Dernier message: 22/04/2007, 16h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo