RODBC et requêtes sous Access 97

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Florian Sorin
Messages : 30
Enregistré le : 13 Mai 2008, 09:40

RODBC et requêtes sous Access 97

Messagepar Florian Sorin » 29 Mai 2008, 11:14

Bonjour,

J'ai quelques soucis pour exécuter des requêtes dans une base Access 97 à partir de R.

La base contient des fonctions en VBA que j'utilise dans des requêtes. Lorsque j'exécute ces requêtes via R en utilisant sqlQuery(), R m'annonce qu'il ne connait pas ces fonctions. Je ne sais pas trop comment ça marche, mais je pensais que R envoie seulement l'intitulé de la requête à Access, qui l'exécute et renvoie le résultat à R. ça ne devrait donc pas poser de problème que R ne connaisse pas les fonctions puisque c'est Access qui exécute la requête.

J'ai également un autre problème avec une requête qui fonctionne dans Access mais ne me renvoie pas le même résultat si je l'exécute via R. C'est une requête qui renvoie trois champs concaténés, même si certains de ces champs sont vides:

SELECT N_Localisation, Taxon1+' / '+IIf(IsNull(Taxon2),' ',Taxon2)+' / '+IIf(IsNull(Taxon3),' ',Taxon3) AS Assemblage FROM ...

sqlQuery me retourne seulement la concaténation des lignes où aucun des champs n'est nul.


La seule solution que j'ai trouvé à ces deux problèmes est d'exécuter les requêtes directement dans Access et de figer le résultat dans des tables. Ensuite il suffit de faire sqlQuery(channel,"Select * from table_resultat_requete") et j'obtiens ce que je veux.
Le problème de cette méthode c'est que si la base est mise à jour, avec ajout d'enregistrements dans les table d'origine, ces nouvelles données ne seront pas prises en compte par mon script R. A moins de refaire à chaque fois la manip dans Access pour exécuter les requêtes et figer les résultats qui seront récupérés par R, ce qui n'est pas très optimisé.

Y-a-t'il un moyen pour que ces requêtes soient exécutées directement par sqlQuery?

Merci d'avance

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Re: RODBC et requêtes sous Access 97

Messagepar Renaud Lancelot » 29 Mai 2008, 17:21

Florian Sorin a écrit :Bonjour,

J'ai quelques soucis pour exécuter des requêtes dans une base Access 97 à partir de R.

La base contient des fonctions en VBA que j'utilise dans des requêtes. Lorsque j'exécute ces requêtes via R en utilisant sqlQuery(), R m'annonce qu'il ne connait pas ces fonctions. Je ne sais pas trop comment ça marche, mais je pensais que R envoie seulement l'intitulé de la requête à Access, qui l'exécute et renvoie le résultat à R. ça ne devrait donc pas poser de problème que R ne connaisse pas les fonctions puisque c'est Access qui exécute la requête.


Si ça ne marche pas, je crains qu'il ne faille ré-écrire les fcts VBA en R.

J'ai également un autre problème avec une requête qui fonctionne dans Access mais ne me renvoie pas le même résultat si je l'exécute via R. C'est une requête qui renvoie trois champs concaténés, même si certains de ces champs sont vides:

SELECT N_Localisation, Taxon1+' / '+IIf(IsNull(Taxon2),' ',Taxon2)+' / '+IIf(IsNull(Taxon3),' ',Taxon3) AS Assemblage FROM ...

sqlQuery me retourne seulement la concaténation des lignes où aucun des champs n'est nul.


La seule solution que j'ai trouvé à ces deux problèmes est d'exécuter les requêtes directement dans Access et de figer le résultat dans des tables. Ensuite il suffit de faire sqlQuery(channel,"Select * from table_resultat_requete") et j'obtiens ce que je veux.
Le problème de cette méthode c'est que si la base est mise à jour, avec ajout d'enregistrements dans les table d'origine, ces nouvelles données ne seront pas prises en compte par mon script R. A moins de refaire à chaque fois la manip dans Access pour exécuter les requêtes et figer les résultats qui seront récupérés par R, ce qui n'est pas très optimisé.

