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

VBA Access Discussion :

Affecter un recordset à un formulaire [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut Affecter un recordset à un formulaire
    Bonjour à tous,
    pour des raisons de rapidité, j'ouvre un recordset avec un texte SQL et je teste le nombre d'enregistrements (recordcount) si = 0, je passe à la suite
    sinon, je voudrai ouvrir un formulaire basé sur ce recordset.
    je sais faire ça en attribuant le texte SQL à la propriété recordsource. mais il me semble que cette requête doit être re-moulinée à ce moment là
    Y a t il une solution pour affecter directement le recordset déjà constitué à la source du formulaire?
    merci
    -------------------Simplifi----------comme si tout était simple--------

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    Bonjour,
    j'aurais tendance à penser à qqe chose comme ç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
    16
    Dim strSQL As String
    Dim rst As DAO.Recordset
     
    strSQL = "SELECT * FROM MaTable;"
    Set rst = CurrentDb.OpenRecordset(strSQL)
    rst.MoveLast
     
    If rst.RecordCount = 0 Then
        ......
    Else
        DoCmd.OpenForm "MonFormulaire", acNormal, , , acFormEdit, acWindowNormal
        With Forms("MonFormulaire")
            .RecordSource = strSQL
            .Requery
        End With
    End If
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  3. #3
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    Merci pour la rapidité!!
    c'est bien la méthode que j'utilise pour le moment
    mais j'ai l'impression que Access résout des fois le SQL, une pour alimenter le recordset, une pour alimenter le formulaire.
    Et comme chaque formulaire possède son recordset, qu'on peut d'ailleurs récupérer (Rs = forms!mon_form.recordset), je cherche à faire le contraire (forms!mon_form.recordset = Rs)
    là, j'ai une erreur: 3251 Opération non autorisée pour ce type d'objet

    je cherche donc la bonne solution

    PS: ces requêtes (à l'origine du SQL) sont des recherches d'erreurs et il y en a une trentaine pour le moment ce qui fait que ma première méthode de requêtes-ajouts dans une table et formulaire sur cette table est bien lente!!
    -------------------Simplifi----------comme si tout était simple--------

  4. #4
    Membre expérimenté
    Avatar de mumen
    Homme Profil pro
    Développement à façon multisecteur.
    Inscrit en
    Mars 2004
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Développement à façon multisecteur.

    Informations forums :
    Inscription : Mars 2004
    Messages : 566
    Points : 1 381
    Points
    1 381
    Par défaut
    Y a t il une solution pour affecter directement le recordset déjà constitué à la source du formulaire?
    Je n'y crois pas, d'ailleurs "Opération non autorisée pour ce type d'objet".

    Quand tu dis
    pour des raisons de rapidité, j'ouvre un recordset avec un texte SQL et je teste le nombre d'enregistrements (recordcount) si = 0, je passe à la suite
    Tu fais un MoveLast pour tester le RecordCount ? Parce que si oui, tester le EOF suffirait à te dire si tu as au moins un enregistrement sans aller jusqu'au bout du RecordSet.

  5. #5
    Membre expérimenté
    Avatar de mumen
    Homme Profil pro
    Développement à façon multisecteur.
    Inscrit en
    Mars 2004
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Développement à façon multisecteur.

    Informations forums :
    Inscription : Mars 2004
    Messages : 566
    Points : 1 381
    Points
    1 381
    Par défaut
    Maintenant, si ton ouverture de requête est vraiment longue par rapport aux sorties attendues (des erreurs, ça doit être rare), au point que la multiplier par deux est gênant, alors fais une table temporaire avec le résultat et ouvre le formulaire dessus.

  6. #6
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Je crois que c'est à ça que tu pensais :
    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
    Option Compare Database
    Option Explicit
     
    ' Recordset global
    Dim rsFm As DAO.Recordset
     
     
    Private Sub Form_Load()
    Dim sSql As String
    ' Ouvrir le recordset global
    sSql = "SELECT * FROM Clients"
    Set rsFm = Application.CurrentDb.OpenRecordset(sSql, dbOpenDynaset)
    ' En faire la source du formulaire
    Set Me.Recordset = rsFm
    End Sub
     
    Private Sub Form_Unload(Cancel As Integer)
    ' Déconnecter le formulaire du recordset
    Set Me.Recordset = Nothing
    ' Libérer/fermer le recordset global
    Set rsFm = Nothing
    End Sub
    Ce que j'ai fait :
    - J'ai créé un formulaire basé sur la table Clients.
    - J'ai supprimé la source du formulaire (mise à blanc de la propriété Données>Source qui contenait «Clients»)
    - J'ai ajouté le code ci-dessus.

    A+

  7. #7
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    Merci à tous!
    effectivement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           Forms!Résidus.Form.Recordset = Rs
    donne une erreur mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           Set Forms!Résidus.Form.Recordset = Rs
    fonctionne
    l'erreur était dans le détail
    -------------------Simplifi----------comme si tout était simple--------

  8. #8
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    Juste pour ceux que la programmation complète intéresserait:
    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
    Function Filtre_à_Résidus(Devis As Long) As Integer
    Dim  Rs As DAO.Recordset
    Dim Txt_Sql As String
     
    'DoCmd.SetWarnings False
    'DoCmd.RunSQL "DELETE * FROM Résidus;" ' plus besoin de table
    'DoCmd.OpenQuery "Résidus_export_certif_devis_1" 'précédente méthode avec requêtes ajout
        Txt_Sql = "SELECT [N° de proposition] as N°devis, 'Opérations' as Formulaire, 'Ref' as Champ, Ref as Valeur_problématique, 'N°prop' as Clef, ""Libellé de l'opération"" as Commentaire"
        Txt_Sql = Txt_Sql & " FROM (Devis_détail INNER JOIN Devis_détail_plus ON (Devis_détail.[N° de proposition] = Devis_détail_plus.N°prop) AND (Devis_détail.[N° de proposition] = Devis_détail_plus.N°prop)) LEFT JOIN Acc_cert ON Devis_détail_plus.Ref = Acc_cert.CODE"
        Txt_Sql = Txt_Sql & " WHERE n_dev_1=" & Devis & " AND CODE Is Null AND Typ='ops';"
        Set Rs = CurrentDb.OpenRecordset(Txt_Sql)
        If Rs.RecordCount > 0 Then
            DoCmd.OpenForm "Résidus"
            Set Forms!Résidus.Form.Recordset = Rs
            Filtre_à_Résidus = 0
            Exit Function
        Else
            Filtre_à_Résidus = 1
        End If
    End If
    et pour inspirer ....
    -------------------Simplifi----------comme si tout était simple--------

  9. #9
    Membre expérimenté
    Avatar de mumen
    Homme Profil pro
    Développement à façon multisecteur.
    Inscrit en
    Mars 2004
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Développement à façon multisecteur.

    Informations forums :
    Inscription : Mars 2004
    Messages : 566
    Points : 1 381
    Points
    1 381
    Par défaut
    Set Me.Recordset = rsFm
    J'admire. Et cela laisse à présager d'autres possibilités.

    Il s'est passé des choses depuis Access 97 !

  10. #10
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    En effet Je suis avec Access 97 au boulot et quand je me suis penché sur le problème, je ne trouvais pas de propriété .Recordset pour les objets Forms....A part le .RecordsetClone qui est en lecture seule, il n'y a rien...D'où ma proposition :p Mais qd j'aurai l'occasion de travailler sur une version plus récente d'Access, je sens que je m'en servirai
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mai 2019
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    SVP, j'ai une question à vous posez.
    est-il possible d'affecter un recordset à un champ d'un sous formulaire dans access comme cette façon:
    voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    'Requête SQL table
        SQL = "SELECT tachesdeSuiviedeProjet.tache FROM tachesdeSuiviedeProjet"
        SQL = SQL & "  WHERE (((tachesdeSuiviedeProjet.TypeProjet)="
        SQL = SQL & Typeprojet
        SQL = SQL & "));"
     
    Set rstTaches = CurrentDb.OpenRecordset(SQL, dbOpenForwardOnly)
     
     
     
     Set Me![FichedeSuiviedeProjet]![taches].Recordset = rstTaches!tache

    merci

  12. #12
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 663
    Points : 14 651
    Points
    14 651
    Par défaut
    bonsoir,
    est-il possible d'affecter un recordset à un champ d'un sous formulaire dans access comme cette façon:
    un recordset est un jeu d'enregistrements, c'est à dire une ou plusieurs lignes contenant chacune une ou plusieurs colonnes: comment penses-tu affecter un champ avec cela ?
    c'est comme essayer de faire entrer une feuille excel dans une seule case ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mai 2019
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    tous d'abord, je vous remercie d'avoir répondu à ma question
    je vous explique mon besoin:

    j'aimerais afficher le résultat d'une requête SQL (plusieurs enregistrement ) dans un sous formulaire lier à une table pour que je puisse par la suite continuer à remplir les autres champs

    Exemple:
    j'ai une table projet qui a pour colonnes : id, titre, typeProjet, dateMES,...............
    une table fichedesuivie qui a pour colonnes: id, idprojet, typeProjet, tâches.......
    une autre table listedestache aui a pour colonnes: id, typeProjet, listetaches (association entre les deux tables se fait par le type de projet )
    en effet pour chaque type de projet, j'ai une liste des tâches bien précise donc ce que je veut faire c'est que une fois que je choisie le type de projet dans le formulaire projet, le champ listetaches de sous formulaire de la table fichedeSuivie se met à jour avec la liste des tâches associé au type de projet


    merci beaucoup

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

Discussions similaires

  1. Affecter varleur d'un formulaire à une variable
    Par 30avril1989 dans le forum IHM
    Réponses: 1
    Dernier message: 26/06/2010, 16h51
  2. [Toutes versions] Affecter une valeur sur formulaire à un champ du sous formulaire
    Par jerem2007 dans le forum IHM
    Réponses: 1
    Dernier message: 18/03/2010, 19h22
  3. Access - vba recordset sous-formulaire
    Par jedi186 dans le forum VBA Access
    Réponses: 17
    Dernier message: 01/06/2008, 13h02
  4. Réponses: 11
    Dernier message: 16/12/2005, 14h44
  5. Affecter un recordset à un autre ?
    Par _developpeur_ dans le forum Access
    Réponses: 2
    Dernier message: 22/10/2005, 10h22

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