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 :

[A-03] exécuter une fonction dans une autre BDD


Sujet :

VBA Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut [A-03] exécuter une fonction dans une autre BDD
    Salut le forum,

    Alors voila, je développe un outil permettant d'importer des données XML dans une Base ACCESS. Cet outil est aussi une base ACCESS, avec une interface et des tables "tampon", appelons le "accessXML" tandis que la base qui héberge toute les données s'appellera ici "globalDB".

    L'export définitif des données se fait depuis cet outil "accessXML"...
    Problème : Après avoir exporté avec succès les données dans la base globalDB (que je n'ouvre pas directement... les données sont insérées dans une table liée), je dois éxécuter une fonction qui prend en compte mes nouvelles données et met à jour les analyses qui en découlent...

    En gros, je cherche à ouvrir globalDB, y éxécuter la fonction "fMAJ" (qui exécute elle même un certain nombre de requêtes action dans globalDB), pui refermer globalDB. De retour sous accessXML, une msgbox confirmera les actions faites...

    Qui peut m'aider s'il vous plait ?

    IBill

  2. #2
    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
    hello
    je viens justement de me poser ce genre de questions qui ont trouvé leur reponse dans ce fil:
    http://www.developpez.net/forums/d63...tre-frontales/
    -------------------Simplifi----------comme si tout était simple--------

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    super, je vais tester ça... A priori je n'ai besoin que d'exécuter une procédure qui exécutera ensuite les requêtes action stockées dans la base.
    Du coup, la commande doit être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonAppAccess.run mafonction(mes arguments)

    A suivre...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    Bon je galère encore...

    En fait, j'ai 2 gros problèmes : La base à ouvrir est sécurisée par un MDW... en faisant des recherches, j'ai vu sur le site de MS http://support.microsoft.com/default...b;en-us;192919 qu'on pouvait contourner ce probleme par un shell... là ça marche, ma base s'ouvre en arrière plan. Par contre dans le code qu'ils filent, il y a un setfocus qui plante à la compilation. Bon c'est vrai il disent que c'est pour toutes les versions d'access avant 2003, mais quand même je me demande d'où il sort...

    Une fois la BD ouverte, je dois éxécuter un certain nombre de tâches, et là ça flanche.
    Pas moyen d'ouvrir de form, ni d'éxécuter une commande SQL, rien !

    Bon voilà mon dernier morceau de code... si quelqu'un peut m'aider.

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    Public Sub MAJRFT()
          Dim accObj As Access.application, Msg As String
          Dim application As String, dbs As String, workgroup As String
          Dim user As String, password As String, cTries As Integer
          Dim x
     
    Dim SQL4 As String, SQLrs As String
    Dim db As Database
    Dim rs As Recordset
     
    SQLrs = "SELECT tbl_A.fld_A, tbl_A.fld_B " & _
                "FROM tbl_A;"
     
    Set db = CurrentDb
    Set rs = db.OpenRecordset(SQLrs)
     
     
          ' This is the default location of Access
          application = "C:\Program Files\Microsoft Office\OFFICE11\MSACCESS.EXE"
          ' Use the path and name of a secured MDB on your system
          dbs = "C:\...\mabase.mdb"
          ' This is the default workgroup
          workgroup = "C:\...\monmdw.mdw"
          user = "admin"           ' Use a valid username
          password = "pass"  ' and correct password
     
          x = Shell(application & " " & Chr(34) & dbs & Chr(34) & " /nostartup /user " & user & _
          " /pwd " & password & " /wrkgrp " & Chr(34) & workgroup & Chr(34), vbMinimizedFocus)
     
          On Error GoTo WAITFORACCESS
          Set accObj = GetObject(, "Access.Application")
     
          ' Turn off error handling
          On Error GoTo 0
     
          ' You can now use the accObj reference to automate Access
     
          Msg = "Access is now open. You can click on Microsoft Access "
          Msg = Msg & "in the Taskbar to see that your database is open."
          Msg = Msg & vbCrLf & vbCrLf & "When ready, click OK to close."
          MsgBox Msg, , "Success!"
     
    ''''''''''''''''CODE RS (interaction entre mes 2 bases...
    If intLastUpdated > 0 Then
        rs.MoveLast
        rs.Move -(intLastUpdated - 1)
     
        Do Until rs.EOF
     
        SQL4 = "Delete tbl_B.fld_B " & _
            "FROM tbl_B " & _
            "WHERE (((tbl_B.fld_B)=" & rs.Fields(1) & "));"
     
            accObj.DoCmd.OpenForm "monform",,,"ID = " & mavariable
            accObj.DoCmd.RunSQL SQL4 
            rs.MoveNext
        Loop
     
    Else
        MsgBox "pas d'enregistrements importés, pas de mise à jour"
    End If
     
     
    '''''''''''''''''''''''''''''''''''''''''''''''''
          accObj.CloseCurrentDatabase
          accObj.Quit
     
          Set accObj = Nothing
          MsgBox "All Done!", vbMsgBoxSetForeground
     
          Exit Sub
     
    WAITFORACCESS:                     ' <--- This line must be left-aligned.
          ' Access isn't registered in the Running Object Table yet, so call
          ' SetFocus to take focus from Access, wait half a second, and try
          ' again. If you try five times and fail, then something has probably
          ' gone wrong, so warn the user and exit.
          ''SetFocus
          If cTries < 5 Then
             cTries = cTries + 1
             Sleep 500 ' wait 1/2 seconds
             Resume
          Else
             MsgBox "Access is taking too long. Process ended.", _
                vbMsgBoxSetForeground
          End If
          End Sub

    Franchement je maîtrise pas cette histoire... j'y ai passé bien du temps et toujours rien :/

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Commentaire sur cet extrait de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set accObj = GetObject(, "Access.Application")
    Avec cette instruction, si plusieurs instances d'Access sont lancées, tu n'as aucune garantie de référencer la bonne application Access.
    Et j'imagine que c'est ce qui se passe dans ton cas, l'objet accObj ne référence pas la bonne base, donc il ne peut y trouver le formulaire que tu veux ouvrir !

    Il vaudrait mieux être explicite et coder à la place:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set accObj = GetObject(dbs)
    En supposant que dbs est une variable String qui contient le chemin+nom complet du fichier MDB (cf. l'exemple dans ton post précédent).


    A propos d'un post plus ancien...
    Citation Envoyé par ibill Voir le message
    super, je vais tester ça... A priori je n'ai besoin que d'exécuter une procédure qui exécutera ensuite les requêtes action stockées dans la base.
    Du coup, la commande doit être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonAppAccess.run mafonction(mes arguments)
    La syntaxe correcte est plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonAppAccess.Run "mafonction", <mon_argument_1>,... , <mon_argument_n>
    SI c'est une fonction, tu peux aussi récupérer la valeur retournée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    résultat = MonAppAccess.Run("mafonction", <mon_argument_1>,... , <mon_argument_n>)
    Mais franchement, l'aide en ligne d'Access devrait tout t'expliquer avec des exemples.
    _

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    Salut JBO et merci pour ta réponse qui m'est fort utile

    J'ai commencé à faire quelques tests et c'est déja plus convaincant... Demain matin je tenterai de faire un code propre (parceque là c'est un mix entre plusieurs sources, celle de MS déja citée plus des bouts de code d'autres forums...), referai des test et pourrai ptet bien taguer résolu.

    Par contre 2 questions subsistent :
    - existe t-il un paramètre pour que l'application appelante reste au premier plan (ou celle appelée en arrière plan ou cachée, c'est selon) ?
    - et ce setfocus dans le code proposé par microsoft... une erreur de leur part ou un mystère pour un utilisateur trop peu expérimenté comme moi ?

    Enfin bon l'essentiel c'est que ça marche, je vais peut être mieux dormir ce soir

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    Salut,

    Voici le code qui me permet d'ouvrir depuis une BDD Access une autre (appelée ici BDDExterne) et d'y faire plusieurs actions...

    Le but de la sub est de recalculer un certain nombre de champs d'analyse suite à un import de données.
    Pour info, j'importe dans ma base en cours des enregistrements d'un fichier XML issu d'un PDA, je les met en forme, et je les exporte ensuite vers la base destination (BDDExterne). Lors de cet import, des mises à jour sont faites pour chaque enregistrement importé...

    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
    74
    75
    76
    77
    78
     
    Public Sub MajRF()
     
    'déclaration variables pour ouverture BDDExterne avec sécurité groupe de travail
    Dim objAccess, objShell
        Dim strPathToMDB
        Dim application
        Dim wkgp
        Dim User
        Dim Pwd
     
    'variables spécifiques recordset qui contient les enregistrements exportés
    Dim db As Database
    Dim rs As Recordset
    Dim strSQLrs As String
     
    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSQLrs)
     
    If intLastUpdated > 0 Then 'variable égale au nb d'enregistrements exportés
     
    'sablier
    Screen.MousePointer = 11
     
    'Ouverture BDDExterne
        strPathToMDB = "C:\BDDExterne.mdb"
        application = "C:\Program Files\Microsoft Office\Office11\MSACCESS.EXE"
        User = "Moi"
        Pwd = "MonPWD"
        wkgp = "C:\MonMDW.mdw"
     
        Set objShell = CreateObject("WScript.Shell")
            objShell.Run Chr(34) & application & " " & Chr(34) & strPathToMDB & Chr(34) & " /nostartup /user " & User & _
          " /pwd " & Pwd & " /wrkgrp " & Chr(34) & wkgp & Chr(34)
     
        'pause 4 sec.
        Sleep 4000 'nécessite la déclaration de la fonction en entête de module
     
        Set objAccess = GetObject(strPathToMDB)
     
     
    'Ouverture Recordset
        strSQLrs = "SELECT tbl_1.Id, tbl_1.FK_Id " & _
                "FROM tbl_1;"
     
        Set db = CurrentDb
        Set rs = db.OpenRecordset(strSQLrs)
     
        'Parcours des enregistrements
        rs.MoveLast
        rs.Move -(intLastUpdated - 1)
     
        Do Until rs.EOF
            '               
            objAccess.DoCmd.OpenForm "frm_deBDDExterne", , , "FK_Id =" & rs.Fields(1)
            objAccess.Run "MaFonctionDansBDDExterne", (rs.Fields(1))
            objAccess.DoCmd.Close acForm, "frm_deBDDExterne", acSaveNo
            rs.MoveNext
        Loop
     
    'fermeture instance BDDExterne
        objAccess.Quit
        Set objAccess = Nothing
        Set objShell = Nothing
     
        rs.Close
        Set rs = Nothing
        db.Close
        Set db = Nothing
     
    'rétablissement sablier
    Screen.MousePointer = 0
     
    Else
        MsgBox "pas d'enregistrements importés, pas de mise à jour"
    End If
     
    End Sub
    Toujours une question en suspens :

    Est il possible de masquer l'application "objAccess" (elle est mise au premier plan lors de l'ouverture ; j'aurais préféré que ma base en cours reste au premier plan et que BDDExterne n'apparaisse que dans la barre des tâches (voire pas du tout...)

    Merci à tlm

  8. #8
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour,

    Est il possible de masquer l'application "objAccess"
    A essayer !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunCommand acCmdAppMinimize
    Mais je ne sais pas à partir de quelle moment la commande est disponible...

    J'ai fait un test au début de la fonction qui "ouvre" une application, cela provoque une erreur. Cela fonctionne après l'ouverture d'un formulaire...

    Peut-être que cela fonctionne aussi si la fenêtre de base de données est visible. A tester...

    Et j'ai la base dans la barre des tâches, évidemment, puisque la commande revient à cliquer sur l'icône de la fenêtre.

    A voir si cela peut te servir.

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    ça marche merci
    ...et même avant d'ouvrir un formulaire...

    revoici le code (nettoyé des petites erreurs du précédent message)

    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
    74
    75
    Public Sub MajRF()
     
    'déclaration variables pour ouverture BDDExterne avec sécurité groupe de travail
    Dim objAccess, objShell
        Dim strPathToMDB
        Dim application
        Dim wkgp
        Dim User
        Dim Pwd
     
    'variables spécifiques recordset qui contient les enregistrements exportés
    Dim db As Database
    Dim rs As Recordset
    Dim strSQLrs As String
     
     
    If intLastUpdated > 0 Then 'variable égale au nb d'enregistrements exportés
     
    'sablier
    Screen.MousePointer = 11
     
    'Ouverture BDDExterne
        strPathToMDB = "C:\BDDExterne.mdb"
        application = "C:\Program Files\Microsoft Office\Office11\MSACCESS.EXE"
        User = "Moi"
        Pwd = "MonPWD"
        wkgp = "C:\MonMDW.mdw"
     
        Set objShell = CreateObject("WScript.Shell")
            objShell.Run Chr(34) & application & " " & Chr(34) & strPathToMDB & Chr(34) & " /nostartup /user " & User & _
          " /pwd " & Pwd & " /wrkgrp " & Chr(34) & wkgp & Chr(34)
     
        'pause 4 sec.
        Sleep 4000 'nécessite la déclaration de la fonction en entête de module
     
        Set objAccess = GetObject(strPathToMDB)
     
     
    'Ouverture Recordset
        strSQLrs = "SELECT tbl_1.Id, tbl_1.FK_Id " & _
                "FROM tbl_1;"
     
        Set db = CurrentDb
        Set rs = db.OpenRecordset(strSQLrs)
     
        'Parcours des enregistrements
        rs.MoveLast
        rs.Move -(intLastUpdated - 1)
     
        Do Until rs.EOF
            objAccess.DoCmd.RunCommand acCmdAppMinimize             
            objAccess.DoCmd.OpenForm "frm_deBDDExterne", , , "FK_Id =" & rs.Fields(1)
            objAccess.Run "MaFonctionDansBDDExterne", (rs.Fields(1))
            objAccess.DoCmd.Close acForm, "frm_deBDDExterne", acSaveNo
            rs.MoveNext
        Loop
     
    'fermeture instance BDDExterne
        objAccess.Quit
        Set objAccess = Nothing
        Set objShell = Nothing
     
        rs.Close
        Set rs = Nothing
        db.Close
        Set db = Nothing
     
    'rétablissement sablier
    Screen.MousePointer = 0
     
    Else
        MsgBox "pas d'enregistrements importés, pas de mise à jour"
    End If
     
    End Sub
    EDIT : Ah ouais mais quand l'application en arrière plan envoie une msgbox concernant le déroulement de la fonction, on a l'impression que c'est tout planté vu qu'elle ne se met pas au premier plan :/

    A+

    ibill

  10. #10
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Merci pour le retour

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut Ligne de commande d'Access: option /automation
    Bonjour,

    En guise de bonus à cette discussion, j'ai une information "exclusive" pour qui veut vraiment cacher une application Access, plus particulièrement dans le cadre d'un pilotage via l'automation (donc pas de MsgBox ou autres affichages bloquants).

    En plus des options déjà bien connues, la ligne de commande accepte l'option /automation ou encore -automation.
    L'effet de cette option est de totalement masquer l'application, qui n'apparaît pas non plus dans la barre des tâches.

    Ultime astuce:
    Si on veut reprendre le contrôle de l'affichage, il faut utiliser la propriété UserControl de l'objet Application.
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AppAcc.UserControl = True
    N.B. l'option -automation est normalement utilisée dans le cadre de COM mais rien ne nous interdit de l'utiliser.
    _

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    Merci JBO pour ce tip !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    objShell.Run Chr(34) & application & " " & Chr(34) & strPathToMDB & Chr(34) & " /automation /nostartup /user " & User & _
          " /pwd " & Pwd & " /wrkgrp " & Chr(34) & wkgp & Chr(34)
    AppAccess est bien masquée, mais les boîtes de dialogue apparaissent quand même, et pas toujours au premier plan, ce qui est gênant.
    En fait, ma boucle éxécute plusieurs fois la même fonction. Lors du parcours du recordset, seul l'avertissement pour le premier enregistrement apparait au premier plan. Pour la suite, si l'utilisateur n'entend pas le caractéristique Beep, il risque de croire que l'appli est plantée :/ pas terrible dans mon cas, j'hésite donc à laisser ce paramètre.

    Une parade ?

    IB

  13. #13
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,
    Citation Envoyé par ibill Voir le message
    Merci JBO pour ce tip !
    Vive la bidouille !

    Citation Envoyé par ibill Voir le message
    AppAccess est bien masquée, mais les boîtes de dialogue apparaissent quand même, et pas toujours au premier plan, ce qui est gênant.
    En fait, ma boucle éxécute plusieurs fois la même fonction. Lors du parcours du recordset, seul l'avertissement pour le premier enregistrement apparait au premier plan. Pour la suite, si l'utilisateur n'entend pas le caractéristique Beep, il risque de croire que l'appli est plantée :/ pas terrible dans mon cas, j'hésite donc à laisser ce paramètre.
    Je ne suis pas sûr de comprendre le but de ton pilotage automation.
    Veux-tu afficher quelque chose que l'utilisateur doit voir ?
    * un formulaire ?
    * une boîte de dialogue (appel à MsgBox ou InputBox) ?

    L'utilisateur doit-il valider quelque chose ? Un affichage parasite ou alors désiré (une confirmation) ?

    Ou bien fais-tu allusion aux messages d'avertissement d'Access ?

    Citation Envoyé par ibill Voir le message
    Une parade ?
    Si tu veux ouvrir un MsgBox ou un InputBox, il est possible de déléguer cette opération à l'objet Application de l'Access qui pilote ta BD externe.
    (possible mais pas ultra simple )

    Et puis, peut être pourrais-tu faire une seule procédure dans ta BD externe qui recevrait en paramètre le Recordset et se chargerait du reste ?
    Parce que, les aller-retour en boucle entre les 2 Access c'est plutôt lourd pour le Windows qui mouline en-dessous.
    _

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    Pour éclaircir...

    La BDD sur laquelle je travaille insère dans une autre des enregistrements issus de fichiers XML. Jusque là pas de problème, au moyen d'une table liée, les enregistrements sont insérés à leur place.

    J'ai peu de marge pour développer la BDD Externe qui est déjà un peu une usine à gaz. De plus, avec ma procédure, j'ai des performances tout à fait convenables.

    Là ou j'ai besoin de l'automation, c'est que l'import de nouveaux enregistrements nécessite une mise à jour des analyses les prenant en compte. Cette mise à jour se fait via une fonction dans la BDD externe, cette fonction appelle un certain nombre de requêtes, l'argument principal étant un N° d'identifiant (celui fourni alors par le recordset). C'est d'ailleurs pour ça que j'ouvre les formulaires dans AppAccess, car la fonction va chercher cet argument sur le formulaire.


    Le code suivant (les minimize sont en option, et je les enlèverai si je décide de masquer appAccess) provoque :
    - l'ouverture du form affaire
    - l'ouverture du form intervention (n interventions pour 1 affaire)
    - l'appel de la fonction de MAJTarification
    --> c'est cette fonction qui provoque l'affichage d'une boite de dialogue (purement informative quand tout se passe bien - c'est un vbOK -)
    - action sur une chkbox du formulaire pour signaler que l'analyse a été mise à jour...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    With objAccess
                .DoCmd.OpenForm "frm_Affaires", , , "dblAffaireId =" & rs.Fields(0)
                .DoCmd.Minimize
                .DoCmd.OpenForm "frm_Intervention", , , "dblAffaireId =" & rs.Fields(0)
                .DoCmd.Minimize
                .Run "fctMAJTarification", (rs.Fields(0))
                .Forms!frm_Intervention!Sfrm_InterventionDetail!chkModif = 0
                .DoCmd.Close acForm, "frm_Intervention", acSaveNo
                .DoCmd.Close acForm, "frm_Affaires", acSaveNo
            End With
    L'utilisateur doit-il valider quelque chose ? Un affichage parasite ou alors désiré (une confirmation) ?
    Oui c'est exactement ça.L'utilisateur n'a rien à faire, rien à voir dans la BDD Externe. Si ce n'est cliquer OK quand cette maudite boite apparait (et pas question de la supprimer :/)

    Mais bon si je n'ai pas de solution ce n'est pas dramatique. Le reste tourne bien et c'est déjà pas mal

    A+

    ibill

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

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Appel d'une fonction dans une iframe sur un autre domaine
    Par morikann dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/06/2007, 18h46
  5. Réponses: 8
    Dernier message: 10/01/2007, 21h10

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