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

IHM Discussion :

Effacer la recordsource d'un sousformulaire [AC-2010]


Sujet :

IHM

  1. #1
    Membre à l'essai
    Homme Profil pro
    Webdesigner
    Inscrit en
    Avril 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Avril 2017
    Messages : 19
    Points : 15
    Points
    15
    Par défaut Effacer la recordsource d'un sousformulaire
    Bonjour,

    Alors dans le titre de mon sujet tout parait simple mais je m'arrache les cheveux depuis un bon moment sur ce problème je vais essayer d'être bref et concis :

    Je reprend un projet access qui contient possède sa base de donnée sur SQL-Server 2012 je passe donc via l'ODBC et j'ai un petit sub qui me permet de faire des requêtes passant par ce dernier que je peux nommer et définir cette requête en recordsource d'un formulaire jusque là tout va bien.

    Mon soucis c'est que lorsque je veux installer cette base de donnée access sur un autre PC j'efface les requêtes linkée mais comme ces dernières ont déjà été définie en recordsource sur des formulaire j'obtiens naturellement un message d'erreur à l'ouverture m'indiquant que l'objet est inexistant.
    Je cherche donc un moyen de remettre la recordsource des sous-formulaire à zéro lorsque j'ouvre mon formulaire principal en VBA sauf que si je le fais sur l'event Load c'est déjà trop tard le message d'erreur apparaît et à l’événement d'ouverture j'obtiens un message d'erreur comme quoi je fais référence à un sous formulaire qui n'existe pas donc j'imagine qu'il ne s'est pas encore chargé.

    En désespoir de cause j'ai fait le code suivant sur le bouton de sortie du formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Dim DocName As String
        DocName = "formulaire principal"
        Forms![formulaire principal]![sous formulaire].Form.RecordSource = ""    
        DoCmd.Close acForm, DocName, acSaveYes
    Sauf que cela ne fait rien je me suis dit que si je n'arrivais pas à atteindre la recordsource du sousform à l'ouverture la cleaner à la fermeture marcherait mais access m'ignore complètement et ne fait rien à la fermeture je réouvre en mode création et je constate que les recordsource sont toujours là.

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonjour,

    Dans ce cas, il faudrait peut-être initialiser les sources des "sous-formulaires" à leur ouverture.
    Mettre le code
    sur les évènements Sur ouverture de chaque sous-formulaire.

    Cordialement.
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  3. #3
    Membre à l'essai
    Homme Profil pro
    Webdesigner
    Inscrit en
    Avril 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Avril 2017
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Oui j'avais aussi essayé cette solution mais sans succès car je l'ai pas précisé mais à l’événement load de mon formulaire principal je crée et j'attribut les nouvelles requêtes linkées aux recordsource de mes sous formulaire.
    Du coup quand j'ouvre mon formulaire principal il va essayer d'affecter la requête en recordsource à mes deux sous formulaires mais si la requête linkée qui était affectée précédemment a été supprimée alors j'obtiens le message d'erreur comme quoi je fais référence à un objet qui n'existe pas.

    Je peux contourner ce problème en passant en mode création et en effaçant manuellement les recordsources de tout mes sous formulaires et dans ce cas là pas de soucis mais bon ce n'est pas terrible du coup je cherche un moyen d'automatiser un peu tout ça mais je ne trouve pas de parade.

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonsoir,

    mais à l’événement load de mon formulaire principal je crée et j'attribut les nouvelles requêtes linkées aux recordsource de mes sous formulaire.
    Donc, c'est cette façon de faire qu'il faudrait modifier suite à tes nouvelles contraintes.
    Je dirai :
    1- mettre à vide par défaut les recordsource de tes sous-forumlaires
    2- Vérifier si les requêtes sont bien linkées
    3- Valider les sources des sous-formulaires.

    Je ne pense pas qu'il y ait d'autres solutions.

    Cordialement.
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  5. #5
    Membre à l'essai
    Homme Profil pro
    Webdesigner
    Inscrit en
    Avril 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Avril 2017
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Je viens de trouver une solution assez fiable j'ai fait un petit sub qui se déclenche sur Form_open qui check la présence d'une requête spécifique si elle a été supprimée je la relance.

    ça marche pour mon premier sous formulaire du coup plus besoin de remettre la record source à zéro mais pas pour le deuxième.

    Je me demande si c'est à cause de la présence d'onglet car j'ai le formulaire principal et les deux sous_form que j'essaye d'atteindre se trouve chacun dans un onglet différent.

    Est ce possible que le sous formulaire ne soit pas chargé car je n'ai pas cliqué sur l'onglet qui le contient ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Webdesigner
    Inscrit en
    Avril 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Avril 2017
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    PROBLEME RESOLU !

    Je précise ce que j'ai fais au cas où ça serve un jour bien que ce soit assez " tordu " comme cas de figure je dois bien l'avouer :

    Je fais donc une petite fonction pour vérifier l'existence de la requête source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function ExistQuery(NomQuery As String) As Boolean
    Dim qry As DAO.QueryDef
    For Each qry In CurrentDb.QueryDefs
    If qry.Name = NomQuery Then
    ExistQuery = True
    Exit For
    End If
    Next qry
    End Function
    Function que je mets en condition sur le click du bouton d'ouverture du formulaire et si la requête source n'existe pas j'ouvre en mode création je clean la source qui était en mémoire, je ferme avec une save et j'ouvre le formulaire normalement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
        Dim strDocName As String
        strDocName = "Form_principal"
        If Not ExistQuery("nomquery") Then
     
        DoCmd.OpenForm strDocName, acViewDesign
        Forms![Form_principal]![Form_secondaire].Form.RecordSource = ""
        DoCmd.Close acForm, strDocName, acSaveYes
        DoCmd.OpenForm strDocName
     
        Else 
        DoCmd.OpenForm strDocName
        End if
    Merci à madefemere pour l'aide apportée.

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonjour,

    Une petite amélioration je pense : tu n'es pas obligé de passer par la mode création pour changer le recordsource d'un formulaire. Les lignes 7 et 9 peuvent être supprimées.

    Cordialement et bonne continuation.
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  8. #8
    Membre à l'essai
    Homme Profil pro
    Webdesigner
    Inscrit en
    Avril 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Avril 2017
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Je ne les avais pas mise au départ mais pour une raison que je ne comprends pas dans mon cas je ne peux pas modifier la recordsource si je n'ouvre pas en création.
    Le sous formulaire garde en mémoire mon ancienne requête et je ne peux pas la changer via le VB et en prime si cette dernière est supprimée alors j'obtiens en plus un message d'erreur comme quoi je fais référence à un sousform inexistant.
    J'ai donc trouvé cette parade mais il y'a peu être d'autres solutions je ne connais pas bien les mécaniques d'Access dans ce genre de cas je ne pense pas que cela vienne de mon sub pour créer mes query je le mets au cas où :

    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
    Sub RunPassThrough(strSQL As String, Optional queryName As String = "qrySQLPass", Optional returnValue As Boolean = False, Optional execute As Boolean = True, Optional timeout As Integer = 1000)
     
    Dim qdfPassThrough As DAO.QueryDef, MyDB As Database
     
    DoCmd.SetWarnings False 'Avoid anoying warning messages
     
    On Error Resume Next
    CurrentDb.QueryDefs.Delete queryName
    On Error GoTo 0
     
    Set MyDB = CurrentDb()
    MyDB.QueryTimeout = timeout
     
    Set qdfPassThrough = MyDB.CreateQueryDef(queryName)
     
    qdfPassThrough.Connect = strConnect
    qdfPassThrough.SQL = strSQL
    qdfPassThrough.ReturnsRecords = returnValue
    qdfPassThrough.Close
     
    Application.RefreshDatabaseWindow
     
    If execute = True Then
        DoCmd.OpenQuery queryName ', acViewNormal, acReadOnly
    End If
     
    End Sub
    ( le strConnect étant simplement ma chaîne de connection ODBC pour accéder à mon MS SQL server )

    Le fait est que avec ces query linkée si jamais je supprime l'une d'entre elle qui a été gardé en mémoire par mon sousform alors je ne peux pas changer la recordsource sans l'aide du mode création autrement Access me dit que mon sousform n'existe pas je n'ai vraiment pas compris la cause.

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

Discussions similaires

  1. effacer une table que si elle existe ?
    Par soniaSQL dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/06/2003, 15h55
  2. [VBA-E] [Excel] Effacer une feuille
    Par Tray dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 31/01/2003, 11h04
  3. [VB6] Ecrire/Modifier/Effacer ds un fichier text-4 Chs/Lg
    Par Jonathan_Korvitch dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 24/12/2002, 19h54
  4. Comment effacer des Items d'un TListView ?
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 11/11/2002, 11h19
  5. [VBA Excel] Effacer rapidement une feuille
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/10/2002, 14h12

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