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

Python Discussion :

Ouvrir une BDD ACCESS en Lecture-Ecriture en Python [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Par défaut Ouvrir une BDD ACCESS en Lecture-Ecriture en Python
    Bonjour a tous,

    J'ai réalisé ce script en Python qui permets de lancer une macro de mise a jour des données sous Access.
    Mon script lance la macro contenu dans la BDD Access.

    Le problème c'est que la BDD Access est ouverte par défaut en lecture seule, j'obtiens une erreur lors de la MAJ :
    "Erreur d'exécution 3027, Mise a jour impossible, la base de données ou l'objet est en lecture seule."

    Au début, je pensais que cela provenais des droits d'accès au répertoire, mais je copie la BDD ACCESS sur mon local pour la MAJ, ca ne peut provenir d'un problème de droits pour moi ...
    Je dirais que le souci proviens de cette ligne au moment de l'ouverture de la base de données, cette ligne ouvre la BDD Access en mode "lecture seule" et il faudrait pouvoir l'ouvrir en "lecture-écriture" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    access.OpenCurrentDatabase(chemin_destination + nom_bdd_access, False)
    Fonction de lancement Macro BDD ACCESS :
    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
    # Fonction de lancement de Macro Access depuis une BDD Access
    def lancer_macro_bdd_access(chemin_bdd_access, nom_bdd_access, nom_macro_access, chemin_destination):
        print(f'Ouverture {nom_bdd_access} pour l execution de la macro {nom_macro_access}.')
        access = comDispatch("Access.Application")
        access.application.visible = False
        if chemin_destination:
            shutil.copyfile(chemin_bdd_access + nom_bdd_access, chemin_destination + nom_bdd_access)
            access.UserControl = True
            os.chmod(chemin_destination + nom_bdd_access, S_IWRITE)
            access.OpenCurrentDatabase(chemin_destination + nom_bdd_access, False)
            access.DoCmd.RunMacro(nom_macro_access)
            access.DoCmd.CloseDatabase()
            access.Application.Quit()
            shutil.copyfile(chemin_destination + nom_bdd_access, chemin_bdd_access + nom_bdd_access)
        else:
            access.UserControl = True
            #os.chmod(chemin_bdd_access + nom_bdd_access, S_IRWXO)
            access.OpenCurrentDatabase(chemin_bdd_access + nom_bdd_access, False)
            access.DoCmd.RunMacro(nom_macro_access)
            access.DoCmd.CloseDatabase()
            access.Application.Quit()
        print(f'La macro {nom_macro_access} de la BDD Access {nom_bdd_access} a été lancé correctement.')
        time.sleep(10)
    Merci de votre aide.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Ghost0000 Voir le message
    Je dirais que le souci proviens de cette ligne au moment de l'ouverture de la base de données, cette ligne ouvre la BDD Access en mode "lecture seule" et il faudrait pouvoir l'ouvrir en "lecture-écriture" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    access.OpenCurrentDatabase(chemin_destination + nom_bdd_access, False)
    C'est pas mal d'avoir au-moins cherché et investigué. Le petit plus aurait été que tu nous dises quelle librairie tu as utilisé (librairie "access"?)

    Maintenant l'étape suivante serait d'aller voir la doc de cette librairie voir ce qui se dit à propos de access.OpenCurrentDatabase() (n'y a-t-il pas une option spéciale?). Il est même possible qu'il y ait un exemple minimaliste complet.
    En tout cas, sur le net on trouve divers détails sur cette fonction
    https://stackoverflow.com/questions/...through-python
    https://programmingalpacas.com/pytho...s-using-python
    https://docs.microsoft.com/fr-fr/off...urrentdatabase
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Citation Envoyé par Ghost0000 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    access.OpenCurrentDatabase(chemin_destination + nom_bdd_access, False)
    https://docs.microsoft.com/fr-fr/off...urrentdatabase

    Le 3ème argument fourni à OpenCurrentDatabase est un booléen qui indique que l'accès sera en lecture seule (si False) ou en mode partagé (si True).


    As-tu essayé de mettre True sur ta copie locale de la bdd ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    access.OpenCurrentDatabase(chemin_destination + nom_bdd_access, True)

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Par défaut
    Voici la librairie utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from win32com.client import Dispatch as comDispatch
    J'ai essayé de mettre "True" a l'argument à la place de False, c'est le même problème... il m'indique que la BDD ACCESS est ouverte en lecture seule :
    Nom : erreur.png
Affichages : 131
Taille : 11,8 Ko

    Par contre, j'ai essayé avec ce code, ma BDD est ouverte en mode Lecture-Ecriture, mais je ne peux pas exécuter la macro à l'intérieur de la BDD ACCESS :
    Quand j'utilise ce code, c'est comme si je double clic en ouvrant directement la BDD ACCESS, par contre pas moyen de lancer de macro, car je ne contrôle pas l'objet "Access" en Python
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.popen(chemin_destination + nom_bdd_access)
    PS: J'ai également essayé de changer le répertoire de la BDD (afin de vérifier si y'avait un problème de droits d'écriture/lecture), ça ne vient pas de la...
    C'est vraiment la ligne "access.OpenCurrentDatabase(chemin_destination + nom_bdd_access, True)" qui ne prends pas en compte la condition "True" ?

    "La base de données ou l'objet est en lecture seule" ==> dans ce cas précis, c'est l'objet, car j'arrive a ouvrir la BDD en lecture/ecriture sans souci avec le code plus haut, comment arrivé a set l'objet en lecture/ecriture ?

    Si vous avez une idée je suis preneur

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Par défaut
    Il y a une autre solution

    Utilisé la ligne de commande CMD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import os
    os.popen(f'START "" /MAX "C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" "{chemin_bdd_access + nom_bdd_access}" /x {nom_macro_access}')
    Par contre quand j'essaie dans CMD, c'est pareil, ça m'ouvre la BDD ACCESS en lecture seule ? Comment ouvrir cette BDD ACCESS en lecture-écriture et lancer la macro ?

    J'ai regardé toutes les options disponibles ici :
    https://loufab.developpez.com/tutori...lignecommande/
    http://infoprat.fr/astuces/office/as...access_001.php

    Si vous avez une idée pour m'aider SVP

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Par défaut
    En fait j'ai trouvé une solution qui fonctionne en 3 étapes :

    1- Copier la BDD sur un dossier local (afin de pouvoir avoir les droits de modifications), chez moi la BDD est stocké sur un disque réseau.
    2- Lancer le script CMD en python pour mettre a jour la BDD en mode Exclusif (attention toutefois au popup de fin d'execution)
    3- Ecraser l'ancienne BDD du disque réseau par la nouvelle (qui a été mise a jour)

    Voici le code des 3 Etapes :
    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
     
    import shutil
    import os
     
    # Etape 1
    # Copier la BDD ACCESS dans le dossier local
    shutil.copyfile(chemin_reseau_bdd_access + nom_bdd_access, chemin_local + nom_bdd_access)
     
    # Etape 2
    # MAJ de la BDD ACCESS dans le dossier local
    os.popen(f'START "" /MAX "C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" "{chemin_local + nom_bdd_access}" /Excl /x {nom_macro_access}')
     
    # Etape 3
    # On Ecrase la old par la new
    shutil.copyfile(chemin_local + nom_bdd_access, chemin_reseau_bdd_access + nom_bdd_access)

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Par défaut
    En fait, le chemin d'accès avec les "\" du bon coté ont une influence sur le script CMD

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ghost0000 Voir le message
    Citation Envoyé par Ghost0000 Voir le message
    Au début, je pensais que cela provenais des droits d'accès au répertoire, mais je copie la BDD ACCESS sur mon local pour la MAJ
    1- Copier la BDD sur un dossier local (afin de pouvoir avoir les droits de modifications),
    Je ne comprends pas, tu avais dit que ça ne fonctionnait pas ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. [AC-2007] ouvrir une pièce jointe contenu dans une bdd Access
    Par kek's dans le forum Access
    Réponses: 10
    Dernier message: 10/05/2012, 17h23
  2. Ecriture dans une BDD access via Excel
    Par kpitaine dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 03/08/2009, 12h50
  3. ouvrir une bdd access reseau depuis une autre
    Par docjo dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/12/2007, 15h03
  4. [VBA-E]Ouvrir une BDD access sous Excel
    Par toniox dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 02/05/2006, 16h45
  5. API pour ouvrir une BD Access
    Par GofAcid dans le forum Access
    Réponses: 2
    Dernier message: 15/12/2004, 19h25

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