Modérateur : Groupe des modérateurs
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.
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
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
Renaud Lancelot a écrit :Essayer de passer par des clauses UNION au lieu des IIF... Pas garanti.
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.
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))
Code : Tout sélectionner
Erreur dans as.vector(x, mode) : argument 'mode' incorrect
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))
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))
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))
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))
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."
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à)
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)
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."
Code : Tout sélectionner
Erreur dans sqlSave(channel, req, obs_eco_paca) : should be a data frame
Code : Tout sélectionner
obs<-sqlQuery(channel,req)
obs_df<-as.data.frame(obs)
sqlSave(channel,obs_df,obs_eco_paca)
Code : Tout sélectionner
Erreur dans sqlSave(channel, obs_df, obs_eco_paca) :
objet "obs_eco_paca" non trouvé
Retourner vers « Questions en cours »
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité