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

Runtime Discussion :

Runtime n'arrive pas à exécuter une requête ajout (base lecture seule) et à lancer le gest. de tables liées [AC-2013]


Sujet :

Runtime

  1. #1
    Membre à l'essai
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Juin 2015
    Messages : 17
    Points : 12
    Points
    12
    Par défaut Runtime n'arrive pas à exécuter une requête ajout (base lecture seule) et à lancer le gest. de tables liées
    Bonjour,

    Synthèse de mon problème : un programme access qui fonctionne parfaitement bien dans mon environnement de développement ne fonctionne pas complètement dans mon environnement runtime.
    J’ai 2 messages d’erreur suite à l’appel d’une de mes macro :
    • L’assistant demandé n’est pas installé ou est en mauvais état. Installez ou réinstallez Assistant. Si vous n’êtes pas autorisé à effectuer cette opération sur cet ordinateur, contactez le service d’assistance.
    • Mise à jour impossible. La base de données ou l’objet est en lecture seule.

    Contexte :
    Environnement de développement :
    • Machine virtuelle sous Windows 8.1
    • Access 2013 (32 bit)
    Environnement de déploiement :
    • ordi « support » de la machine virtuelle, sous W7 64 bit
    • runtime 2013
    • MS Office 2010 (mais sans access de ce que je vois)

    Détail du problème :
    • Dans ma VM, avec access 2013, tout fonctionne parfaitement bien
    • Dans ma VM, en renommant le fichier en accdr, tout fonctionne parfaitement bien
    • Dans mon ordi, avec la runtime :
    o La base se « lance » (j’ai bien le formulaire de démarrage)
    o Je peux effectuer les requêtes de sélection sans problème
    o J’obtiens les 2 messages cités ci-dessus lorsque je lance une de mes macros
    Que fait ma macro ?
    • Appel au gestionnaire de table liée via l’action « commande » / « GestionnaireTablesLiées » : c’est d’après mon analyse à ce moment qu’apparait le premier message « L’assistant demandé n’est pas installé ou est en mauvais état. Installez ou réinstallez Assistant. Si vous n’êtes pas autorisé à effectuer cette opération sur cet ordinateur, contactez le service d’assistance. »
    • Suppression du contenu de plusieurs tables => cette partie fonctionne bien
    • Ajout de données dans les tables où j’ai supprimé les données avant : apparition du 2ème message d’erreur « Mise à jour impossible. La base de données ou l’objet est en lecture seule. »

    Solutions essayées :
    • Pour le 1er pb, avec le gestionnaire de tables liées, j’avoue n’avoir rien essayé… Je ne sais pas par quoi commencer, je suis preneur de votre expérience
    • Pour l’autre problèmes, j’ai essayé de modifier les droits du répertoire => rien à faire. J’ai donné les droits en « contrôle » total aux utilisateurs présent dans la liste, et j’ai ajouter l’utilisateur « tout le monde », à qui j’ai également mis les droits => aucun changement.
    • J’ai déclaré le répertoire en environnement « fiable » via la clé de registre => le message d’alerte du début disparait, mais toujours les messages d’erreur derrière
    • J’ai tenté un « décompactage », j’ai lu quelque part que ça résolvait le pb pour certains => aucune amélioration
    Voilà, je sèche un peu là…

    Auriez-vous des idées ?

    Cordialement,

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Bonjour,

    Le runtime n'est pas prévu pour utiliser les assistants.

    Tu dois développer toi même un gestionnaire d'attache, il existe un tuto :
    http://jdgayot.developpez.com/tutori...cess/liaisons/

    Mais il y a d'autres approches possibles tout dépends du nombre de base à attacher.

    cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  3. #3
    Membre à l'essai
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Juin 2015
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par loufab Voir le message
    Bonjour,

    Le runtime n'est pas prévu pour utiliser les assistants.

    Tu dois développer toi même un gestionnaire d'attache, il existe un tuto :
    http://jdgayot.developpez.com/tutori...cess/liaisons/

    Mais il y a d'autres approches possibles tout dépends du nombre de base à attacher.

    cordialement,
    Merci beaucoup pour ton retour loufab.
    Je me suis un peu mal exprimé : en fait, j'utilise le gestionnaire de table lié pour faire des liaisons avec du excel. Je vois (mais j'ai survolé très rapidement) que le tuto est plus adapté à des liaisons avec des tables. Est-ce que le même principe est adaptable pour du excel, ou y a t il des possibilités plus simples ?
    Je pensais par exemple : est-il envisageable de déclarer une source excel comme source ODBC et du coup requêter cet excel pour mettre à jour ma table access ? Mais dans ce cas, ODBC est-il bien intégré dans la runtime ? (si on installe le driver qui va bien) ?

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Bonjour,

    Oui c'est la même chose. Une attache reste une attache qu'elle soit ODBC, Excel, DBF ou ACCESS.

    Seule la propriété Connect varie suivant la source, lors de la création du lien .

    Ce site est la référence en terme de chaines de connexion :

    http://www.connectionstrings.com/
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  5. #5
    Membre à l'essai
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Juin 2015
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Merci encore loufab.

    Je vais prendre un peu de temps pour digérer tout ça (je suis débutant, il y a beaucoup de contenu à analyser dans ce que tu m'as envoyé).
    Je reviens vers vous dès que j'aurais pu avancer

  6. #6
    Membre à l'essai
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Juin 2015
    Messages : 17
    Points : 12
    Points
    12
    Par défaut ça marche ... presque
    Bonjour à tous,

    Après moults essais, échecs, lectures, j'avance petit à petit, mais je ne suis pas encore tout à fait au bout.

    Voici mon problème :
    J'essaye de configurer une connexion entre une table local que je crée, et une table dans une application cliente.
    Si j'essaye d'exécuter mon code (que je mets ci-dessous), j'ai une erreur 3151.
    Si par contre je me connecte à la même source, mais via une configuration DSN configuré par ailleur, pour mettre à jour une autre table, puis que j'exécute à nouveau ce même code, ça fonctionne.

    Comment est-ce possible ? Pourquoi un code DSN-less fonctionne t il uniquement si j'ai auparavant utilisé une connexion DSN ?
    J'ai une hypothèse peut être tirée par les cheveux : cela pourrait-il être un pb 32b / 64b ? Et du coup, le fait de connecter via le fichier DSN forcerait à se mettre en 32b, ce qui ferait fonctionner mon code ?
    Si c'était le cas, y a t il une solution pour forcer l'utilisation en 32bit ? (mais je fais peut être fausse route).

    Sinon, je vois des infos sur ADO, mais je n'ai pas bien compris ce que c'était : est-ce que ça pourrait résoudre mon pb ?

    Bref, je suis preneur de toutes vos suggestions.

    Ci-dessous mon code qui fonctionne ... parfois...

    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
    Function AttachDSNLessTable()
        Dim db As ADODB.Data Database
        Dim td As TableDef
     
        Set db = CurrentDb
     
        Rem create link to groups def
     
        For Each td In CurrentDb.TableDefs
            If td.Name = "Tbl_LinkedTable1" Then
                CurrentDb.TableDefs.Delete "Tbl_LinkedTable1"
            End If
        Next
     
        Set tdf = db.CreateTableDef("Tbl_LinkedTable1")
        tdf.Connect = "ODBC;DRIVER={Microsoft ODBC for Oracle};SERVER=leserveur;Persist Security Info=True;UID=le uid;PWD=lepwd"
        tdf.SourceTableName = "latableSource"
        db.TableDefs.Append tdf
        db.Close
        Set db = Nothing
    End Function

  7. #7
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Bonjour,

    Il y a un truc qui me chiffonne. Dans ta demande initiale tu parles de liaison sur un fichier Excel :

    j'utilise le gestionnaire de table lié pour faire des liaisons avec du excel.
    Et dans ton code tu fais des liaison DNS sur de l'Oracle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tdf.Connect = "ODBC;DRIVER={Microsoft ODBC for Oracle};SERVER=leserveur;Persist Security Info=True;UID=le uid;PWD=lepwd"
    Peux-tu clarifier ça avant qu'on continue ?

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  8. #8
    Membre à l'essai
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Juin 2015
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par loufab Voir le message
    Bonjour,

    Il y a un truc qui me chiffonne. Dans ta demande initiale tu parles de liaison sur un fichier Excel :



    Et dans ton code tu fais des liaison DNS sur de l'Oracle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tdf.Connect = "ODBC;DRIVER={Microsoft ODBC for Oracle};SERVER=leserveur;Persist Security Info=True;UID=le uid;PWD=lepwd"
    Peux-tu clarifier ça avant qu'on continue ?

    Cordialement,
    Je travaille sur 2 applications différentes.
    Une travaille sur une base excel. L'autre sur un lien ODBC vers une base d'une application cliente.

    Je comprends que ça puisse être confusant, désolé. Souhaites-tu que je fasse plusieurs posts séparés pour bien identifier les problèmes ?

  9. #9
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Non pas la peine.

    ADO permet de manipuler les données dans un SGBD avec ou sans attache.
    Il y a un règle importante avec les SGBD externes comme Oracle ou SQL Server, pour qu'on puisse faire des requêtes actions (insert, update, delete) sur une table, celle-ci doit obligatoirement avoir un champ ID (numéro unique autoincrémental).

    Voici un tuto où tu as toutes les techniques de connexion ODBC (notamment Oracle) avec le code pour chaque techno et l'explication en détails :

    http://ledzeppii.developpez.com/odbc-access/

    Pour Excel j'utilise ce type de code pour lier des feuilles :

    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
    Function fImporterFeuilleExcel(strTable As String, strFichierXls As String, strNomFeuille As String)
    '---------------------------------------------------------------------------------------
    ' Procedure : fLinkExcelFile
    ' Author    : Fabrice CONSTANS (MVP)
    ' Date      : 23/11/2013
    ' Purpose   : IMPORTE les données depuis une feuille d'un fichier excel dans un tables
    '                existante
    ' Parameters: strTable = table ACCESS de destination
    '             strFichierXls = le nom du fichier Excel
    '             strNomFeuille = le nom de la feuille excel et son range
    '                             Nomfeuille!X:Y
    ' Return    : Variant
    '---------------------------------------------------------------------------------------
    '
    DoEvents
    DoCmd.TransferSpreadsheet transfertype:=acLink, SpreadsheetType:=acSpreadsheetTypeExcel12Xml, _
                              TableName:=strTable, FileName:=strFichierXls, _
                              HasFieldNames:=True, Range:=strNomFeuille
    DoEvents
     
    End Function
    L'appel se fait comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fImporterFeuilleExcel strTableDestination, strCheminEtNomFichierXls, strNomFeuille & "!A:J"
    Linke les colonnes de A à J.

    Ensuite tu as 2 techniques pour rafraichir le lien. Soit tu manipule la partie Database du connect, donc le chemin uniquement.
    Dans ce cas ne pas oublier le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    currentdb.TableDefs(tbl.Name).RefreshLink
    Soit tu supprimes le lien et tu le recrée et là il faut un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    currentdb.TableDefs.Refresh

    Il y a un bon exercice qui permet de voir les chaines connect, c'est, d'une part faire un attachement classique via le menu puis sous VBE dans la fenêtre d'exécution taper l'instruction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? currentdb.tabledefs("nom de la table").connect
    ça peut t'aider à voir les différences entre une connexion ou une autre.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  10. #10
    Membre à l'essai
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Juin 2015
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Rebonjour à tous.

    Tous mes problèmes sont résolus (jusqu'à attendre d'en avoir de nouveaux).

    Vu comment j'ai galéré, malgré les aides fournies dans le présent forum, je vais essayer de faire un petit récapitulatif.

    Problème de gestionnaire de table liées => je n'ai pas creusé le problème, mais le lien de Loufab me parait répondre parfaitement au problème. Je passe donc rapidement sur ce point.

    Problème d'insertion dans des tables locales => je ne sais pas précisément pourquoi je n'ai plus de problème, mais je pense que la principale raison est que j'ai maintenant systématiquement un index dans les tables que je souhaite manipuler (merci Loufab encore).

    Problème d'accès à la table distante odbc (des fois ça fonctionne, des fois pas, et surtout de manière incompréhensible ça ne fonctionnait que si je passais au préalable par une connexion dsn) => j'ai résolu le problème en supprimant totalement les connexions odbc, au profit des connexions ADO. Plus propre, plus rapide, plus stable, que demande le peuple ?

    Pour ce faire, je fais ma connexion de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cnSrc.Open "Provider=OraOLEDB.Oracle.1;Data Source=datasrce;User Id=userid;Password=pwd"
    Il faut au préalable télécharger le composant ODAC d'oracle, qui se trouve facilement et qui s'installe beaucoup plus facilement que les drivers odbc.

    Pour les copies vers mes tables locales, contrairement à avant où je faisais un append, j'ai dû faire les copies via du code. Ci-dessous un extrait pour voir les principes :
    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
        '
        ' Ajout des paramètres dans mon objet command et préparation de la requête
        ' permettant de mettre à jour ma table locale
        '
        For Each Fld In rs.Fields
            If FldList <> "" Then FldList = FldList + "," 'Je liste l'ensemble des champs
            FldList = FldList + "[" & Fld.Name & "]"
     
            If ParmList <> "" Then ParmList = ParmList + "," 'Je met un ? par paramètre qui seront précisés plus tard
            ParmList = ParmList + "?"
     
            If Fld.Type = adVarNumeric Then           'Je gère un cas particulier de type qui n'est pas géré par mon driver
                intTypeFieldCompatible = adDouble
            Else
                intTypeFieldCompatible = Fld.Type
            End If
     
            Cmd.Parameters.Append Cmd.CreateParameter(Fld.Name, intTypeFieldCompatible, adParamInput, Fld.DefinedSize) 'J'ajoute mes paramètres dans mon objet command
        Next
     
        'Insertion des données dans la table locale
        Cmd.CommandText = "INSERT INTO " & strTableLocale & "(" & FldList & ") VALUES (" & ParmList & ")"
        Cmd.Prepared = True
     
        Do While Not rs.EOF
            For Each Fld In rs.Fields
                Cmd.Parameters(Fld.Name).Value = Fld.Value
            Next
            Cmd.Execute
            rs.MoveNext
        Loop
    Nota : je ne mets qu'une partie du code permettant de comprendre la logique si d'autres personnes rencontrent les mêmes problèmes que moi, je laisse les modérateurs me dire s'il faut que je mette plus, avec les déclarations de variables etc.

    J'ai eu des problèmes d'exécution lorsque je suis passé sur un poste différent de mon poste développeur. Je ne sais pas au final ce qui a résolu, mais j'ai appliqué 2 principes :
    • bye bye early binding, bonjour late binding (je laisse faire la recherche si besoin, mais merci encore loufab pour ton blog ;-) )
    • Utilisation de l'outil de déploiement de maître Argyronet (respect éternel à ce Monsieur que je ne connais pas ;-) )

    Nota : http://www.developpez.net/forums/d14...me-32-64-bits/

    Voilà, tout cela doit sembler évident aux vétérans, mais vu le temps que ça m'a pris, je laisse une compilation des solutions trouvées pour les personnes rencontrant des cas similaires qui passeraient par là.

    A bientôt pour de nouveaux problèmes à résoude :-)

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

Discussions similaires

  1. [AJAX] je n'arrive pas à voir une exécution ajax
    Par thouraya24 dans le forum AJAX
    Réponses: 10
    Dernier message: 25/11/2012, 22h37
  2. Réponses: 4
    Dernier message: 10/04/2012, 19h09
  3. slider images, je n'arrive pas à intégrer une requête SQL
    Par budiartaaa dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 27/12/2010, 21h50
  4. j'arrive pas à excuter une requete.
    Par abdelkaderg54 dans le forum Débuter
    Réponses: 3
    Dernier message: 04/07/2007, 16h24
  5. [Système][Runtime]J'arrive pas à lancer une appli externe !?!
    Par polnioumane dans le forum Général Java
    Réponses: 6
    Dernier message: 16/11/2005, 18h55

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