OVH Cloud OVH Cloud

Rafraichir base ADP

22 réponses
Avatar
Gafish
Bonjour,

J'ai un projet ADP qui est lié à une de mes bases SQL Server.
Par appel depuis Access d'une procédure stockée, je crée une table. Ensuite
dans mon code VBA je fais (enfin j'essaie de faire :) ) des opérations
dessus.
Le problème est que la table est créée, mais ma base Access n'est pas
"rafraîchie". Il ne reconnait donc pas cette table. Il faut que je fasse un
F5.
Quelle est la commande pour rafrachîr le contenu d'une base ADP en VBA ?

Merci d'avance

Arnaud

10 réponses

1 2 3
Avatar
J-Pierre
Bonsoir,

Je ne suis pas absolument certain, je vois deux pistes:

1/ fermer la connection et la réouvrir.
Pour ça, tu utilises les méthodes CloseConnection et OpenConnection de l'objet CurentProject. Bon, je n'ai jamais essayé, mais
logiquement, ça devrait marcher, par contre, je pense que ton utilisateur va te maudire pour le temps que ça va prendre.

2/ La table existe de manière permanente dans SQL server, ta procédure stockée la supprime et la recrée, ou bien se contente d'y
charger des données, mais une chose m'étonne: Comment fais-tu quand X utilisateurs créent la même table ? Car ce n'est pas une table
temporaire.....

J-Pierre - Expert en CloseConnection et OpenConnection

"Gafish" a écrit dans le message de news:%
Bonjour,

J'ai un projet ADP qui est lié à une de mes bases SQL Server.
Par appel depuis Access d'une procédure stockée, je crée une table. Ensuite
dans mon code VBA je fais (enfin j'essaie de faire :) ) des opérations
dessus.
Le problème est que la table est créée, mais ma base Access n'est pas
"rafraîchie". Il ne reconnait donc pas cette table. Il faut que je fasse un
F5.
Quelle est la commande pour rafrachîr le contenu d'une base ADP en VBA ?

Merci d'avance

Arnaud




Avatar
Gafish
Merci pour ta réponse.
Je vais essayer le close et open et voir un peu le temps de réponse.
En fait, je crée la table par appel d'une dts au clic d'un utlisateur, et
ensuite je la renomme dans la foulée. C'est pas le top, mais je n'ai pas
trouvé de moyen plus simple pour créer par copie une table en fonction d'une
valeur rentrée comme paramètre dans un form access.
En c'est donc au moment de renommer que survient le pb, car la table venant
d'être créée, Access ne la connait pas avant le refresh.
Et je n'aurai jamais (même si en informatique il ne faut jamais dire jamais)
le cas où deux utilisateurs lanceront en même temps la création de la dite
table, car d'une part ce sera un process utilisé tous les 36 du mois, et
d'autre part la base ne sera accessible que par un poste.

Arnaud

"J-Pierre" a écrit dans le message de
news:%
Bonsoir,

Je ne suis pas absolument certain, je vois deux pistes:

1/ fermer la connection et la réouvrir.
Pour ça, tu utilises les méthodes CloseConnection et OpenConnection de
l'objet CurentProject. Bon, je n'ai jamais essayé, mais

logiquement, ça devrait marcher, par contre, je pense que ton utilisateur
va te maudire pour le temps que ça va prendre.


2/ La table existe de manière permanente dans SQL server, ta procédure
stockée la supprime et la recrée, ou bien se contente d'y

charger des données, mais une chose m'étonne: Comment fais-tu quand X
utilisateurs créent la même table ? Car ce n'est pas une table

temporaire.....

J-Pierre - Expert en CloseConnection et OpenConnection

"Gafish" a écrit dans le message de
news:%

Bonjour,

J'ai un projet ADP qui est lié à une de mes bases SQL Server.
Par appel depuis Access d'une procédure stockée, je crée une table.
Ensuite


dans mon code VBA je fais (enfin j'essaie de faire :) ) des opérations
dessus.
Le problème est que la table est créée, mais ma base Access n'est pas
"rafraîchie". Il ne reconnait donc pas cette table. Il faut que je fasse
un


F5.
Quelle est la commande pour rafrachîr le contenu d'une base ADP en VBA ?

Merci d'avance

Arnaud








Avatar
Gafish
Rebonjour,

J'ai une erreur sur le CloseConnection, mais c'est une erreur indeterminé.
Peut-être parce que je suis sur un formulaire lors du close, mais pourtant
il n'est pas lié à une base.

Arnaud

"J-Pierre" a écrit dans le message de
news:%
Bonsoir,

Je ne suis pas absolument certain, je vois deux pistes:

1/ fermer la connection et la réouvrir.
Pour ça, tu utilises les méthodes CloseConnection et OpenConnection de
l'objet CurentProject. Bon, je n'ai jamais essayé, mais

logiquement, ça devrait marcher, par contre, je pense que ton utilisateur
va te maudire pour le temps que ça va prendre.


2/ La table existe de manière permanente dans SQL server, ta procédure
stockée la supprime et la recrée, ou bien se contente d'y

charger des données, mais une chose m'étonne: Comment fais-tu quand X
utilisateurs créent la même table ? Car ce n'est pas une table

temporaire.....

J-Pierre - Expert en CloseConnection et OpenConnection

"Gafish" a écrit dans le message de
news:%

Bonjour,

J'ai un projet ADP qui est lié à une de mes bases SQL Server.
Par appel depuis Access d'une procédure stockée, je crée une table.
Ensuite


dans mon code VBA je fais (enfin j'essaie de faire :) ) des opérations
dessus.
Le problème est que la table est créée, mais ma base Access n'est pas
"rafraîchie". Il ne reconnait donc pas cette table. Il faut que je fasse
un


F5.
Quelle est la commande pour rafrachîr le contenu d'une base ADP en VBA ?

Merci d'avance

Arnaud








Avatar
J-Pierre
Bonjour Gafish,

Peux-tu publier ton code, je vais faire des essais de mon côté

J-Pierre
Avatar
Gafish
Merci pour la réponse.
Mon code est le suivant :

Private Sub Commande0_Click()

'appel de la DTS de copie
DoCmd.OpenStoredProcedure "PSCopieNorme"

'la ca plante :
CurrentProject.CloseConnection
CurrentProject.OpenConnection

'J'avais essayé ca aussi, mais currentdb.name cause une erreur
'meme si on fait simplement MsgBox currentdb.name
'variable de bloc with non définie. Est-ce que c'est lié au fait que je
suis en adp
'CurrentDb.Synchronize currentdb.name

'DoCmd.Rename "TableCorrespondance" & Trim(Me.NouveauNom.Value),
acTable, "TableCorrespondanceNew"

End Sub

Si tu as besoin de plus de précisions n'hesites pas.

Arnaud

"J-Pierre" a écrit dans le message de
news:
Bonjour Gafish,

Peux-tu publier ton code, je vais faire des essais de mon côté

J-Pierre





Avatar
J-Pierre
Ca plante sans doute parce que la procédure est en cours d'exécution. Ce serait peut-être bien de tester aussi le code retour.
Essaie déjà sans exécution de procédure, pour voir si c'est viable côté temps d'exécution, et puis pour openConnection, il y a un
paramètre ChaîneConnexiondeBase que je ne sais d'ailleurs pas coder, mais il y aura bien quelqu'un pour voler à ton secours, je
passe toujours par des sources de données ODBC, ça me donne quelque chose du style (dans des applis Internet):

Set objConn = Server.CreateObject("ADODB.Connection")
Set objRset = Server.CreateObject("ADODB.Recordset")
objConn.Open Application("maBase"), "", ""

Oui, currentDB, c'est pour mdb.

Dernier point: Si j'ai bien compris, le nom de la table est choisi par l'utilisateur et aléatoire ?

J-Pierre


"Gafish" a écrit dans le message de news:
Merci pour la réponse.
Mon code est le suivant :

Private Sub Commande0_Click()

'appel de la DTS de copie
DoCmd.OpenStoredProcedure "PSCopieNorme"

'la ca plante :
CurrentProject.CloseConnection
CurrentProject.OpenConnection

'J'avais essayé ca aussi, mais currentdb.name cause une erreur
'meme si on fait simplement MsgBox currentdb.name
'variable de bloc with non définie. Est-ce que c'est lié au fait que je
suis en adp
'CurrentDb.Synchronize currentdb.name

'DoCmd.Rename "TableCorrespondance" & Trim(Me.NouveauNom.Value),
acTable, "TableCorrespondanceNew"

End Sub

Si tu as besoin de plus de précisions n'hesites pas.

Arnaud

"J-Pierre" a écrit dans le message de
news:
Bonjour Gafish,

Peux-tu publier ton code, je vais faire des essais de mon côté

J-Pierre









Avatar
Gafish
Merci pour tes réponses et ta patience :)

Ca plante sans doute parce que la procédure est en cours d'exécution. Ce
serait peut-être bien de tester aussi le code retour.

Essaie déjà sans exécution de procédure, pour voir si c'est viable côté
temps d'exécution, et puis pour openConnection, il y a un

paramètre ChaîneConnexiondeBase que je ne sais d'ailleurs pas coder, mais
il y aura bien quelqu'un pour voler à ton secours, je

passe toujours par des sources de données ODBC, ça me donne quelque chose
du style (dans des applis Internet):


En fait j'ai testé en mettant simplement le close connection, sans appel
préalable de la procédure, mais l'erreur est quand même la "Access a
rencontré une erreur lors de la fermeture", donc je ne suis encore pas
arrivé à l'open :)


Set objConn = Server.CreateObject("ADODB.Connection")
Set objRset = Server.CreateObject("ADODB.Recordset")
objConn.Open Application("maBase"), "", ""

Oui, currentDB, c'est pour mdb.


Ce qui est bizarre, c'est qu'en déscendant la collection CurrentProject (qui
est spécifique sauf erreur de ma part aux adp, j'ai un currentdb de proposé
:
CurrentProject.Application.CurrentDb
Mais toujours la même erreur.


Dernier point: Si j'ai bien compris, le nom de la table est choisi par
l'utilisateur et aléatoire ?


En fait l'utilisateur entre le nom d'une nouvelle norme, et comme les normes
se ressemblent en beaucoup de point, je copie une norme existante, et
j'appele ma table
"TableCorrepondance" & LeNomNormeKilVientDeRentrer
Ensuite il pourra modifier les paramétres présents dans la table pour
l'adapter à sa nouvelle norme.


J-Pierre



Merci encore

"Gafish" a écrit dans le message de
news:

Merci pour la réponse.
Mon code est le suivant :

Private Sub Commande0_Click()

'appel de la DTS de copie
DoCmd.OpenStoredProcedure "PSCopieNorme"

'la ca plante :
CurrentProject.CloseConnection
CurrentProject.OpenConnection

'J'avais essayé ca aussi, mais currentdb.name cause une erreur
'meme si on fait simplement MsgBox currentdb.name
'variable de bloc with non définie. Est-ce que c'est lié au fait que
je


suis en adp
'CurrentDb.Synchronize currentdb.name

'DoCmd.Rename "TableCorrespondance" & Trim(Me.NouveauNom.Value),
acTable, "TableCorrespondanceNew"

End Sub

Si tu as besoin de plus de précisions n'hesites pas.

Arnaud

"J-Pierre" a écrit dans le message
de


news:
Bonjour Gafish,

Peux-tu publier ton code, je vais faire des essais de mon côté

J-Pierre















Avatar
J-Pierre
Salut,

J'ai fait des essais supplémentaires, et j'ai trouvé de la doc. Je suis aussi sans doute plus intéressé que patient, la patience
n'est pas ma qualité première :-))))

Bon, je ne résoud pas le problème, mais j'avance.....

D'abord la doc dit:

chaîne de connection "Provider=SQLOLEDB;Initial Catalog=gestionKazak;Data Source=monServeur;" & _
"User ID=XXX;Password=YYY;"

Après, j'ai eu une idée, récupérer la chaîne de connection du projet ADP, fermer, ajouter le mot de passe, réouvrir. Ca marche
presque super bien, mais l'ouverture ne marche pas, sans message d'erreur, par contre, il n'est pas content sur le cnn.close.

Autres points avant le code:

1/Non, currentProject n'est pas spécifique à ADP, la doc dit:
L'objet CurrentProject fait référence au projet du projet Microsoft Access (.adp) ou de la base de données Access (.mdb) en cours.

2/J'ai fait un essai, closeConnection, avec Enterprise Manager, nouvelle procédure stockée, menu->Fichiers->connexion, la nouvelle
proc est bien visible.

3/Autre possibilité, utiliser ADOX pour créer la table, mais le monsieur n'aime pas la méthode Append, je n'aurais pas le droit,
pourtant, je suis connecté comme administrateur......Je cherche.

----------------------------------------------
Private Sub Commande66_Click()

Dim cnn As New ADODB.Connection
Dim Wconnect As String
Set cnn = CurrentProject.Connection
Wconnect = cnn.ConnectionString
Wconnect = cnn

MsgBox "fermeture" & vbCrLf & Wconnect
CurrentProject.CloseConnection

Wconnect = Wconnect & ";Password=XXXXXX;"
MsgBox "ouverture" & vbCrLf & Wconnect
CurrentProject.OpenConnection Wconnect

cnn.close
Set cnn = Nothing

MsgBox "OK"

End Sub
----------------------------------------------
Avatar
J-Pierre
Salut Gafish,

Voilà le code qui marche, 2 boutons, un pour fermer, l'autre pour ouvrir. Il faudra sans doute t'assurer que rien n'utilise la
connection quand tu veux la fermer, moi, je n'avais qu'un formulaire ouvert, celui du test, sans source de données.

J-Pierre
--------------------------------------
Private Sub Commande65_Click()

MsgBox "fermeture"
CurrentProject.CloseConnection
MsgBox "OK"

End Sub

Private Sub Commande66_Click()

MsgBox "ouverture"
CurrentProject.OpenConnection "Provider=SQLOLEDB;Initial Catalog=maBaseSQL;Data Source=monServeur;" & _
"User ID=XXX;Password=YYYYYYY;"
MsgBox "OK"

End Sub
----------------------------------
Avatar
J-Pierre
Et puis, j'ai oublié de te dire, j'ai aussi fait un test sur un réseau local, temps de connection, nettement moins d'une seconde.

J-Pierre
1 2 3