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

Développement Windows Discussion :

Automation d'Access par ligne de commande


Sujet :

Développement Windows

  1. #1
    Membre habitué
    Homme Profil pro
    consultant environnement et développement d'applications de base de données
    Inscrit en
    Janvier 2006
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : consultant environnement et développement d'applications de base de données
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2006
    Messages : 335
    Points : 166
    Points
    166
    Par défaut Automation d'Access par ligne de commande
    Bonjourr

    Je ne suis pas du tout spécialiste de vb.net et cela va peut être se voir dans ma question suivante...
    Je crée un exécutable qui me permets de piloter une base ACCESS par le passage de ligne de commande (je ne peux pas le faire directement sous ACCESS en vba car une ligne de commande ne marche que quand on lance le programme...s'il est déjà lancé, cela ne marche plus...)
    J'ai fait le petit programme ci-dessous qui me lance bien access et le formulaire voulu mas comment puis-je faire pour détecter quand ma base access est déjà ouverte, ne pas la réouvrir et directement la pilotée pour ouvrir le formulaire voulu (en gros remplacer le OpenCurrentDatabase par un "utiliserlabasedéjàouverte"...
    Voilà 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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
            Dim oAccess As Access.Application
            Dim user As String = args(1)
            Dim fiche As String = args(2)
            Dim filtre As String = args(3)
            Dim hwnd As Long = args(4)
     
            'masque le formulaire
            Me.Visible = False
     
            ' Démarre une nouvelle instance d'Access pour l'automatisation :
            oAccess = New Access.Application
     
            ' Ouvre le CRM si pas déjà ouvert
         oAccess.OpenCurrentDatabase(filepath:="D:\GENESYS\CRM_genesys.mdb", Exclusive:=False)
            'lancer la fonction qui mets le login
            oAccess.Run("ValiderLogin", user, "")
            'ouvre le formulaire
            oAccess.DoCmd.OpenForm(fiche, Access.AcFormView.acNormal, , filtre)
            oAccess.DoCmd.Maximize()
            If Not oAccess.UserControl Then oAccess.UserControl = True
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oAccess)
            oAccess = Nothing
            'ferme le lanceur
            Close()
    Merci de votre aide

    Guen

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    On doit pouvoir lancer une macro Access/VBA depuis C# : http://support.microsoft.com/kb/306683

    La doc pour l'ouverture ici : http://support.microsoft.com/kb/317114
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre habitué
    Homme Profil pro
    consultant environnement et développement d'applications de base de données
    Inscrit en
    Janvier 2006
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : consultant environnement et développement d'applications de base de données
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2006
    Messages : 335
    Points : 166
    Points
    166
    Par défaut
    Bonjour et merci de vous intéresser à on souci.
    je n'ai pas de souci pour ouvrir ACCESS et charge un formulaire ou une macro (j'ai d'ailleurs utilsier le lien microsoft que tu proposai mais en VB.net).
    Non, mon souci est de ne pas réouvrir mon application ACCESS lorsque je l'ai déjà ouverte une fois...il faut donc que je teste si elle est ouverte et, si oui, que j'en prenne le contrôle (je déclare un objet application.access qui pointe sur cette appli je suppose...)
    merci

  4. #4
    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 : 63
    Localisation : Suisse

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

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

    Citation Envoyé par guen Voir le message
    (je ne peux pas le faire directement sous ACCESS en vba car une ligne de commande ne marche que quand on lance le programme...s'il est déjà lancé, cela ne marche plus...)
    Une solution éventuellement dans la FAQ Access (en VBA donc) : Eviter le lancement de deux instances d'une base

    En espérant que cela puisse t'aider.

    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

  5. #5
    Membre habitué
    Homme Profil pro
    consultant environnement et développement d'applications de base de données
    Inscrit en
    Janvier 2006
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : consultant environnement et développement d'applications de base de données
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2006
    Messages : 335
    Points : 166
    Points
    166
    Par défaut
    Merci Domi
    mais justement je ne peux pas passer par access car je ne peux piloter mon appli access depuis mon autre logiciel (gestion par affraire GENESYS) que par l'appel d'un exe ou mdb avec une ligne de commande. le problème d'une ligne de commande, c'est que si access est déjà ouvert, il ne prends plus la ligne de commande (sauf erreur de ma part), cela ne marche qu'à l'ouverture d'access... et encore seulement si une autre base access n'est pas ouverte, d'où l'idée de passer par un lanceur intermédiaire que je fais en .net avec visual studio.
    merci de votre aide

  6. #6
    Membre habitué
    Homme Profil pro
    consultant environnement et développement d'applications de base de données
    Inscrit en
    Janvier 2006
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : consultant environnement et développement d'applications de base de données
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2006
    Messages : 335
    Points : 166
    Points
    166
    Par défaut
    Bonjour

    Bon, comme j'ai trouvé, je poste la réponse...ça pourra peut être servir à qq d'autre. J'utilise donc bien setobject() qui ouvre ma base access si elle n'est pas ouverte et en prend le contrôle si elle est ouverte.
    Voici l'intégralité de mon code d'automation d'access par passage de ligne de commande à un fichier exe :

    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
    Imports Microsoft.Office.Interop
    Imports System
    Imports System.Runtime.InteropServices
     
    Public Class Form2
        'passez les arguments dans l'ordre avec un espace entre eux
        '1=handle de la fenêtre genesys
        '2=numero de user
        '3=type d'objet à ouvrir (form, etat, req)
        '4=nom de l'objet
        '5=filtre (si pas de filtre, mettre "")
     
        Dim args As String() = Environment.GetCommandLineArgs()
     
        <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
        Private Shared Function SetForegroundWindow(ByVal hWnd As IntPtr) As Long
        End Function
     
        <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
        Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
        End Function
     
        Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Dim oAccess As Access.Application
            Dim hwnd As Long = CLng(args(1))
            Dim user As String = args(2)
            Dim objet As String = args(3)
            Dim fiche As String = args(4)
            Dim filtre As String = args(5)
     
            'masque le formulaire
            Me.Visible = False
     
            ' Démarre une nouvelle instance d'Access pour l'automatisation :
            oAccess = New Access.Application
     
            ' Ouvre le CRM si pas déjà ouvert
            oAccess = GetObject("D:\GENESYS\CRM_genesys.mdb")
            'lancer la fonction qui mets le login
            oAccess.Run("ValiderLogin", user, "")
            'enregistre le handle de GENESYS
            oAccess.Run("Sauve_HandleGENESYS", hwnd)
            'lance l'objet en fonction de sa nature
            Select Case objet
                Case "form" 'formulaire
                    oAccess.DoCmd.OpenForm(fiche, Access.AcFormView.acNormal, , filtre)
                Case "req" 'requête
                    oAccess.DoCmd.OpenQuery(fiche, Access.AcView.acViewNormal, Access.AcOpenDataMode.acEdit)
                Case "etat" 'etat
                    oAccess.DoCmd.OpenReport(fiche, Access.AcView.acViewNormal, , filtre, Access.AcWindowMode.acWindowNormal)
                Case Else 'ne lance rien
            End Select
     
            oAccess.DoCmd.Maximize()
     
            'affiche le crm
            SetForegroundWindow(oAccess.hWndAccessApp)
     
            If Not oAccess.UserControl Then oAccess.UserControl = True
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oAccess)
            oAccess = Nothing
            'ferme le lanceur
            Close()
        End Sub
     
    End Class

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

Discussions similaires

  1. Lancer un prog par ligne de commande
    Par eyquem dans le forum Général Python
    Réponses: 5
    Dernier message: 31/01/2007, 14h36
  2. Runtime Access avec ligne de commande
    Par vincent rigoulot dans le forum Runtime
    Réponses: 1
    Dernier message: 28/09/2006, 10h28
  3. ouvrir navigateur par ligne de commande
    Par sr_rs dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 01/08/2006, 19h33
  4. Compilation par ligne de commande
    Par Dupont Lionel dans le forum MFC
    Réponses: 2
    Dernier message: 21/10/2005, 14h29
  5. Réponses: 6
    Dernier message: 19/10/2005, 13h10

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