OVH Cloud OVH Cloud

Probleme connection en DAO

21 réponses
Avatar
mumu
bonjour

J'ai l'impression que la connection ne se fait pas comme il faudrait,
pourtant j'ai rajouté les deux lignes de connection de dbCompta pour vous
car
moi elle sont dans une autre procedure et dbCompta est public
en remplacant dbCompta par currentdb ca marche (a condition de mettre la
table Ecriture dans la base qui contient le code bien sur)
cette connection a deja servi dans une autre procedure et a fonctionné sans
probleme pourtant :(
voici mon code

Function TrouverNumPiece()

Dim rstNumPiece As Recordset
Dim SQLNumPiece As String

strCheminCompta = "C:\Compta.mdb"
Set dbCompta = Workspaces(0).OpenDatabase(strCheminCompta, False, False)
'ouverture de la base

SQLNumPiece = "SELECT Ecritures.NumeroPiece FROM Ecritures WHERE
(((Ecritures.NumeroPiece)=DMax(" & """Ccur(NumeroPiece)""" & "," &
"""Ecritures""" & "," & """Not IsNull(NumeroPiece) And Not NumeroPiece =" &
" ' ' " & """)));"
Debug.Print SQLNumPiece

Set rstNumPiece = dbCompta.OpenRecordset(SQLNumPiece) 'je mets le resultat
dans rstNumPiece
TrouverNumPiece = rstNumPiece!NumeroPiece 'c'est le plus grand numero de
piece existant
End Function


Si je remplace
Set rstNumPiece = dbCompta.OpenRecordset(SQLNumPiece)
par
Set rstNumPiece = CurrentDb.OpenRecordset(SQLNumPiece)

ca marche

J'avoue ne pas comprendre pourquoi cela ne marche pas si vous pouviez
m'aider

merci beaucoup

Mumu

10 réponses

1 2 3
Avatar
mumu
Meme chose que toute a l'heure ca plante, mais si la table est en local ca
marche

erreur 3078
inconnu

La journée que je cherche, si je trouve pas je vais jeter l'ordi par la
fenetre :)



"Rv" a écrit dans le message de
news:
Alors là c'est moi qui ne comprends plus! Pourquoi ne peut-on pas lancer
(sans créer) une telle requête avec

Dim rstNumPiece As DAO.Recordset
Dim SQLNumPiece As String

strCheminCompta = "C:Compta.mdb"
' ouverture de la base externe
Set dbCompta = Workspaces(0).OpenDatabase(strCheminCompta, False, False)
' Création du texte de la requête
rstNumPiece = "SELECT Max(ccur(Ecritures.NumeroPiece)) FROM Ecritures
WHERE

Ecritures.NumeroPiece<>' ' AND Not is null Ecritures.NumeroPiece"
' Execution de la requête
Set rstNumPiece = dbCompta.OpenRecordset(SQLNumPiece)
...

Sinon tu peux te lier ponctuellement avec cette syntaxe :
SELECT Meschamps FROM Mestables IN 'chemindelabaseaccessexterne' WHERE
mesconditions. Ce qui te permettrait de l'éxecuter via CurrentDb

Enfin, le MAX n'est pas une instruction VBA mais une fonction SQL. En
dehors

d'une requête SQL il n'a pas de sens.

A+

Rv

"mumu" a écrit dans le message de
news:
Salut Rv et merci de prendre un moment pour me repondre

le soucis est que je ne peux pas creer la requete physiquement car elle
depand de tables exterieurs a ma base.
je ne peux pas non plus lier cette table, sinon je m'en sortais ( a
cause


d'autre liaisons qui se font en automatique)

Bon tous ca pour dire que Max ne marche pas avec VBA ou alors il y a
quelque

chose que j'ai mal fait
pour SELECT TOP 1 je vais essayer je te tindrais au courant.

Mumu



"Rv" a écrit dans le message de
news:
Salut,

N'est-il pas possible d'utiliser d'autres requêtes comme:
SELECT Max(ccur(Ecritures.NumeroPiece)) FROM Ecritures WHERE
Ecritures.NumeroPiece<>'' AND Not is null Ecritures.NumeroPiece
ou
SELECT TOP 1 Ecritures.NumeroPiece FROM Ecritures WHERE
Ecritures.NumeroPiece<>'' AND Not is null Ecritures.NumeroPiece ORDER
BY



ccur(NumeroPiece) DESC

A+

Rv









Avatar
mumu
Voila ce que je viens de faire mais cela risque d'etre trop long par la
suite
j'essaie toute autre idées


Function TrouverNumPiece()
Dim rstNumPiece As Recordset
Dim SQLNumeroPiece As String
Dim rstTEcritures As Recordset

Set rstTEcritures = CurrentDb.OpenRecordset("TEcritures")

SQLNumeroPiece = "SELECT Ecritures.NumeroPiece FROM Ecritures WHERE (Not
NumeroPiece =" & " ' ' " & ");"
Set rstNumPiece = dbCompta.OpenRecordset(SQLNumeroPiece)

CurrentDb.Execute "delete * from [TEcritures]" 'vide TEcritures

On Error GoTo ErreurLettreDansNumPiece 'cas ou il y a une lettre CCur fera
planter en erreur 13

Do Until rstNumPiece.EOF 'transfert tous les numeros de pieces existant
dans TEcritures qui est en local
rstTEcritures.AddNew 'car la fonction DMax ne marche pas sur la
base QCompta du coup je l'applique en local
rstTEcritures!NumeroPiece = CCur(rstNumPiece!NumeroPiece) 'mais bonjour
la perte de temp quand il y aura beaucoup d'ecritures
rstTEcritures.Update
rstNumPiece.MoveNext
Loop

TrouverNumPiece = DMax("NumeroPiece", "TEcritures") 'c'est le plus grand
numero de piece existant

On Error GoTo 0
Set rstTEcritures = Nothing
Set rstNumPiece = Nothing

Exit Function
ErreurLettreDansNumPiece:
If Err.Number = 13 Then
MsgBox ("Erreur Il y a un numéro de pièce avec une lettre" & vbCrLf
& "je le passe mais attention que ce ne soit pas le dernier" & vbCrLf &
"sinon mes numeros de pièces seront faux" & vbCrLf & "Verifie quand meme")
Resume Next
End If
MsgBox "PLANTAGE", vbCritical, "Et merde" 'normalement je n'arrive jamais
la
End Function





"mumu" a écrit dans le message de
news:
bonjour

J'ai l'impression que la connection ne se fait pas comme il faudrait,
pourtant j'ai rajouté les deux lignes de connection de dbCompta pour vous
car
moi elle sont dans une autre procedure et dbCompta est public
en remplacant dbCompta par currentdb ca marche (a condition de mettre la
table Ecriture dans la base qui contient le code bien sur)
cette connection a deja servi dans une autre procedure et a fonctionné
sans

probleme pourtant :(
voici mon code

Function TrouverNumPiece()

Dim rstNumPiece As Recordset
Dim SQLNumPiece As String

strCheminCompta = "C:Compta.mdb"
Set dbCompta = Workspaces(0).OpenDatabase(strCheminCompta, False, False)
'ouverture de la base

SQLNumPiece = "SELECT Ecritures.NumeroPiece FROM Ecritures WHERE
(((Ecritures.NumeroPiece)=DMax(" & """Ccur(NumeroPiece)""" & "," &
"""Ecritures""" & "," & """Not IsNull(NumeroPiece) And Not NumeroPiece ="
&

" ' ' " & """)));"
Debug.Print SQLNumPiece

Set rstNumPiece = dbCompta.OpenRecordset(SQLNumPiece) 'je mets le resultat
dans rstNumPiece
TrouverNumPiece = rstNumPiece!NumeroPiece 'c'est le plus grand numero de
piece existant
End Function


Si je remplace
Set rstNumPiece = dbCompta.OpenRecordset(SQLNumPiece)
par
Set rstNumPiece = CurrentDb.OpenRecordset(SQLNumPiece)

ca marche

J'avoue ne pas comprendre pourquoi cela ne marche pas si vous pouviez
m'aider

merci beaucoup

Mumu




Avatar
Rv
Ok je comprends pour le DMAX qui est une fonction VBA et pas SQL. Je dirais
que le DMAX veut être exécuté par ta base locale, même si tu précises comme
tu le fais une autre base pour l'ensemble de la requête, et comme elle ne
contient pas les données décrites dans le DMAX ça plante (ceci je n'en suis
pas tout à fait sûr. A confirmer, tester- par exemple en réimportant la
table Ecritures le DMAX fonctionnera - , ...).
Par contre je ne comprends pas pourquoi la syntaxe SELECT MAx(...) ne
fonctionne pas (Le MAX etant une fonction SQL). Peux tu préciser l'erreur
qui se produit à ce moment là?

A+

Rv

"mumu" a écrit dans le message de
news:eq$
Lancer sans créer la requete oui, mais ca marche pas dans ce cas je pense
que c'est a cause du DMax qui doit pas lui plaire

Ton histoire de liaison ponctuel me plait bien
car avec currentdb ca marche (simplifier en test j'ai importé la table
Ecriture) et tout marchais bien
j'essaye ca je te dis ce que ca donne

Mumu

"Rv" a écrit dans le message de
news:
Alors là c'est moi qui ne comprends plus! Pourquoi ne peut-on pas lancer
(sans créer) une telle requête avec

Dim rstNumPiece As DAO.Recordset
Dim SQLNumPiece As String

strCheminCompta = "C:Compta.mdb"
' ouverture de la base externe
Set dbCompta = Workspaces(0).OpenDatabase(strCheminCompta, False, False)
' Création du texte de la requête
rstNumPiece = "SELECT Max(ccur(Ecritures.NumeroPiece)) FROM Ecritures
WHERE

Ecritures.NumeroPiece<>' ' AND Not is null Ecritures.NumeroPiece"
' Execution de la requête
Set rstNumPiece = dbCompta.OpenRecordset(SQLNumPiece)
...

Sinon tu peux te lier ponctuellement avec cette syntaxe :
SELECT Meschamps FROM Mestables IN 'chemindelabaseaccessexterne' WHERE
mesconditions. Ce qui te permettrait de l'éxecuter via CurrentDb

Enfin, le MAX n'est pas une instruction VBA mais une fonction SQL. En
dehors

d'une requête SQL il n'a pas de sens.

A+

Rv

"mumu" a écrit dans le message de
news:
Salut Rv et merci de prendre un moment pour me repondre

le soucis est que je ne peux pas creer la requete physiquement car
elle



depand de tables exterieurs a ma base.
je ne peux pas non plus lier cette table, sinon je m'en sortais ( a
cause


d'autre liaisons qui se font en automatique)

Bon tous ca pour dire que Max ne marche pas avec VBA ou alors il y a
quelque

chose que j'ai mal fait
pour SELECT TOP 1 je vais essayer je te tindrais au courant.

Mumu



"Rv" a écrit dans le message de
news:
Salut,

N'est-il pas possible d'utiliser d'autres requêtes comme:
SELECT Max(ccur(Ecritures.NumeroPiece)) FROM Ecritures WHERE
Ecritures.NumeroPiece<>'' AND Not is null Ecritures.NumeroPiece
ou
SELECT TOP 1 Ecritures.NumeroPiece FROM Ecritures WHERE
Ecritures.NumeroPiece<>'' AND Not is null Ecritures.NumeroPiece
ORDER




BY
ccur(NumeroPiece) DESC

A+

Rv













Avatar
mumu
Ca a l'air de passer j'avais des erreurs de syntaxes et en le refaisant ca a
passé sans erreurs
mais comment je recupere le nombre le plus grand ?

SQLNumeroPiece = "SELECT Max(Ecritures.NumeroPiece) FROM Ecritures WHERE
(( Not IsNull(NumeroPiece) And Not NumeroPiece =" & """' '""" & "));"

Set rstNumPiece = dbCompta.OpenRecordset(SQLNumeroPiece)

TrouverNumPiece = rstNumPiece!NumeroPiece

A la derniere ligne il me dit que l'element n'est pas trouvé dans la
colection
La solution ne doit pas etre bien loin mais je trouve pas

Mumu

"Rv" a écrit dans le message de
news:
Ok je comprends pour le DMAX qui est une fonction VBA et pas SQL. Je
dirais

que le DMAX veut être exécuté par ta base locale, même si tu précises
comme

tu le fais une autre base pour l'ensemble de la requête, et comme elle ne
contient pas les données décrites dans le DMAX ça plante (ceci je n'en
suis

pas tout à fait sûr. A confirmer, tester- par exemple en réimportant la
table Ecritures le DMAX fonctionnera - , ...).
Par contre je ne comprends pas pourquoi la syntaxe SELECT MAx(...) ne
fonctionne pas (Le MAX etant une fonction SQL). Peux tu préciser l'erreur
qui se produit à ce moment là?

A+

Rv

"mumu" a écrit dans le message de
news:eq$
Lancer sans créer la requete oui, mais ca marche pas dans ce cas je
pense


que c'est a cause du DMax qui doit pas lui plaire

Ton histoire de liaison ponctuel me plait bien
car avec currentdb ca marche (simplifier en test j'ai importé la table
Ecriture) et tout marchais bien
j'essaye ca je te dis ce que ca donne

Mumu

"Rv" a écrit dans le message de
news:
Alors là c'est moi qui ne comprends plus! Pourquoi ne peut-on pas
lancer



(sans créer) une telle requête avec

Dim rstNumPiece As DAO.Recordset
Dim SQLNumPiece As String

strCheminCompta = "C:Compta.mdb"
' ouverture de la base externe
Set dbCompta = Workspaces(0).OpenDatabase(strCheminCompta, False,
False)



' Création du texte de la requête
rstNumPiece = "SELECT Max(ccur(Ecritures.NumeroPiece)) FROM Ecritures
WHERE

Ecritures.NumeroPiece<>' ' AND Not is null Ecritures.NumeroPiece"
' Execution de la requête
Set rstNumPiece = dbCompta.OpenRecordset(SQLNumPiece)
...

Sinon tu peux te lier ponctuellement avec cette syntaxe :
SELECT Meschamps FROM Mestables IN 'chemindelabaseaccessexterne' WHERE
mesconditions. Ce qui te permettrait de l'éxecuter via CurrentDb

Enfin, le MAX n'est pas une instruction VBA mais une fonction SQL. En
dehors

d'une requête SQL il n'a pas de sens.

A+

Rv

"mumu" a écrit dans le message de
news:
Salut Rv et merci de prendre un moment pour me repondre

le soucis est que je ne peux pas creer la requete physiquement car
elle



depand de tables exterieurs a ma base.
je ne peux pas non plus lier cette table, sinon je m'en sortais ( a
cause


d'autre liaisons qui se font en automatique)

Bon tous ca pour dire que Max ne marche pas avec VBA ou alors il y a
quelque

chose que j'ai mal fait
pour SELECT TOP 1 je vais essayer je te tindrais au courant.

Mumu



"Rv" a écrit dans le message de
news:
Salut,

N'est-il pas possible d'utiliser d'autres requêtes comme:
SELECT Max(ccur(Ecritures.NumeroPiece)) FROM Ecritures WHERE
Ecritures.NumeroPiece<>'' AND Not is null Ecritures.NumeroPiece
ou
SELECT TOP 1 Ecritures.NumeroPiece FROM Ecritures WHERE
Ecritures.NumeroPiece<>'' AND Not is null Ecritures.NumeroPiece
ORDER




BY
ccur(NumeroPiece) DESC

A+

Rv

















Avatar
mumu
Oui en important la table Ecriture le DMax marche

"Rv" a écrit dans le message de
news:
Ok je comprends pour le DMAX qui est une fonction VBA et pas SQL. Je
dirais

que le DMAX veut être exécuté par ta base locale, même si tu précises
comme

tu le fais une autre base pour l'ensemble de la requête, et comme elle ne
contient pas les données décrites dans le DMAX ça plante (ceci je n'en
suis

pas tout à fait sûr. A confirmer, tester- par exemple en réimportant la
table Ecritures le DMAX fonctionnera - , ...).
Par contre je ne comprends pas pourquoi la syntaxe SELECT MAx(...) ne
fonctionne pas (Le MAX etant une fonction SQL). Peux tu préciser l'erreur
qui se produit à ce moment là?

A+

Rv

"mumu" a écrit dans le message de
news:eq$
Lancer sans créer la requete oui, mais ca marche pas dans ce cas je
pense


que c'est a cause du DMax qui doit pas lui plaire

Ton histoire de liaison ponctuel me plait bien
car avec currentdb ca marche (simplifier en test j'ai importé la table
Ecriture) et tout marchais bien
j'essaye ca je te dis ce que ca donne

Mumu

"Rv" a écrit dans le message de
news:
Alors là c'est moi qui ne comprends plus! Pourquoi ne peut-on pas
lancer



(sans créer) une telle requête avec

Dim rstNumPiece As DAO.Recordset
Dim SQLNumPiece As String

strCheminCompta = "C:Compta.mdb"
' ouverture de la base externe
Set dbCompta = Workspaces(0).OpenDatabase(strCheminCompta, False,
False)



' Création du texte de la requête
rstNumPiece = "SELECT Max(ccur(Ecritures.NumeroPiece)) FROM Ecritures
WHERE

Ecritures.NumeroPiece<>' ' AND Not is null Ecritures.NumeroPiece"
' Execution de la requête
Set rstNumPiece = dbCompta.OpenRecordset(SQLNumPiece)
...

Sinon tu peux te lier ponctuellement avec cette syntaxe :
SELECT Meschamps FROM Mestables IN 'chemindelabaseaccessexterne' WHERE
mesconditions. Ce qui te permettrait de l'éxecuter via CurrentDb

Enfin, le MAX n'est pas une instruction VBA mais une fonction SQL. En
dehors

d'une requête SQL il n'a pas de sens.

A+

Rv

"mumu" a écrit dans le message de
news:
Salut Rv et merci de prendre un moment pour me repondre

le soucis est que je ne peux pas creer la requete physiquement car
elle



depand de tables exterieurs a ma base.
je ne peux pas non plus lier cette table, sinon je m'en sortais ( a
cause


d'autre liaisons qui se font en automatique)

Bon tous ca pour dire que Max ne marche pas avec VBA ou alors il y a
quelque

chose que j'ai mal fait
pour SELECT TOP 1 je vais essayer je te tindrais au courant.

Mumu



"Rv" a écrit dans le message de
news:
Salut,

N'est-il pas possible d'utiliser d'autres requêtes comme:
SELECT Max(ccur(Ecritures.NumeroPiece)) FROM Ecritures WHERE
Ecritures.NumeroPiece<>'' AND Not is null Ecritures.NumeroPiece
ou
SELECT TOP 1 Ecritures.NumeroPiece FROM Ecritures WHERE
Ecritures.NumeroPiece<>'' AND Not is null Ecritures.NumeroPiece
ORDER




BY
ccur(NumeroPiece) DESC

A+

Rv

















Avatar
Rv
"mumu" a écrit dans le message de
news:
Ca a l'air de passer j'avais des erreurs de syntaxes et en le refaisant ca
a

passé sans erreurs
mais comment je recupere le nombre le plus grand ?

SQLNumeroPiece = "SELECT Max(Ecritures.NumeroPiece) FROM Ecritures WHERE
(( Not IsNull(NumeroPiece) And Not NumeroPiece =" & """' '""" & "));"

Set rstNumPiece = dbCompta.OpenRecordset(SQLNumeroPiece)

TrouverNumPiece = rstNumPiece!NumeroPiece

A la derniere ligne il me dit que l'element n'est pas trouvé dans la
colection
La solution ne doit pas etre bien loin mais je trouve pas

Mumu



Avatar
Rv
Désolé pour le post précédent. Un cic intempestif!
Apparement la requête ne renvoie pas de données. Il faut tester le
rstNumPiece.EOF pour en être sûr.
if rstNumPiece .EOF then
' Pas d'enregistrement
...
else
TrouverNumPiece = rstNumPiece!NumeroPiece
end if
A ta place j'afficherai la requête avec un debug.print puis je ferais un
copier coller du texte ainsi affiché dans une requete SQL DIRECT de la base
des écritures pour tester et corriger. Puis quand ça marche, un copier
coller dans ton application du texte de la requête!

A+

Rv



"mumu" a écrit dans le message de
news:
Ca a l'air de passer j'avais des erreurs de syntaxes et en le refaisant ca
a

passé sans erreurs
mais comment je recupere le nombre le plus grand ?

SQLNumeroPiece = "SELECT Max(Ecritures.NumeroPiece) FROM Ecritures WHERE
(( Not IsNull(NumeroPiece) And Not NumeroPiece =" & """' '""" & "));"

Set rstNumPiece = dbCompta.OpenRecordset(SQLNumeroPiece)

TrouverNumPiece = rstNumPiece!NumeroPiece

A la derniere ligne il me dit que l'element n'est pas trouvé dans la
colection
La solution ne doit pas etre bien loin mais je trouve pas

Mumu


Avatar
Rv
Donc l'explication semble correcte (le DMAX tape dans la base locale).
C'était juste pour comprendre car la solution n'est pas là!

A+ et bonne soirée, je termine pour aujourd'hui la discussion.

Rv


"mumu" a écrit dans le message de
news:
Oui en important la table Ecriture le DMax marche

"Rv" a écrit dans le message de
news:
Ok je comprends pour le DMAX qui est une fonction VBA et pas SQL. Je
dirais

que le DMAX veut être exécuté par ta base locale, même si tu précises
comme

tu le fais une autre base pour l'ensemble de la requête, et comme elle
ne


contient pas les données décrites dans le DMAX ça plante (ceci je n'en
suis

pas tout à fait sûr. A confirmer, tester- par exemple en réimportant la
table Ecritures le DMAX fonctionnera - , ...).
Par contre je ne comprends pas pourquoi la syntaxe SELECT MAx(...) ne
fonctionne pas (Le MAX etant une fonction SQL). Peux tu préciser
l'erreur


qui se produit à ce moment là?

A+

Rv





Avatar
mumu
c'est pas que la requete ne renvoie pas de données
mais quelle n'a pas le champ NumeroPiece plutot non ?


"Rv" a écrit dans le message de
news:
Désolé pour le post précédent. Un cic intempestif!
Apparement la requête ne renvoie pas de données. Il faut tester le
rstNumPiece.EOF pour en être sûr.
if rstNumPiece .EOF then
' Pas d'enregistrement
...
else
TrouverNumPiece = rstNumPiece!NumeroPiece
end if
A ta place j'afficherai la requête avec un debug.print puis je ferais un
copier coller du texte ainsi affiché dans une requete SQL DIRECT de la
base

des écritures pour tester et corriger. Puis quand ça marche, un copier
coller dans ton application du texte de la requête!

A+

Rv



"mumu" a écrit dans le message de
news:
Ca a l'air de passer j'avais des erreurs de syntaxes et en le refaisant
ca


a
passé sans erreurs
mais comment je recupere le nombre le plus grand ?

SQLNumeroPiece = "SELECT Max(Ecritures.NumeroPiece) FROM Ecritures WHERE
(( Not IsNull(NumeroPiece) And Not NumeroPiece =" & """' '""" & "));"

Set rstNumPiece = dbCompta.OpenRecordset(SQLNumeroPiece)

TrouverNumPiece = rstNumPiece!NumeroPiece

A la derniere ligne il me dit que l'element n'est pas trouvé dans la
colection
La solution ne doit pas etre bien loin mais je trouve pas

Mumu






Avatar
mumu
Ok et merci encore Rv
si demain cela te tente de la reprendre
n'hesite pas :)
si je trouve quelque chose je te le ferais savoir
Mumu


"Rv" a écrit dans le message de
news:
Donc l'explication semble correcte (le DMAX tape dans la base locale).
C'était juste pour comprendre car la solution n'est pas là!

A+ et bonne soirée, je termine pour aujourd'hui la discussion.

Rv


"mumu" a écrit dans le message de
news:
Oui en important la table Ecriture le DMax marche

"Rv" a écrit dans le message de
news:
Ok je comprends pour le DMAX qui est une fonction VBA et pas SQL. Je
dirais

que le DMAX veut être exécuté par ta base locale, même si tu précises
comme

tu le fais une autre base pour l'ensemble de la requête, et comme elle
ne


contient pas les données décrites dans le DMAX ça plante (ceci je n'en
suis

pas tout à fait sûr. A confirmer, tester- par exemple en réimportant
la



table Ecritures le DMAX fonctionnera - , ...).
Par contre je ne comprends pas pourquoi la syntaxe SELECT MAx(...) ne
fonctionne pas (Le MAX etant une fonction SQL). Peux tu préciser
l'erreur


qui se produit à ce moment là?

A+

Rv









1 2 3