OVH Cloud OVH Cloud

Demande d'aide pour résoudre une erreur Microsoft Jet

15 réponses
Avatar
Sonia
Bonjours

Je voudrai réaliser un calcul entre deux bases de données access. Ces deux bases de donnéés se situent sur
c:\bd
Base de donnée 1 = "I_résultat.mdb"
Table = "I_Co"
Champ = "N_article"
Champ = "Qt_c"

Base de donnée = "H_Résultat.mdb"
Table = "H_Co"
Champ = "N_article"
Champ = "Qt_D"

Le module de calcul ainsi que la requête "J_resultat se trouve dans la base de donnée "H_Résultat.mdb"

Voici de code du module

Function FnQuantitéTotale(MaN_Article) As Long
'MaN_Article = Nz(MaN_article)
'MaN_Article = Val(MaN_Article)
Dim BD aS DAO.Database
Dim enr As DAO.Recordset
Dim QuantitéTotale
Set bd = Opendatabase("c:\bd\I_résultat.mdb")
Set enr = bd.OpenRecordset("Select [Qt_c] From [I_Co] Where N_Article =" & MaN_Article)
FnQuantitéTotale = Nz(DSum("[Qt_c]", "[I_Co]", "N_Article =" & MaN_Article)) + Nz(DSum("[Qt_D]", "[H_Co]", "N_Article =" & MaN_Article))
enr.Close
bd.Close
Set bd = Nothing

End Function

Dans la la requête
Champ = N_Article : Regroupement
Champ = Quantité totale:FnQuantitéTotale([N_Article]) : Regroupement

Je exécute la requête "J_resultat. Et la il me donne le message d'erruer suivant :

Erreur d'execution '3078'

Le moteur de recherche de base de données Microsoft Jet ne peut pas trouver la table ou la
requête source 'I_Co'. Assurez-vous qu'elle existe et qu'elle est correctement orthographiée.

Et la je regarde mon code dans le module et je ne voie pas d'erreur.

Pouvez me dire ou est l'erreur et me l'a corrigé.

Merci
Bisous Sonia!!

5 réponses

1 2
Avatar
Eric
re Sonia,

Dans la fonction que je t'ai donnée, son argument est Reference donc
laisses le tel quel dans les instructions suivantes :
Set enr = BD.OpenRecordset("Select [Qt_c] From [I_Co] Where
N_Article =" & MaN_Article)
*********** à remplacer par REFERENCE car inconnu


ce qui donne:
Set enr = BD.OpenRecordset("Select [Qt_c] From [I_Co] Where
N_Article =" & REFERENCE)

De même, dans la fonction DSum:
fnQteTotale = Total + Nz(DSum("[Qt_D]", "[H_Co]", "N_Article =" &
MaN_Article))

*********** à remplacer par REFERENCE car inconnu

d'où :
fnQteTotale = Nz(total) + DSum("[Qt_D]", "[H_Co]", "N_Article=" &
REFERENCE).



Dans la requête, tu utilises ta fonction en lui passant l'argument :
Requête
Champ : N_Article : Regroupement
Champ : Quantité Totale :FnQteTotale([N_Article]) : Regroupement


donc [N_Article] renseigne l'argument Reference et ca marche.

----------------------------------------------------------------------
Erreur d'execution 3075
Erreur de syntaxe (opérateur absent) dans l'expresson 'N_article ='


Cette erreur est due au fait que MaN_Article n'est pas défini.
----------------------------------------------------------------------

A+
Eric

Avatar
Eric
Bonjour Sonia

1-Il y a une erreur dans ton code SQL dans chaque instruction :
Le mot est FROM et non Fron.

2-Si tu manipules 3 jeux d'enregistrements il te faut 3 variables : enr1,
enr2, enr3 et non une seule car pour le moteur, ton code ouvre 3 jeux mais
afféctés à la même variable Recordset (enr), l'un après l'autre avant tout
traitement, donc il ne retient que le dernier.

3-Je vois que tu récupères 2 champs de la même base donc tu peux faire
l'économie d'un jeu d'enregistrements en récupérant les valeurs des 2
champs dans le même jeu.

4-Tu déclares une variable QTB puis tu utilises la variable QBE.

5-Ton erreur de compilation vient du fait que tu n'indiques pas à quelle
base se rattache le recordset enr

La solution manipule une seule variable Database et une seule variable
Recordset mais réaffectées après traitement.

Function fnPV(Reference As Long) As long
Dim bd As DAO.Database
Dim enr As DAO.Recordset
Dim QTE As Long
Dim PBE As Long
Dim QBE As Long
QTE = 0
PBE = 0
QBE = 0
Set bd = OpenDatabase("c:Informatique FrSous Commande Revendeurs
Qte_SCo.mdb")
Set enr = bd.OpenRecordset("Select [Quantité Totale Commandée] FROM
[Quantité Totale] Where N_Article=" & Reference)
While Not enr.EOF
QTE = QTE + enr(0) ' on cumule les qt commandées.
Enr.MoveNext
enr.close:bd.close
set enr=nothing:Set bd= nothing
Set bd = OpenDatabase("c:Informatique FrPrix de Base fournisseurs
Inf_Prix_Base.mdb")
Set enr = bd.OpenRecordset("Select [QB],[PB] FROM [PB] Where
N_Article=" & Reference)
enr.movefirst
While Not enr.EOF
QBE = QBE + enr(0) ' cumul des QB - 1er champ indicé à 0
PBE = PBE + enr(1) ' Cumul des PB - 2e champ indicé à 1
Enr.MoveNext
enr.close:bd.close
set Enr=nothing:Set bd= nothing
fnPV = QTE + PBE + QBE + Nz(DSum("[QB]", "[PB]", "N_Article =" &
Reference))
End Function

Rem: PB est-il un prix ? si oui, tu ajoutes des prix à des quantités ???

Voila, j'espère ne pas avoir fait d'erreur.

A+
Eric
__________________________________________________________________________

IMPORTANT : Daniel Carollo t'avait conseillé d'attacher tes tables à ta
base principale ( celle dans laquelle tu écris ce code ). As-tu essayé car
ca te simplifierait la vie, allègerait le traitement, améliorerait la
vitesse de traitement car les tables seraient directement disponibles sans
devoir ouvrir d'autres bases.
__________________________________________________________________________
Avatar
Eric
Bonsoir Sonia,

Comme tu recopies les infos d'une fonction vers une autre tu fais des
erreurs.

Si la fonction a pour argument : Reference et NC2 tu ne dois pas avoir de
variable nommée MaN_Article, dans tous les cas tu testes ou recherches le
N_Article=Reference.

Il ya un truc anormal à la fin de ta fonction, tu termines par :
& NC2)))) * QTE))) Reference)) <--- Reference)) serait pas en trop ?

Bon, j'ai corrigé mais suis pas sur des parentheses pour ta fonction,
j'ai pas vérifié mais j'ai l'impression que ce n'est pas équilibré. Il y
a plus de fermantes que d'ouvrantes.

Function fnPV(Reference As Long,NC2 ) As Double
Dim bd As DAO.Database
Dim enr As DAO.Recordset
Dim QTE As Long
Dim PBE As Long
Dim QBE As Long
QTE = 0
PBE = 0
QBE = 0
Set bd = OpenDatabase("c:Informatique FrSous Commande Revendeurs
Qte_SCo.mdb")
Set enr = bd.OpenRecordset("Select [Quantité Totale
Commandée] FROM
[Quantité Totale] Where N_Article=" & Reference)
While Not enr.EOF
QTE = QTE + enr(0) ' on cumule les qt commandées.
Enr.MoveNext
enr.close:bd.close
set enr=nothing:Set bd= nothing
Set bd = OpenDatabase("c:Informatique FrPrix de Base
fournisseurs
Inf_Prix_Base.mdb")
Set enr = bd.OpenRecordset("Select [QB],[PB] FROM [PB] Where
N_Article=" & Reference)
enr.movefirst
While Not enr.EOF
QBE = QBE + enr(0) ' cumul des QB
PBE = PBE + enr(1) ' Cumul des PB
Enr.MoveNext
enr.close:bd.close
set Enr=nothing:Set bd= nothing
fnPV = (QBE - Nz(DSum("[QM]", "[PV]", "N_Article =" & Reference & "
and N_C2 = " & NC2)))* PBE) / (QBE - Nz(DSum("[QM]", "[PV]",
"N_Article =" & Reference & " and N_C2 = " & NC2))) - (PBE -
Nz(DSum("[PV]", "[PV]", "N_Article =" & Reference & " and N_C2 = " &
NC2))) / (QBE - Nz(DSum("[QM]", "[PV]", "N_Article =" & Reference &
" and N_C2 = " & NC2))))) + (((PBE - Nz(DSum("[PV]", "[PV]",
"N_Article =" & Reference & " and N_C2 = " & NC2))) / (QBE -
Nz(DSum("[QM]", "[PV]", "N_Article =" & Reference & " and N_C2 = " &
NC2)))) * QTE)))
End Function


A+
Eric
Avatar
Eric
Bonjour

L'eternel probleme du copier-coller dans des procédure longues. Il faut 2
wend

While Not enr.EOF
QTE = QTE + enr(0)
enr.MoveNext
Wend

et

While Not enr.EOF
QBE = QBE + enr(0)
PBE = PBE + enr(1)
enr.MoveNext
Wend


A+
Eric



"=?Utf-8?B?U29uaWE=?=" écrivait
news::

Bonjours
J'ai un message d'erreur avec votre code, pas bien méchant. De Sytle
Erreur de Compilation While Sans Wend. Comme j' ai deux While. Où
dois je placé les deux wend ? Après enre.MovNext ou après End
Function ?

