Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Suppression table externe ODBC suite

21 réponses
Avatar
FFO
Rappel :

l'échéance de Macros la dernière action commande l'export d'une table vers
une base ORACLE via ODBC
Or si une table du même nom est déjà présente dans cette base (oubli de
supprimer celle générée antérieurement) l'export tombe en échec

Est-il possible d'insérer dans la Macro une action qui vérifie la présence
de cette table et dans cette éventualité opère sa suppression avant le nouvel
export

Proposition de G genier :


Va dans le section module, fais nouveau.
une fois dans l'éditeur vba, tu tapes :

Function exportTableToOracle()
Set bds=currentdb()
chSQL = "SELECT * FROM tableOracle;"
on error goto noDropTable
bds.execute chSQL

'Si on est ici c'est que le SELECT à marcher donc on supprime
chSQL = "DROP TABLE tableOracle;" (à voir la syntaxe exacte)
'Ici tu appelle t'as requete que tu utilises dans tes macros pour le
'tranfert
bds.execute "maRequeteAjout"
'On a finit on sort
Exit Function
noDropTable:
'La table Oracle n'existait pas donc on ajoute basiquement
bds.execute "maRequeteAjout"
End Function

Dans ta macro au lieu de faire : OuvrirRequete "maRequeteAjout", tu feras
: ExecuterCode et tu iras chercher cette fonction.

NB : une fois que tu auras réussi à faire ça, il faudra vérifier si la
table est bien supprimer d'Oracle est pas simplement d Access, dans ce
cas, il nous faudra le nom du Driver ODBC et voir ce qu'on peut faire avec.

Ce que j'ai réalisé et obtenu :

Merci beaucoup de m'accorder un peu de ton temps pour m'aider
J'ai bien créé un module dans lequel j'ai inséré ton code VBA
Je l'ai quelque peu modifié comme suit :

Set bds=currentdb()
> chSQL = "SELECT * FROM tableOracle;"
> on error goto noDropTable
> bds.execute chSQL
>
> 'Si on est ici c'est que le SELECT à marcher donc on supprime
> chSQL = "DROP TABLE tableOracle;" (à voir la syntaxe exacte)
Modification :
> 'Ici tu appelle t'as requete que tu utilises dans tes macros pour le
> 'tranfert
> 'bds.execute "maRequeteAjout"
je ne donne pas l'instruction d'éxécuter la requète
"maRequeteAjout" car l'export vers Oracle est réalisé par une action
spéciphique de ma
Macro et non par une requète

> 'On a finit on sort
> Exit Function
> noDropTable:

Modification :
la même que précédemment
> 'La table Oracle n'existait pas donc on ajoute basiquement
> 'bds.execute "maRequeteAjout"

> End Function

Aprés cette adaptation si la table à créer n'est pas déjà en place sous
Oracle tout fonctionne correctement éxécution du code et export de la table

Par contre si la table est présente malgrés l'exécution du code qui ne bug
pas l'export tombe en échec car la table créé au paravant n'est pas supprimée
d'Oracle
L'instruction "DROP TABLE" n'est pas suivi d'effet

Une autre question se pose à moi lorsque je commande l'export via une action
de la Macro je dois
décliner sur des champs prévus à cet effet un certain nombre d'informations
concernant l'adresse de la base Oracle (Type base, nom base etc...) ce qui
n'est pas le cas dans ton code pour supprimer l'éventuelle table
N'est ce pas une lacune qui expliquerait le dysfonctionnement du code
Je pense à mon avis que le code VBA n'execute pas son action sur la base
ORACLE dans laquelle je souhaite que l'on analyse la présence d'une table et
de la supprimer si tel est le cas avant un nouvel export de celle-ci
Merci pour ton analyse et une proposition de solution

1 réponse

1 2 3
Avatar
FFO
Il est tard ce jour (+ de 18H)
Les obligations familiales m'appellent
Je remets celà à Lundi et une fois les essais réalisés je te fait part du
résultat

Merci encore et bon week-end


Utilises la touche F8 pour lancer le code en mode ligne par ligne.

testons avec une fonction plus simple.

Function test()
fctConnection
chSQL = "SELECT * FROM tableOracle;"
daoDatabase.Execute chSQL
end Function

Que donne ceci ?



"FFO" a écrit dans le message de
news:
Comment puis je m'en assurer ???
Ce que je constate c'est que la table soit présente ou absente j'obtiens
le

même message au même endroit

Faut il que je fasse d'autres tests et lesquels ???


Oui, je pense.

on peut avoir ce genre de message, par exemple, si on tente de
modifier/ajouter des enregistrement sur une table en lecture seule.

Est ce que laphase du SELECT à fonctionner et il a trouvé la table ?


"FFO" a écrit dans le message de
news:
Je ne sait pas si c'est mieux mais j'ai un autre message
Phase noDropTable:
Ligne daoDatabase.Execute "maMacroTransfert" message impossible
d'exécuter



une requête sélection

A t'on progréssé ???


Ne nous laissons pas abattre !

Private daoConnection as daoDBEngine
Private daoDatabase as DAO.Database

Private Function fctConnection()
Set daoConnection = DBEngine.Workspaces(0)
Set daoDatabase = daoConnection .OpenDatabase("", false, false,
"ODBC;DSN=P27R002-PCLV;USR=scott;PWD=tiger")
End function

N'oublis pas de modifier le USR=tonLogin et PWD=tonPassword

Est ce que comme ça c'est mieux ?

Dans l'attente de ton retour.

"FFO" a écrit dans le message de
news:
On progresse toujours mais avec un nouvel arrêt
Ligne :
daoDatabase.Execute "maMacroTransfert" message erreur
ODBC--L'appel à





échoué

Ce qui m'étonne c'est que la table sous Oracle est volontairement
présente



pour juger par le fonctionnement de la macro et donc du code de sa
suppression automatique
Or l'éxécution du code s'enchaine directement sur la 2° partie
celle





qui
traite la situation où il n'y a pas de table à supprimer
(noDropTable)





alors
qu'elle est présente
Si je force son éxécution sur la première partie en inhibant son
renvoi



vers
la 2° (ajout d'une cote sur la ligne 'On Error GoTo noDropTable)
l'arrêt



s'oppère sur la ligne : daoDatabase.Execute chSQL avec le même
message






Il semble en fait que la communication n'est pas pu s'établir mais
pour



quelle cause ???

Une nouvelle enigme à résoudre !!!!

Enleve le nomBase apres fctConnection, la fonction ne prend plus
d'argument.



donc cela donne : fctConnection


"FFO" a écrit dans le message de
news:
C'est mieux !!!
Je retombe sur la situation précédente qui semble indiquée
l'établissement



de la connection mais avec ce fameux bug exprimé dans mon
message







:
Phase "Function exportTableToOracle()"
Ligne : fctConnection nomBaseODBC message erreur
"incompatibilité







de
type"

J'espère que celà te dit quelque chose
Dans l'attente

Bonjour,

Désolé j'ai raté ton msg d hier.

Non, non on avance bien :)

Le déclaration de la variable :
Private daoConnection As DAO.Workspace

Donc remplace ton wrk.OpenConnection, en daoConnection
..OpenConnection.





En attente de ta réponse.

"FFO" a écrit dans le
message de








news:
Aujourd'hui Jeudi 30/03/06 à la réouverture d'access la
connection







bug
à
nouveau à la ligne :
Set daoDatabase = wrk.OpenConnection("LaConnexion",
dbDriverNoPrompt,





False,
strConnect) message erreur "Objet requis"
Que s'est il passé depuis hier ???
Toujours est il qu'il faut constater une régression
Arriverais je un jours a traiter la présence d'une table
sous









Oracle à
partir d'access
celà me semble un but particulièrement ardu à atteindre
Merci pour toute aide

toujours plus fort !!! la bète est en passe d'être
vaincu










!!!!
Net progré
Je mexplique :
J'ai coché selon tes indications rubrique Référence le
choix










"Microsoft
DAO
3.5 Object Library"
Or un 2° choix similaire était possible mais échapé à ma
vigileance






intitullé "Microsoft DAO 3.6 Object Library"
Rectification faite et oh! miracle la connexion a du
s'effectuer






car si
bug
il ya il se produit sur la 2° partie du code paragraphe
"Function






exportTableToOracle()"
Ligne : fctConnection nomBaseODBC message erreur
"incompatibilité






de
type"

Un peu maigre comme information mais tu devrais
certainement










pouvoir
en
tirer profit

Courage Courage le bout du tunnel n'est pas loin




Aaaahhh..., ca me paraissait tellement logique, dsl de
pas











y
avoir
pensé
avant :p

Bon, dans Outils->Référence, vérifie que l'autre DAO
Object









est
bien
coché.

Du coup en va en profiter pour vérifier la déclaration
des











variables
globales :

Ce code doit etre tout en haut cette ligne : Option
Compare









Database,
doit
normalement etre mise par défaut.
Option Compare Database
Private daoConnection As DAO.Workspace --> j'ai changé
le











type,
peut
etre
que l'erreur vient de la
Private daoDatabase As DAO.Database


"FFO" a écrit dans le
message









de

news:











On avance on avance !!!!
effectivement tu as vu juste en rectifiant la
disposition










des
lignes
la
compilation à appréciée ne relevant plus d'erreur
Les ennuies ne sont pas fini pour autant car à
l'exucution










du
code
via la
macro access rouspète encore (il falait bien que son
mauvais










caractère
s'exprime encore !!!) avec comme message d'erreur :

Ligne Set daoConnection > CreateWorkspace("ODBCDirect",
"Admin",








"",
dbUseODBC) message erreur "un composant ActiveX ne
peut












pas
créer
l'objet"

Qu'en penses tu ???


D'accord :)

Ce qui est étrange c'est que j'ai sous les yeux ce
même











code
et qu
il ne
me
met aucune erreur de syntaxe :/
Attention, j'ai peur que les lignes ne soient
coupés.














Dans ce cas il faut mettre comme ça :

Set daoConnection = CreateWorkspace("ODBCDirect",
"Admin",











"",
dbUseODBC) ->
sur une seule ligne !

strConnect > > > > > > > > > > > > > >
















"ODBC;DSN=P27R002-PCLV;UID=LeLogin;PWD=LeMotDePasse;DATABASE=P27R002-PCLV" -


sur une seule ligne !


Set daoDatabase > > > > > > > > > > > > > >
daoConnection.OpenConnection("LaConnexion",dbDriverNoPrompt,









False,
strConnect) -> sur une seule ligne !

Si tu veux mettre sur deux lignes il faut utiliser
le





























1 2 3