Y-a-t'il un moyen pour que ces requêtes soient exécutées directement par sqlQuery?

Merci d'avance


Essayer de passer par des clauses UNION au lieu des IIF... Pas garanti.

Renaud

romain legrand
Messages : 13
Enregistré le : 25 Avr 2008, 09:19

Re: RODBC et requêtes sous Access 97

Messagepar romain legrand » 30 Mai 2008, 07:46

Florian Sorin a écrit :Bonjour,

La seule solution que j'ai trouvé à ces deux problèmes est d'exécuter les requêtes directement dans Access et de figer le résultat dans des tables. Ensuite il suffit de faire sqlQuery(channel,"Select * from table_resultat_requete") et j'obtiens ce que je veux.
Le problème de cette méthode c'est que si la base est mise à jour, avec ajout d'enregistrements dans les table d'origine, ces nouvelles données ne seront pas prises en compte par mon script R. A moins de refaire à chaque fois la manip dans Access pour exécuter les requêtes et figer les résultats qui seront récupérés par R, ce qui n'est pas très optimisé.

Y-a-t'il un moyen pour que ces requêtes soient exécutées directement par sqlQuery?

Merci d'avance


Salut,
si tu créer une vue au lieu d'une table, il me semble que les données sont mises à jour.

Florian Sorin
Messages : 30
Enregistré le : 13 Mai 2008, 09:40

Re: RODBC et requêtes sous Access 97

Messagepar Florian Sorin » 30 Mai 2008, 09:34

Merci pour vos réponses.

Renaud Lancelot a écrit :Essayer de passer par des clauses UNION au lieu des IIF... Pas garanti.


Je ne crois pas que le problème vienne de IIF, je l'utilise ailleurs (à défaut de Nz(), plus pratique mais qui n'est pas accepté par R) et ça fonctionne. Je pense que ça vient plutôt de la concaténation.


romain legrand a écrit :si tu créer une vue au lieu d'une table, il me semble que les données sont mises à jour.


Je crois que les vues n'existent pas sous Access, Jet SQL ne les supporte pas.


Quoi qu'il en soit le problème ne se pose plus (dans mon cas et pour ces deux exemples) car les analyses du résultat des requêtes n'ont pas été concluantes et ne seront pas réutilisées.
Cependant l'incompatibilité de certaines requêtes avec R me semble être un problème récurrent assez handicapant pour exploiter le contenu d'une base de données.

Florian Sorin
Messages : 30
Enregistré le : 13 Mai 2008, 09:40

Messagepar Florian Sorin » 03 Juin 2008, 15:04

J'ai de nouveau un problème de compatibilité d'une requête avec R.

La requête suivante fonctionne sous Access

Code : Tout sélectionner

donnees<-sqlQuery(channel,paste("select [Observations].[N° Localisation], [N° Taxon], [Nom Latin] from ([Observations] INNER JOIN [nb_obs sur sites] ON [Observations].[N° Localisation]=[nb_obs sur sites].[N° Localisation]) INNER JOIN [Liste des taxons] ON [Observations].[N° Taxon]=[Liste des taxons].[N° Taxon] WHERE nb_obs>=",seuil))


Mais sous R elle me renvoie le message suivant:

Code : Tout sélectionner

Erreur dans as.vector(x, mode) : argument 'mode' incorrect


En revanche, si on la simplifie, elle fonctionne:

Code : Tout sélectionner

donnees<-sqlQuery(channel,paste("select [Observations].[N° Localisation], [N° Taxon] from ([Observations] INNER JOIN [nb_obs sur sites] ON [Observations].[N° Localisation]=[nb_obs sur sites].[N° Localisation]) WHERE nb_obs>=",seuil))


J'ai simplement enlevé une des tables qui me servait à récupérer un champ de plus.

J'ai essayé diverses solutions et R renvoie un message d'erreur à chaque fois que je fais une requête qui porte sur plus de deux tables.

Est-ce normal?

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 04 Juin 2008, 06:48

