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 :

Selection données d'un formulaire dans un recordset


Sujet :

Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 31
    Points : 7
    Points
    7
    Par défaut Selection données d'un formulaire dans un recordset
    Bonjour tout le monde !

    Alors voilà mon problème : j'ai une requête de type sélection qui prend des données dans un formulaire.
    A un moment donné je lui demande de prendre la valeur d'une liste déroulante du formulaire, de la faire correspondre avec son code (numéro auto) de sa table d'origine pour l'enregistrer dans une autre table.

    J'utilise ceci dans mon champ critère de ma requête : [Formulaires]![Masque saisie analyses]![Nom_Matiere]

    Et c'est ici que ce situe le problème : pour l'application d'une requête Select j'utilise un Record set (logique) mais j'ai un message d'erreur : 3061, trop peu de paramètre 1 attendu.

    Après moult recherches j'ai déniché sur un vieux post d'un autre forum quelqu'un qui affirmait que dans une requête DAO record set on ne peut pas faire référence à un formulaire !
    Mais ici impossible de d'utiliser une autre méthode de requête, je veux rajouter des enregistrements issus de mon formulaire à une table déjà existante.

    Donc question N°1 : son affirmation est-elle vrai ?
    Si oui, question N°2 : comment puis-je contourner le problème ?
    Si non, question N°3 : mais d'où viens l'erreur ?

    Je met ma base de données en lien si vous avez du temps a perdre ou une grande âme, aidez moi s'il vous plaît !
    Pièce jointe 344963

    En vous remerciant par avance !

    PS : pour les courageux, mon problème se situe sur le formulaire Masque saisie analyse et la requête concernée est Masque saisie analyse - aux

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 052
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 052
    Points : 24 645
    Points
    24 645
    Par défaut
    Bonjour,

    N'ayant pas lu le post de cet autre forum, donc les circonstances et le cas traité, je ne me prononcerai pas.

    Tout cela manque de clarté.

    Peux-tu au moins indiquer le code que tu utilises ?
    Le but que tu recherches (à part appliquer une requête à un Recordset DAO -ce qui n'est pas très logique).

    Cordialement,

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 31
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    J'ai déniché ce post sur un sujet traitant de l'erreur 3061. Lui aussi se trouvait dans la même situation que moi.

    Petite précision je débute en VBA donc je peux dire des bêtises... il me semblait que lorsque l'on fait appel a une requête sélection en VBA il faut déclencher un Record set ( mais je me trompe peut être ?).
    Si il y a un autre moyen je t'en prie éclaire ma lanterne !

    Voici le code VBA concerné :
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    Private Sub Commande25_Click()
     
        Dim db As Database
        Dim tableEchantillon As TableDef, tableSaisie As TableDef, tableAnalyses As TableDef
        Dim champsObligatoires As Boolean
        Dim requêteAux As QueryDef
        Dim tableSaisieRS As Recordset, tableEchantillonRS As Recordset, tableAnalysesRS As Recordset, requêteAuxRS As Recordset
        Dim codeEchantillon As Long
        Dim réponse As String
        Dim DateEchantillon As Date
     
     
        réponse = MsgBox("Enregistrer les valeurs ?", vbOKCancel)
     
        If réponse = vbOK Then
     
        'Vérification de la présence de valeurs obligatoires
        Set db = CurrentDb
     
        champsObligatoires = True
        If IsNull(Nom_Matiere.Value) Or IsNull(ReferenceEchantillon) Or IsNull(DateEchantillon) Then champsObligatoires = False
        Set tableSaisie = db.TableDefs("ms_analyse_tmp")
        Set tableSaisieRS = tableSaisie.OpenRecordset
        If tableSaisieRS.RecordCount = 0 Then champsObligatoires = False
        If champsObligatoires = False Then
            MsgBox "Il manque des valeurs pour effectuer l'enregistrement."
        Else
     
        'Enregistrement sur la table echantillons
        DateEchantillon = Me.Texte35.Value
        Set tableEchantillon = db.TableDefs("echantillons")
        Set tableEchantillonRS = tableEchantillon.OpenRecordset
     
        With tableEchantillonRS
            .AddNew
            .Fields("code_rapport").Value = CodeRapport.Value
            .Fields("reference_externe_echantillon").Value = ReferenceEchantillon.Value
            .Fields("date_prelevement").Value = DateEchantillon
            codeEchantillon = .Fields("code_echantillon").Value
            .Update
        End With  'jusqu'ici tout va bien
     
        'Enregistrement sur la table analyses
        Set tableAnalyses = db.TableDefs("analyses")
        Set tableAnalysesRS = tableAnalyses.OpenRecordset
        Set requêteAux = db.QueryDefs("Masque saisie analyse - aux")
        Set requêteAuxRS = requêteAux.OpenRecordset    'ici survient l'erreur 3061 trop peu de paramètre, 1 attendu
     
     
        If requêteAuxRS.RecordCount > 0 Then
        requêteAuxRS.MoveFirst
        While Not requêteAuxRS.EOF
            With tableAnalysesRS
                .AddNew
                .Fields("code_echantillon").Value = codeEchantillon
                .Fields("code_matiere").Value = requêteAuxRS.Fields("code_matiere").Value
                .Fields("code_parametre").Value = requêteAuxRS.Fields("code_parametre").Value
                .Fields("Valeur").Value = requêteAuxRS.Fields("valeur").Value
                .Fields("code_unite").Value = requêteAuxRS.Fields("code_unite").Value
                .Fields("code_statut_mesure") = requêteAuxRS.Fields("code_statut_mesure").Value
                .Update
             End With
             requêteAuxRS.MoveNext
        Wend
        MsgBox "Enregistrement terminé"
     
    End If
     
    End If
     
    End If
     
    End Sub
    En te remerciant !

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 052
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 052
    Points : 24 645
    Points
    24 645
    Par défaut
    oui effectivement dans ce cas il a tout à fait raison.

    Dans un cas comme celui-là il te faut utiliser les Parameters SQL :

    La requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    PARAMETERS NomMatiere Text ( 255 );
    SELECT matieres.code_matiere, parametres.code_parametre, [ms_analyse_tmp].[Valeur]*[Correspondance unités].[coefficient] AS valeur, unites.code_unite, statuts_mesure.code_statut_mesure
    FROM statuts_mesure INNER JOIN ((parametres INNER JOIN (matieres INNER JOIN (unites INNER JOIN [Correspondance unités] ON unites.code_unite = [Correspondance unités].code_unite) ON matieres.code_matiere = [Correspondance unités].code_matiere) ON parametres.code_parametre = [Correspondance unités].code_parametre) INNER JOIN ms_analyse_tmp ON (unites.code_unite = ms_analyse_tmp.Unité) AND (parametres.code_parametre = ms_analyse_tmp.Paramètre)) ON statuts_mesure.code_statut_mesure = ms_analyse_tmp.Statut
    WHERE (((matieres.code_matiere)=[NomMatiere]));
    Le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                Set requêteAux = db.QueryDefs("Masque saisie analyse - aux")
                requêteAux.Parameters(0) = Me.Nom_Matiere
                'ou requêteAux.Parameters("NomMatiere") = Me.Nom_Matiere  'qui est plus clair
                Set requêteAuxRS = requêteAux.OpenRecordset
    Ce que je n'ai toujours pas compris c'est ce mic-mac de requêtes et de tables temporaires pour la saisie. Il y a une raison particulière ?
    Surtout que tu ne travailles pas en ADO.

    Quelques conseils :
    Nommes tes boutons correctement. Commande25()/Texte35... c'est bien quand tu fais un TP/Test. Penses à ceux qui te succèderont.
    L'indentation -> télécharge l'outil "Smart indent" dont tu trouveras le lien dans la rubrique OUTILS.
    Les messages d'avertissement : Si il manque des infos en saisie, indique lesquelles
    Quelques commentaires non pas sur ce que signifie chaque ligne mais sur la méthode globale.
    Traitement des erreurs ?

    C'est un TP ou une application pour une boite ?

    Cordialement,

  5. #5
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 052
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 052
    Points : 24 645
    Points
    24 645
    Par défaut
    il me semblait que lorsque l'on fait appel a une requête sélection en VBA il faut déclencher un Record set
    Je reviens sur ça :

    Si tu utilises de l'ADO (ce qui n'est pas ton cas) tu devras obligatoirement passer par une requête (objet ADO.Recordset en VBA) pour ton scrud.

    Avec DAO ce n'est pas pareil, évidemment tu peux utiliser la même technique que pour ADO, mais ça te fais faire beaucoup plus de code pour aucun bénéfice.

    Lorsque tu fais des manipulations dans une table au travers d'un formulaire, renseigne la source de celui-ci avec un "SELECT ... FROM Table".
    Pour les calculs : utilise le VBA (perso je préfère que les calculs soit dans le VBA, il y a plus de code mais on y gagne en maintenance car tout est au même endroit)
    ou la propriété source pour poser ton calcul.

    En utilisant les sources formulaire (et sous-formulaire) tu gagnes l'utilisation du champ/père champ/fils et le lien (clef étrangère) se fait automatiquement.

    Mais peut-être que dans ton cas cela ne peut s'appliquer.

    Bref ! il me semble qu'il y a beaucoup de requêtes d'ajout/suppression... dans ton code qui pourraient (devraient?) être géré par MS ACCESS et non VBA.

    Cordialement,

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 31
    Points : 7
    Points
    7
    Par défaut
    Je suis en stage au sein d'une entreprise.

    J'ai en fait récupérer cette BDD qui était déjà bien commencée et maintenant je m'efforce de la comprendre et de surtout de la faire fonctionner (alors que je n'avais jusqu'ici aucune connaissance sur Access) ! Et du coup tout cela fait un peu brouillon !
    Pour ce qui est de l'ADO... ben tu vois j'en dis des bêtises (je croyais)

    En ce qui concerne les boutons tu as parfaitement raisons et j'y songeais justement... et je vais télécharger ce que tu me conseilles.

    Pour ce que tu me proposes, et bien au début j'avais fait strictement la même chose que ce que tu me conseilles pour la requête !
    Malheureusement (je viens de réessayer) ça ne marche pas ! Enfin il n'y a pas de message d'erreur, simplement il n'enregistre rien : "If requêteAuxRS.RecordCount > 0 Then" le recordCount renvoie la valeur 0 donc fin du programme...
    Je ne savais pas pourquoi donc j'ai essayé l'autre méthode qui figure dans la base de donnée que je vous ai transmise.

    Si tu as une idée du pourquoi je suis preneur (sans vouloir abuser de ta patience) !

    En te remerciant,

  7. #7
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 052
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 052
    Points : 24 645
    Points
    24 645
    Par défaut
    Le RecordCount est un piège. Perso je ne l'utilise jamais.
    Pour qu'il te renvoi la valeur il faut faire un déplacement movenext/moveprevious ou un requery (ce qui est encore plus gourmant). Du coup on perd la position du curseur.

    J'utiliser ça :
    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
    Public Function isVideRst(rst As Recordset2) As Boolean
    '---------------------------------------------------------------------------------------
    ' Procedure : isVideRst
    ' Author    : Fabrice CONSTANS (MVP)
    ' Date      : 15/02/2006
    ' Purpose   : renvoi True si le Rst est Vide, sinon False
    ' Parameters: Recordset ou Recordset2
    ' Return    : Boolean
    '---------------------------------------------------------------------------------------
    '
    10    On Error Resume Next
    20       isVideRst = True
    30       isVideRst = rst.EOF And rst.BOF
     
    End Function
    Cordialement,

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 31
    Points : 7
    Points
    7
    Par défaut
    D'accord, c'est noté, éviter d'utiliser les recordcount.

    Mais malheureusement ici ce n'est pas la source du problème. C'est bien la requête qui ne contient aucun enregistrement (je m'en suis assuré en enlevant le recordcount).
    Et je soupçonne très fortement que ce soit cette histoire de code_matiere... c'est même sûr puisque si j'enlève la sélection du codematière il enregistre tout le reste...
    La requête est donc bonne a l’exception de ce qui a trait a ce code matière !

    Merci pour tes conseils éclairés !

    PS : j'oubliais que je suis dans une grande boîte, donc pour le "Smart indent" c'est raté, surtout quand on sait qu'ils ont mis une semaine a m'installer Access sur mon poste...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conversion de type de données d'un champ dans un recordset DAO.
    Par heavenvibes dans le forum VBA Access
    Réponses: 9
    Dernier message: 01/03/2007, 12h21
  2. [MySQL] Insérer des données d'un formulaire dans la base
    Par ciel65 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 15/01/2007, 09h39
  3. Réponses: 6
    Dernier message: 01/08/2006, 18h45
  4. Réponses: 1
    Dernier message: 29/05/2006, 11h01
  5. insertion de donnée d'un formulaire dans un base mysql
    Par frans2111 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 14/10/2005, 23h34

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