Function fnPV(Reference As Long, N_C2) As Double
'MaN_Article = Nz(MaN_Article)
'MaN_Article = Val(MaN_Article)
Dim bd As DAO.Database
Dim enr As DAO.Recordset
Dim QTE As Long
Dim PBE As Long
Dim QBE As Long
QTE = 0
PBE = 0
QBE = 0
Set bd = OpenDatabase("c:bdInformatique FrSous Commande
RevendeursQTE_SCo.mdb") Set enr = bd.OpenRecordset("Select [Quantité
totale] From [Quantité totale Commandée] Where N_Article=" &
Reference)
While Not enr.EOF
QTE = QTE + enr(0)
enr.MoveNext
enr.Close: bd.Close
Set enr = Nothing: Set bd = Nothing
Set bd = OpenDatabase("c:Informatique FrPrix de Base
FournisseursInf_Prix_Base.mdb") Set enr = bd.OpenRecordset("Select
[QB],[PB] From [PB] Where N_Article=" & Reference) enr.MoveFirst
While Not enr.EOF
QBE = QBE + enr(0)
PBE = PBE + enr(1)
enr.MoveNext
enr.Close: bd.Close
Set enr = Nothing: Set bd = Nothing
fnPV = (((PBE - Nz(DSum("[QM]", "[PV]", "N_Article =" & Reference & "
and N_C2 = " & N_C2))) * PBE) / (QBE - Nz(DSum("[QM]", "[PV]",
"N_Article =" & Reference & " and N_C2 = " & N_C2))) - ((PBE -
Nz(DSum("[PV]", "[PV]", "N_Article =" & Reference & " and N_C2 = " &
N_C2))) / (QBE - Nz(DSum("[QM]", "[PV]", "N_Article =" & Reference & "
and N_C2 = " & N_C2))))) + (((PBE - Nz(DSum("[PV]", "[PV]", "N_Article
=" & Reference & " and N_C2 = " & N_C2))) / (QBE - Nz(DSum("[QM]",
"[PV]", "N_Article =" & Reference & " and N_C2 = " & N_C2)))) * QTE)
End Function




Avatar
Sonia
Bonjours
C'est encore moi. j'ai encore un message d'erreur de type 3085 Fonction QTE non definie. C'est bizarre je ne trouve pas d'erreur dans l'expression. Tout semble correct.Si tu veux regarder le code pour vérifier il est ci-dessous. Sinon Puis-je t'envoyer un bd exemple contenant les 4 mdb requis pour le module inferieur à 200 ko? Si oui peux tu me donner ton adresse email?
Merci d'avance
Bisous Sonia!!!

Voici le code ci dessus

Option Compare Database

Function fnPV(Reference As Long, N_C2) As Double
'MaN_Article = Nz(MaN_Article)
'MaN_Article = Val(MaN_Article)
Dim bd As DAO.Database
Dim enr As DAO.Recordset
Dim QTE As Long
Dim PBE As Long
Dim QBE As Long
QTE = 0
PBE = 0
QBE = 0
Set bd = OpenDatabase("c:bdInformatique FrSous Commande RevendeursQTE_SCo.mdb")
Set enr = bd.OpenRecordset("Select [Quantité totale] From [Quantité totale Commandée] Where N_Article=" & Reference)
While Not enr.EOF
QTE = QTE + enr(0)
enr.MoveNext
Wend
enr.Close: bd.Close
Set enr = Nothing: Set bd = Nothing
Set bd = OpenDatabase("c:Informatique FrPrix de Base FournisseursInf_Prix_Base.mdb")
Set enr = bd.OpenRecordset("Select [QB],[PB] From [PB] Where N_Article=" & Reference)
enr.MoveFirst
While Not enr.EOF
QBE = QBE + enr(0)
PBE = PBE + enr(1)
enr.MoveNext
Wend
enr.Close: bd.Close
Set enr = Nothing: Set bd = Nothing
fnPV = (((PBE - Nz(DSum("[QM]", "[PV]", "N_Article =" & Reference & " and N_C2 = " & N_C2))) * PBE) / (QBE - Nz(DSum("[QM]", "[PV]", "N_Article =" & Reference & " and N_C2 = " & N_C2))) - ((PBE - Nz(DSum("[PV]", "[PV]", "N_Article =" & Reference & " and N_C2 = " & N_C2))) / (QBE - Nz(DSum("[QM]", "[PV]", "N_Article =" & Reference & " and N_C2 = " & N_C2))))) + (((PBE - Nz(DSum("[PV]", "[PV]", "N_Article =" & Reference & " and N_C2 = " & N_C2))) / (QBE - Nz(DSum("[QM]", "[PV]", "N_Article =" & Reference & " and N_C2 = " & N_C2)))) * QTE)
End Function
1 2