Bonjour,

Je ne suis pas un pro du sql mais as tu peux essayé ceci :

Code : Tout sélectionner

donnees<-sqlQuery(select O.[N° Localisation], N.[N° Taxon], L.[Nom Latin] from [Observations] AS O INNER JOIN [nb_obs sur sites] AS N ON O.[N° Localisation]=N.[N° Localisation] INNER JOIN [Liste des taxons] AS L ON N.[N° Taxon]=L.[N° Taxon] WHERE N.nb_obs>=",seuil))


J'imagine que nb_obs se trouve dans la table nb_obs sur sites.

Maxime

Florian Sorin
Messages : 30
Enregistré le : 13 Mai 2008, 09:40

Messagepar Florian Sorin » 04 Juin 2008, 07:11

Merci pour votre réponse, j'ai testé votre version de la requête, mais j'obtiens toujours le même message d'erreur.
Je ne pense pas que ce soit une erreur de syntaxe, sinon R l'annoncerait explicitement au moment du parsing, alors que là le message s'affiche lors de l'exécution.


Est-ce que quelqu'un ici a déjà utilisé sous R une requête SQL portant sur plus de deux tables? (puisque le problème semble venir de là)

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 04 Juin 2008, 07:34

Re,

Apparemment il manquait juste des parenthèses :

Code : Tout sélectionner

donnees<-sqlQuery(select O.[N° Localisation], N.[N° Taxon], L.[Nom Latin] from ([Observations] AS O INNER JOIN [nb_obs sur sites] AS N ON O.[N° Localisation]=N.[N° Localisation]) INNER JOIN [Liste des taxons] AS L ON N.[N° Taxon]=L.[N° Taxon] WHERE N.nb_obs>=",seuil))


J'ai essayé avec une de mes bases de données et il n'y a pas de soucis pour faire des requêtes avec plusieurs jointures.

Maxime

Florian Sorin
Messages : 30
Enregistré le : 13 Mai 2008, 09:40

Messagepar Florian Sorin » 04 Juin 2008, 07:50

Toujours pareil pour moi. :?

(j'ai ajouté l'attribut channel et la fonction paste pour que la requête soit correcte, et l'attribut [N° Taxon] ne vient pas de la table N, mais de O)

Code : Tout sélectionner

donnees<-sqlQuery(channel, paste("select O.[N° Localisation], O.[N° Taxon], L.[Nom Latin] from ([Observations] AS O INNER JOIN [nb_obs sur sites] AS N ON O.[N° Localisation]=N.[N° Localisation]) INNER JOIN [Liste des taxons] AS L ON O.[N° Taxon]=L.[N° Taxon] WHERE N.nb_obs>=",seuil))




Si le problème ne vient ni de la requête puisqu'elle fonctionne sous Access, ni de la double jointure, je ne comprends pas pourquoi ça fonctionne en n'utilisant que deux tables dans la requête mais pas quand j'en ajoute une troisième.

Un problème de version de R peut-être? J'utilise la 2.4.1.

EDIT: je suis passé à la 2.7 pour tester, le message d'erreur est désormais:

Code : Tout sélectionner

[1] "[RODBC] ERROR: Could not SQLExecDirect"                                                                 
[2] "37000 -3102 [Microsoft][Pilote ODBC Microsoft Access] Fonction 'LireINI' non définie dans l'expression."

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 04 Juin 2008, 08:21

C'est une possibilité, il faudrait voir ce que les auteurs de la librairie RODBC ont modifiés depuis la version 2.4.1 de R. Je travaille avec la 2.6.2.

Maxime

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 04 Juin 2008, 16:17

Florian Sorin a écrit :Merci pour votre réponse, j'ai testé votre version de la requête, mais j'obtiens toujours le même message d'erreur.
Je ne pense pas que ce soit une erreur de syntaxe, sinon R l'annoncerait explicitement au moment du parsing, alors que là le message s'affiche lors de l'exécution.


Est-ce que quelqu'un ici a déjà utilisé sous R une requête SQL portant sur plus de deux tables? (puisque le problème semble venir de là)


Oui, souvent. Par expérience, il est prudent de décomposer les étapes et de construire la requête dans une chaine de caractères avant de l'incorporer dans la fct sqlQuery.

Exemple (non reproductible pour vous) d'un fragment de fonction que j'ai souvent utilisé, dans lequel db, type et test sont des arguments de la fct:

Code : Tout sélectionner

  can <- odbcConnectAccess(db)
  req <- paste(
          "SELECT L_SubUnit AS subunit, Mt_CODELIEU AS codelieu, Ci_NUMCONC AS numconc, ",
                 "La_Numani AS numani, La_Date AS sdate, La_Resultat AS res ",
            "FROM T_LABO, T_CONCANI, T_MOUVMENT, T_LIEU ",
            "WHERE Ci_NUMANI = La_Numani                 AND ",
                  "La_Date BETWEEN Ci_DATEE AND Ci_DATES AND ",
                  "Ci_NUMCONC = Mt_NUMCONC               AND ",
                  "Ci_DATEE BETWEEN Mt_DATA AND Mt_DATD  AND ",
                  "Mt_CODELIEU = L_CODELIEU              AND ",
                  "La_Type = '", type, "'                AND ",
                  "La_Test = '", test, "'", sep = "")
  lab <- sqlQuery(can, req, as.is = TRUE)


Renaud

Florian Sorin
Messages : 30
Enregistré le : 13 Mai 2008, 09:40

Messagepar Florian Sorin » 16 Juin 2008, 08:25

Bonjour,

je recycle cette discussion pour un autre problème du même type.

En voulant créer une table dans ma base via R (sqlQuery(channel, "SELECT * INTO nouvelle_table FROM ... ")), j'obtiens le message suivant:

Code : Tout sélectionner

"[RODBC] ERROR: Could not SQLExecDirect"                                                                                                                                           
"HY000 -20309 [Microsoft][Pilote ODBC Microsoft Access] Opération non prise en charge pour les bases de données réplicables qui n'ont pas été converties vers la version actuelle."


Je ne suis pas sûr de comprendre ce qui n'est pas en version actuelle. Je travaille sous Access 97, est-ce que je dois passer à Access 2007 pour que R fonctionne correctement? (ce qui expliquerait tous les problèmes cités ci-dessus)

Merci d'avance.

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 16 Juin 2008, 08:30

Re,

est-ce que tu as essayé de faire la même chose avec la fonction : sqlSave de RODBC ?

Maxime

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 16 Juin 2008, 08:52

Je pense que c'est la clause INTO qui pose pb. La supprimer et récupérer le tableau dans R, ou utiliser sqlSave comme suggéré par Maxime.

Renaud

Florian Sorin
Messages : 30
Enregistré le : 13 Mai 2008, 09:40

Messagepar Florian Sorin » 16 Juin 2008, 08:57

Merci pour votre réponse, je viens de tester.

Je ne sais pas trop comment fonctionne sqlSave, je l'ai utilisé de cette façon: sqlSave(channel, requête, nom de la nouvelle table), le message retourné est maintenant:

Code : Tout sélectionner

Erreur dans sqlSave(channel, req, obs_eco_paca) : should be a data frame


Le passage par une dataframe ne va-t-il pas engendre une perte d'informations, notamment au niveau des noms et types de champs qui risquent d'être modifiés?

Quoi qu'il en soit, j'ai récupéré le contenu de ma requête et l'ai transformé en dataframe.

Code : Tout sélectionner

obs<-sqlQuery(channel,req)

obs_df<-as.data.frame(obs)

sqlSave(channel,obs_df,obs_eco_paca)


Le message est désormais

Code : Tout sélectionner

Erreur dans sqlSave(channel, obs_df, obs_eco_paca) :
  objet "obs_eco_paca" non trouvé


Je dois donc créer une table vide obs_eco_paca pour ensuite la remplir avec sqlSave?
Le problème pour créer la table risque alors d'être le même qu'au départ, "opération non prise en charge ..."


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité