OVH Cloud OVH Cloud

Ajout de données a table avec requete

18 réponses
Avatar
Txl
Bonjour,

Je voudrais ajouter des données issues de requetes de calcul a une table
mais avec une logique un peu spéciale.

Je voudrais que lorsque la base fait une opération comme l'ouverture ou la
fermeture de tel ou tel formulaire des calculs soient faits d'un nombre
d'enregistrements avec des cases à cocher et que les résultats de ces
calculs soient stockés dans une table avec la date du jour, par exemple :



Date A B C
11/07/04 18 24 54
12/07/04 21 14 21
13/07/04 5 14 12
15/07/04 25 32 45

Et ainsi de suite...

Jusque la ca marche car je peux avec une requete ajout prendre les valeurs
calculées A B et C et les mettre dans les champs A B et C de la table,
mais le problème vient du fait que j'aimerais n'avoir qu'une seule valeur
par jour et pas une à chaque fois que les calculs sont faits, en fait
j'aimerai qu'a chaque fois qu'un calcul est fait la valeur REMPLACE celle
de la journée en cours, par exemple si le 15/07 je fais le calcul a 10h30
et a 17h30 je ne veux garder que la valeur de 17h30 et je me moque de
celle de 10h30., c'est pour faire des statistiques journalières et donc je
ne veux pas avoir 12 enregistrements pour le 15/07.

Pour le moment je fais ca avec une requete qui efface les valeurs
d'aujourd'hui avant de calculer les nouvelles valeurs mais ce n'est pas
très élégant et assez lourd en ressources car il faut lancer une macro qui
execute les 2 requetes et comme la base tourne en réseau sur 20+ postes ca
ralentit le bazar.

Merci de votre aide

8 réponses

1 2
Avatar
Txl
Rebonjour

merci pour vos tuyaux, j'ai réecrit le code comme suite, c'est bon ?

Je ne peus pas récupérer les calculs dans 1 seule requete, j'ouvre donc
les 3 requetes en récupérant à chaque fois le bon résultat.

J'ai aussi refait les dim pour mes variables comme me l'a indiqué 3stone.

Par contre ma macro "stats" qui appele la fonction txl() me dit que la
focntion n'existe pas,; il faut l'enregistrer comment ?

Merci encore




Function txl()
Dim strSQL As String
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("rqoffrescrees")
tr = rst(0)
rst.Close: Set rst = Nothing
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("rqoffressucces")
ts = rst(0)
rst.Close: Set rst = Nothing
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("rqoffresxmises")
te = rst(0)
rst.Close: Set rst = Nothing
Dim tr As Integer
Dim ts As Integer
Dim te As Integer
If Not IsNull(DLookup("[Dateenr]", "Tblstat", "[dateenr]=#" &
Format(Date, "mm/dd/yy") & "#")) Then
strSQL = "Update tblstat set tr=" & tr & ", ts=" & ts & ", te=" &
te & " Where dateenr=#" & Format(Date, "mm/dd/yy") & "#;"
Else
strSQL = "Insert Into Tblstat(dateenr, tr, te, ts)" & " Values(#"
& Format(Date, "mm/dd/yy") & "#," & tr & "," & te & "," & ts & ");"
End If
CurrentDb.Execute strSQL
End Function




re Txl,

Ta procédure est bonne mais il te manque les valeurs de :
rqoffrescrees.CompteDeref
rqoffresxmises.CompteDedatetransmission
rqoffressucces.CompteDesucces
Ces 3 valeurs proviennent de ta requête. Celle-ci retourne un seul
enregistrement pour la date du jour ?

Si c'est le cas, il faut que tu mettes en début de ta procédure
(transformée en Function pour ton appel par macro) sous les instructions
Dim... en oubliant pas de modifier Dim tr, te, ts as Integer en
Dim tr as Integer, ts as Integer, te as Integer comme te l'a signalé
Pierre

Dim rst as DAO.Recordset
set rst=CurrentDB.Openrecordset("NomDeLaRequêteQuiFaitLesCalculs")
' en supposant que les champs sont dans cet ordre dans la '
' requête:CompteDeref, CompteDedatetransmission, CompteDesucces
tr=rst(0):te=rst(1):ts=rst(2)
rst.Close:set rst=Nothing ' on ferme le Recordset et on récupère la
place mémoire

A+
Eric

N'oublies pas de cocher la Référence DAO 3.x Object Library (Menu
Outils|Références)

Txl écrivait news::

Coucou,

Voila mon module "stats" une fois sauvé, que faire pour le transformer
en fonction ? il suffit juste de remplacer sub et end sub par
function et end function ?

Pour etre franc je ne sais pas quelles différences il y a entre sub,
module fonction et autres joyeusetés d'access.

Encore merci pour ton aide.




Sub RechDateValeursTxl()
Dim strSQL As String
Dim tr, ts, te As Integer
tr = rqoffrescrees.CompteDeref: te >> rqoffresxmises.CompteDedatetransmission: ts >> rqoffressucces.CompteDesucces
If Not IsNull(DLookup("[Dateenr]", "Tblstat", "[dateenr]=#" &
Format(Date, "mm/dd/yy") & "#")) Then
strSQL = "Update tblstat set tr=" & tr & ", ts=" & ts & ",
te=" &
te & " Where dateenr=#" & Format(Date, "mm/dd/yy") & "#;"
Else
strSQL = "Insert Into Tblstat(dateenr, tr, te, ts)" & "
Values(#"
& Format(Date, "mm/dd/yy") & "#," & tr & "," & te & "," & ts & ");"
End If
CurrentDb.Execute strSQL
End Sub


re,

Voila un exemple de la procédure:
Elle manipule une table nommée TableDate ayant 4 champs: UneDate,
ChampA, ChampB, ChampC.
On regarde si l'enregistrement pour la date courante existe ou non,
si c'est le cas on fait un Update sinon on ajoute l'enregistrement à
la table.

J'ai mis dans mon exemple des valeurs pour les 3 champs en dur,
histoire de tester le sql. Toi, tu devras récupérer ces valeurs à
partir de tes requêtes.

Sub RechDateValeursTxl()
Dim strSQL As String
' les valeurs ci-dessous c'est pour le test
NewA = 100: NewB = 200: NewC = 300
'on regarde si la recherche aboutie
If Not IsNull(DLookup("[UneDate]", "TableDate", "[UneDate]=#" _
& Format(Date, "mm/dd/yy") & "#")) Then
'si l'enregistrement existe pour cette date
' on définit un sql d'insertion
strSQL = "Update TableDate set ChampA=" & NewA & ", ChampB="
&
NewB & ", ChampC=" & NewC _
& " Where UneDate=#" & Format(Date, "mm/dd/yy") & "#;"
Else
'si l'enregistrement à cette date n'existe pas on fait un sql
d'ajout
strSQL = "Insert Into TableDate(UneDate, ChampA, ChampB,
ChampC)" _
& " Values(#" & Format(Date, "mm/dd/yy") & "#," & NewA & ","
&
NewB _
& "," & NewC & ");"
End If
' on execute le SQL validé par le If Not IsNull(...)
CurrentDb.Execute strSQL
End Sub

Une fois que tu as modifié ton code pour récupérer les valeurs, tu
changes le Sub en Function (on va utiliser les "effets de bord" !!!)
pour pouvoir faire exécuter cette fonction à partir d'une macro.

(Plus "beau" mais plus long : Créer une fonction dont la seule
instruction est d'appeler la procédure. Fonction appelée à son tour
par une macro avec la commande ExécuterCode)

A+
Eric

Txl écrivait news::

Ben j'ai fait un module comme suit mais bien sur ca ne marche pas

Option Compare Database
Dim x As Boolean


x = DLookup("[dateenr]", "tblstats", "[dateenr]=now()")
If x = True Then
Delete tblstat.dateenr, tblstat.tr, tblstat.te, tblstat.ts
FROM tblstat

INSERT INTO tblstat ( tr, te, ts )
SELECT rqoffrescrees.CompteDeref,
rqoffresxmises.CompteDedatetransmission,
rqoffressucces.CompteDesucces
FROM rqoffrescrees, rqoffressucces, rqoffresxmises

Else
INSERT INTO tblstat ( tr, te, ts )
SELECT [rqoffrescrees.CompteDeref],
[rqoffresxmises.CompteDedatetransmission],
[rqoffressucces.CompteDesucces]
FROM rqoffrescrees, rqoffressucces, rqoffresxmises


COmme tu peux le voir les résultats des comptes sont appelés dans 3
requetes supplémentaires et( à la compilation il me dit que
l'argument
case est manquant.

Je veux bien essayer ton exemple car je ne comprends rien au VBA et
à sa syntaxe maudite (un coup des . un coup des ; un coup des !
enbfin bref, trop compliqué pour moi....)

Merci beaucoup de ton aide

ps : tu peux me mailer le tout sur sans problèmes









re,

Oui en VBA et si tu veux je peux te faire passer la procédure.

Si tu veux l'appeler par une macro, il faudra la transformer en
fonction car une macro, si mes souvenirs sont bons, peut exécuter
du code mais seulement des fonctions et pas des procédures. (Du
moins sous W2k).

Je tiens ca à ta dispo car j'avais préparé un exemple. A toi de
voir si tu veux chercher par toi-même ou t'aider de l'exemple.

A+
Eric

Txl écrivait
news::

On Thu, 15 Jul 2004 02:57:19 -0700, Eric
wrote:

Bonjour Txl,

Moi je te propose de faire une recherche dans ta table de
l'enregistrement correspondant à la date du jour avec la fonction
DlookUp.
Si elle retourne Null, tu fais un SQL d'ajout dans la table,
sinon un sql de mise à jour des champs pour cette date.
Ca te fait qu'une seule requête à exécuter.

Ca te conviendrait ?


Ca me conviendrait très bien comme système et ca parait assez
logique comme idée, mais je suppose que ce genre de truc ne peut
se faire qu'en VBA, donc je crée un module de code que j'appéle à
partir de ma macro c'est ca ?

Je vais m'attaquer au code ce qui va bien faire rigoler le
compilateur
VBA....

Merci de la suggestion

JC





A+
Eric

Txl écrivait
news::

Complément d'information :

Avec mon système de suppression avant nouvelle création cela ne
marche pas si il n'y a pas d'enregistrement pour la date du
jour puisque la requete de suppression me donne une erreur
"impossible de supprimer dans la table spécifiée" ce qui est
juste puisque les valeurs n'ont pas encore été stockées, donc
il me faudrait un truc du genre

s'il existe un enregistrement avec la date du jour remplace les
valeurs par les nouvelles, sinon crées un enregistrement avec
la date du jour et stockes les valeurs

Encore merci de votre aide




Bonjour,

Je voudrais ajouter des données issues de requetes de calcul a
une table mais avec une logique un peu spéciale.

Je voudrais que lorsque la base fait une opération comme
l'ouverture ou la fermeture de tel ou tel formulaire des
calculs soient faits d'un nombre d'enregistrements avec des
cases à cocher et que les résultats de ces calculs soient
stockés dans une table avec la date du jour, par exemple :



Date A B C
11/07/04 18 24 54
12/07/04 21 14 21
13/07/04 5 14 12
15/07/04 25 32 45

Et ainsi de suite...

Jusque la ca marche car je peux avec une requete ajout prendre
les valeurs calculées A B et C et les mettre dans les champs A
B et C de la table, mais le problème vient du fait que
j'aimerais n'avoir qu'une seule valeur par jour et pas une à
chaque fois que les calculs sont faits, en fait j'aimerai qu'a
chaque fois qu'un calcul est fait la valeur REMPLACE celle de
la journée en cours, par exemple si le 15/07 je fais le calcul
a 10h30 et a 17h30 je ne veux garder que la valeur de 17h30 et
je me moque de celle de 10h30., c'est pour faire des
statistiques journalières et donc je ne veux pas avoir 12
enregistrements pour le 15/07.

Pour le moment je fais ca avec une requete qui efface les
valeurs d'aujourd'hui avant de calculer les nouvelles valeurs
mais ce n'est pas très élégant et assez lourd en ressources
car il faut lancer une macro qui execute les 2 requetes et
comme la base tourne en réseau sur 20+ postes ca ralentit le
bazar.

Merci de votre aide

























--
Email contact

http://cerbermail.com/?ltQ8eCFmRa









Avatar
Eric
Bonjour Txl,

Il faut que ta fonction Txl()soit écrite dans un module Standard et non
de formulaire.

Ta macro aura une action : ExécuterCode - Nom de la fonction : Txl()

Eric

Txl écrivait news::

Rebonjour

merci pour vos tuyaux, j'ai réecrit le code comme suite, c'est bon ?

Je ne peus pas récupérer les calculs dans 1 seule requete, j'ouvre
donc les 3 requetes en récupérant à chaque fois le bon résultat.

J'ai aussi refait les dim pour mes variables comme me l'a indiqué
3stone.

Par contre ma macro "stats" qui appele la fonction txl() me dit que la
focntion n'existe pas,; il faut l'enregistrer comment ?

Merci encore




Function txl()
Dim strSQL As String
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("rqoffrescrees")
tr = rst(0)
rst.Close: Set rst = Nothing
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("rqoffressucces")
ts = rst(0)
rst.Close: Set rst = Nothing
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("rqoffresxmises")
te = rst(0)
rst.Close: Set rst = Nothing
Dim tr As Integer
Dim ts As Integer
Dim te As Integer
If Not IsNull(DLookup("[Dateenr]", "Tblstat", "[dateenr]=#" &
Format(Date, "mm/dd/yy") & "#")) Then
strSQL = "Update tblstat set tr=" & tr & ", ts=" & ts & ",
te=" &
te & " Where dateenr=#" & Format(Date, "mm/dd/yy") & "#;"
Else
strSQL = "Insert Into Tblstat(dateenr, tr, te, ts)" & "
Values(#"
& Format(Date, "mm/dd/yy") & "#," & tr & "," & te & "," & ts & ");"
End If
CurrentDb.Execute strSQL
End Function




re Txl,

Ta procédure est bonne mais il te manque les valeurs de :
rqoffrescrees.CompteDeref rqoffresxmises.CompteDedatetransmission
rqoffressucces.CompteDesucces Ces 3 valeurs proviennent de ta
requête. Celle-ci retourne un seul enregistrement pour la date du
jour ?

Si c'est le cas, il faut que tu mettes en début de ta procédure
(transformée en Function pour ton appel par macro) sous les
instructions Dim... en oubliant pas de modifier Dim tr, te, ts as
Integer en Dim tr as Integer, ts as Integer, te as Integer comme te
l'a signalé Pierre

Dim rst as DAO.Recordset
set
rst=CurrentDB.Openrecordset("NomDeLaRequêteQuiFaitLesCalculs"
) ' en supposant que les champs sont dans cet ordre dans la
'
' requête:CompteDeref, CompteDedatetransmission, CompteDesucces
tr=rst(0):te=rst(1):ts=rst(2)
rst.Close:set rst=Nothing ' on ferme le Recordset et on
récupère la
place mémoire

A+
Eric

N'oublies pas de cocher la Référence DAO 3.x Object Library (Menu
Outils|Références)

Txl écrivait news::

Coucou,

Voila mon module "stats" une fois sauvé, que faire pour le
transformer en fonction ? il suffit juste de remplacer sub et end
sub par function et end function ?

Pour etre franc je ne sais pas quelles différences il y a entre sub,
module fonction et autres joyeusetés d'access.

Encore merci pour ton aide.




Sub RechDateValeursTxl()
Dim strSQL As String
Dim tr, ts, te As Integer
tr = rqoffrescrees.CompteDeref: te >>> rqoffresxmises.CompteDedatetransmission: ts >>> rqoffressucces.CompteDesucces
If Not IsNull(DLookup("[Dateenr]", "Tblstat", "[dateenr]=#" &
Format(Date, "mm/dd/yy") & "#")) Then
strSQL = "Update tblstat set tr=" & tr & ", ts=" & ts & ",
te=" &
te & " Where dateenr=#" & Format(Date, "mm/dd/yy") & "#;"
Else
strSQL = "Insert Into Tblstat(dateenr, tr, te, ts)" & "
Values(#"
& Format(Date, "mm/dd/yy") & "#," & tr & "," & te & "," & ts & ");"
End If
CurrentDb.Execute strSQL
End Sub


re,

Voila un exemple de la procédure:
Elle manipule une table nommée TableDate ayant 4 champs: UneDate,
ChampA, ChampB, ChampC.
On regarde si l'enregistrement pour la date courante existe ou non,
si c'est le cas on fait un Update sinon on ajoute l'enregistrement
à la table.

J'ai mis dans mon exemple des valeurs pour les 3 champs en dur,
histoire de tester le sql. Toi, tu devras récupérer ces valeurs à
partir de tes requêtes.

Sub RechDateValeursTxl()
Dim strSQL As String
' les valeurs ci-dessous c'est pour le test
NewA = 100: NewB = 200: NewC = 300
'on regarde si la recherche aboutie
If Not IsNull(DLookup("[UneDate]", "TableDate", "[UneDate]=#" _
& Format(Date, "mm/dd/yy") & "#")) Then
'si l'enregistrement existe pour cette date
' on définit un sql d'insertion
strSQL = "Update TableDate set ChampA=" & NewA & ",
ChampB=" &
NewB & ", ChampC=" & NewC _
& " Where UneDate=#" & Format(Date, "mm/dd/yy") & "#;"
Else
'si l'enregistrement à cette date n'existe pas on fait un
sql d'ajout strSQL = "Insert Into TableDate(UneDate,
ChampA, ChampB,
ChampC)" _
& " Values(#" & Format(Date, "mm/dd/yy") & "#," & NewA &
"," &
NewB _
& "," & NewC & ");"
End If
' on execute le SQL validé par le If Not IsNull(...)
CurrentDb.Execute strSQL
End Sub

Une fois que tu as modifié ton code pour récupérer les valeurs, tu
changes le Sub en Function (on va utiliser les "effets de bord"
!!!) pour pouvoir faire exécuter cette fonction à partir d'une
macro.

(Plus "beau" mais plus long : Créer une fonction dont la seule
instruction est d'appeler la procédure. Fonction appelée à son tour
par une macro avec la commande ExécuterCode)

A+
Eric

Txl écrivait
news::

Ben j'ai fait un module comme suit mais bien sur ca ne marche pas

Option Compare Database
Dim x As Boolean


x = DLookup("[dateenr]", "tblstats", "[dateenr]=now()")
If x = True Then
Delete tblstat.dateenr, tblstat.tr, tblstat.te, tblstat.ts
FROM tblstat

INSERT INTO tblstat ( tr, te, ts )
SELECT rqoffrescrees.CompteDeref,
rqoffresxmises.CompteDedatetransmission,
rqoffressucces.CompteDesucces
FROM rqoffrescrees, rqoffressucces, rqoffresxmises

Else
INSERT INTO tblstat ( tr, te, ts )
SELECT [rqoffrescrees.CompteDeref],
[rqoffresxmises.CompteDedatetransmission],
[rqoffressucces.CompteDesucces]
FROM rqoffrescrees, rqoffressucces, rqoffresxmises


COmme tu peux le voir les résultats des comptes sont appelés dans
3 requetes supplémentaires et( à la compilation il me dit que
l'argument
case est manquant.

Je veux bien essayer ton exemple car je ne comprends rien au VBA
et à sa syntaxe maudite (un coup des . un coup des ; un coup des
! enbfin bref, trop compliqué pour moi....)

Merci beaucoup de ton aide

ps : tu peux me mailer le tout sur sans problèmes









re,

Oui en VBA et si tu veux je peux te faire passer la procédure.

Si tu veux l'appeler par une macro, il faudra la transformer en
fonction car une macro, si mes souvenirs sont bons, peut exécuter
du code mais seulement des fonctions et pas des procédures. (Du
moins sous W2k).

Je tiens ca à ta dispo car j'avais préparé un exemple. A toi de
voir si tu veux chercher par toi-même ou t'aider de l'exemple.

A+
Eric

Txl écrivait
news::

On Thu, 15 Jul 2004 02:57:19 -0700, Eric
wrote:

Bonjour Txl,

Moi je te propose de faire une recherche dans ta table de
l'enregistrement correspondant à la date du jour avec la
fonction DlookUp.
Si elle retourne Null, tu fais un SQL d'ajout dans la table,
sinon un sql de mise à jour des champs pour cette date. Ca te
fait qu'une seule requête à exécuter.

Ca te conviendrait ?


Ca me conviendrait très bien comme système et ca parait assez
logique comme idée, mais je suppose que ce genre de truc ne peut
se faire qu'en VBA, donc je crée un module de code que j'appéle
à partir de ma macro c'est ca ?

Je vais m'attaquer au code ce qui va bien faire rigoler le
compilateur
VBA....

Merci de la suggestion

JC





A+
Eric

Txl écrivait
news::

Complément d'information :

Avec mon système de suppression avant nouvelle création cela
ne marche pas si il n'y a pas d'enregistrement pour la date
du jour puisque la requete de suppression me donne une erreur
"impossible de supprimer dans la table spécifiée" ce qui est
juste puisque les valeurs n'ont pas encore été stockées, donc
il me faudrait un truc du genre

s'il existe un enregistrement avec la date du jour remplace
les valeurs par les nouvelles, sinon crées un enregistrement
avec la date du jour et stockes les valeurs

Encore merci de votre aide




Bonjour,

Je voudrais ajouter des données issues de requetes de calcul
a une table mais avec une logique un peu spéciale.

Je voudrais que lorsque la base fait une opération comme
l'ouverture ou la fermeture de tel ou tel formulaire des
calculs soient faits d'un nombre d'enregistrements avec des
cases à cocher et que les résultats de ces calculs soient
stockés dans une table avec la date du jour, par exemple :



Date A B C
11/07/04 18 24 54
12/07/04 21 14 21
13/07/04 5 14 12
15/07/04 25 32 45

Et ainsi de suite...

Jusque la ca marche car je peux avec une requete ajout
prendre les valeurs calculées A B et C et les mettre dans les
champs A B et C de la table, mais le problème vient du fait
que j'aimerais n'avoir qu'une seule valeur par jour et pas
une à chaque fois que les calculs sont faits, en fait
j'aimerai qu'a chaque fois qu'un calcul est fait la valeur
REMPLACE celle de la journée en cours, par exemple si le
15/07 je fais le calcul a 10h30 et a 17h30 je ne veux garder
que la valeur de 17h30 et je me moque de celle de 10h30.,
c'est pour faire des statistiques journalières et donc je ne
veux pas avoir 12 enregistrements pour le 15/07.

Pour le moment je fais ca avec une requete qui efface les
valeurs d'aujourd'hui avant de calculer les nouvelles valeurs
mais ce n'est pas très élégant et assez lourd en ressources
car il faut lancer une macro qui execute les 2 requetes et
comme la base tourne en réseau sur 20+ postes ca ralentit le
bazar.

Merci de votre aide




































Avatar
Txl
On Mon, 19 Jul 2004 07:58:49 -0700, Eric wrote:

Bonjour Txl,

Il faut que ta fonction Txl()soit écrite dans un module Standard et non
de formulaire.

Ta macro aura une action : ExécuterCode - Nom de la fonction : Txl()

Eric




Ok, merci du truc

Donc mon module est dans la page "modules" avec les forms, les états, les
tables et requetes et mon module se compose du texte suivant complet pompé
dans le VBA editor

Option Compare Database
Function txl()
Dim strSQL As String
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("rqoffrescrees")
tr = rst(0)
rst.Close: Set rst = Nothing
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("rqoffressucces")
ts = rst(0)
rst.Close: Set rst = Nothing
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("rqoffresxmises")
te = rst(0)
rst.Close: Set rst = Nothing
Dim tr, ts, te As Integer
Dim ts As Integer
Dim te As Integer
If Not IsNull(DLookup("[Dateenr]", "Tblstat", "[dateenr]=#" &
Format(Date, "mm/dd/yy") & "#")) Then
strSQL = "Update tblstat set tr=" & tr & ", ts=" & ts & ", te=" &
te & " Where dateenr=#" & Format(Date, "mm/dd/yy") & "#;"
Else
strSQL = "Insert Into Tblstat(dateenr, tr, te, ts)" & " Values(#"
& Format(Date, "mm/dd/yy") & "#," & tr & "," & te & "," & ts & ");"
End If
CurrentDb.Execute strSQL
End Function



Comment je sais si c'est un module "standard" ou spécial ou d'un autre
type ?

Désolé pour les questions idiotes mais je nage complètement (en fait je
coule meme pas mal, ha ha ha)

Merci

Avatar
Eric
re,

Tes déclarations de variables (Dim) doivent être faites avant leur
affectation. Ca donne:

Dim strSQL As String
Dim rst As DAO.Recordset
Dim tr As Integer
Dim ts As Integer
Dim te As Integer

et ce n'est qu'après que tu fais l'affectation du genre :
tr = rst(0) ...

Pour info, j'aurai nommé les variables tr, ts, te comme suit :
intTr,intTs, intTe pour les différencier des champs de ta table. En les
prefixant par "int" on sait qu'il s'agit de variable de type Integer.

Ta fonction Txl() doit être écrite dans un Module standard puisque tu
veux la faire exécuter par une macro. Pour accéder à un module Standard,
dans la fenêtre de la Base de données, tu cliques sur l'onglet Modules
puis Nouveau ou Modifier suivant le cas. Ce qui différencie un module
standard d'un module de formulaire ou d'état, c'est qu'il n'y a *aucune*
procédure évènementielle dans un module standard. Ils sont destinés à
recevoir les procédures ou fonctions de portée générale à l'application.
Quand tu mets un bouton dans un formulaire et que sur ce bouton, via la
fenêtre des propriétés, par exemple sur Clic, tu mets une procédure
évènementielle alors tu écris le code dans le module du formulaire. C'est
simple à différencier. Toute procédure évènementielle commence par
Private puis le nom du contrôle et enfin _TypeEvènement avec
éventuellement des arguments.

Exemple:
Private Sub Commande5_Click() <---- il s'agit d'un module de formulaire.
Procédure accessible uniquement dans ce formulaire et lors de l'évènement
Clic sur le bouton de commande nomé Commande5.

Les procédures(Sub) ou fonctions (Function) écrites dans les modules
standards sont chargées au démarrage de l'application. Donc ca consomme
des ressources même si celles-ci ne sont pas immédiatement utilisées.

Les procédures (Private Sub, Sub) ou fonction (function) écrites dans les
modules associées aux formulaires ou états ne sont chargées par
l'application qu'au moment ou le formulaire/état est chargé en mémoire,
donc économie de ressources.

Voila, j'espère que ces quelques remarques t'aideront à poursuivre en
VBA.

A+
Eric

PS: Il existe aussi des modules de classe mais ca sera pour une autre
fois. ;-))



Ok, merci du truc

Donc mon module est dans la page "modules" avec les forms, les états,
les tables et requetes et mon module se compose du texte suivant
complet pompé dans le VBA editor

Option Compare Database
Function txl()
Dim strSQL As String
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("rqoffrescrees")
tr = rst(0)
rst.Close: Set rst = Nothing
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("rqoffressucces")
ts = rst(0)
rst.Close: Set rst = Nothing
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("rqoffresxmises")
te = rst(0)
rst.Close: Set rst = Nothing
Dim tr, ts, te As Integer
Dim ts As Integer
Dim te As Integer
If Not IsNull(DLookup("[Dateenr]", "Tblstat", "[dateenr]=#" &
Format(Date, "mm/dd/yy") & "#")) Then
strSQL = "Update tblstat set tr=" & tr & ", ts=" & ts & ",
te=" &
te & " Where dateenr=#" & Format(Date, "mm/dd/yy") & "#;"
Else
strSQL = "Insert Into Tblstat(dateenr, tr, te, ts)" & "
Values(#"
& Format(Date, "mm/dd/yy") & "#," & tr & "," & te & "," & ts & ");"
End If
CurrentDb.Execute strSQL
End Function



Comment je sais si c'est un module "standard" ou spécial ou d'un autre
type ?

Désolé pour les questions idiotes mais je nage complètement (en fait
je coule meme pas mal, ha ha ha)

Merci



Avatar
Txl
Hello,

Ben y'a rien à faire ca marche toujours pas

j'ai le code suivant avec les corrections que tu m'as données.

Function txl()
Dim strSQL As String
Dim rst As DAO.Recordset
Dim tr As Integer
Dim ts As Integer
Dim te As Integer
Set rst = CurrentDb.OpenRecordset("rqoffrescrees")
tr = rst(0)
rst.Close: Set rst = Nothing
Set rst = CurrentDb.OpenRecordset("rqoffressucces")
ts = rst(0)
rst.Close: Set rst = Nothing
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("rqoffresxmises")
te = rst(0)
rst.Close: Set rst = Nothing

If Not IsNull(DLookup("[Dateenr]", "Tblstat", "[dateenr]=#" &
Format(date, "mm/dd/yy") & "#")) Then
strSQL = "Update tblstat set tr=" & tr & ", ts=" & ts & ", te=" &
te & " Where dateenr=#" & Format(date, "mm/dd/yy") & "#;"
Else
strSQL = "Insert Into Tblstat(dateenr, tr, te, ts)" & " Values(#"
& Format(date, "mm/dd/yy") & "#," & tr & "," & te & "," & ts & ");"
End If
CurrentDb.Execute strSQL
End Function


le tout est sauvé dans le module "txl", je fais une macro avec "executer
code", dans le nom de fonction je mets txl() et rien à faire ca me dit que
ca ne trouve pas la fonction txl()

Je vais meme chercher le nom de la fonction en passant par l'explorateur
d'objets dans le mode création de la macro et je ne peux tjs pas lancer
cette maudite fonction...qui pour lui n'existe pas.

Que dois-je faire ?

Y'a pas un truc à faire au chargement de la base pour lui dire que j'ai
crée une fonction et qu'il doit la charger en mémoire en attendant que je
l'appele ?

Merci de ton aide








re,

Tes déclarations de variables (Dim) doivent être faites avant leur
affectation. Ca donne:

Dim strSQL As String
Dim rst As DAO.Recordset
Dim tr As Integer
Dim ts As Integer
Dim te As Integer

et ce n'est qu'après que tu fais l'affectation du genre :
tr = rst(0) ...

Pour info, j'aurai nommé les variables tr, ts, te comme suit :
intTr,intTs, intTe pour les différencier des champs de ta table. En les
prefixant par "int" on sait qu'il s'agit de variable de type Integer.

Ta fonction Txl() doit être écrite dans un Module standard puisque tu
veux la faire exécuter par une macro. Pour accéder à un module Standard,
dans la fenêtre de la Base de données, tu cliques sur l'onglet Modules
puis Nouveau ou Modifier suivant le cas. Ce qui différencie un module
standard d'un module de formulaire ou d'état, c'est qu'il n'y a *aucune*
procédure évènementielle dans un module standard. Ils sont destinés à
recevoir les procédures ou fonctions de portée générale à l'application.
Quand tu mets un bouton dans un formulaire et que sur ce bouton, via la
fenêtre des propriétés, par exemple sur Clic, tu mets une procédure
évènementielle alors tu écris le code dans le module du formulaire. C'est
simple à différencier. Toute procédure évènementielle commence par
Private puis le nom du contrôle et enfin _TypeEvènement avec
éventuellement des arguments.

Exemple:
Private Sub Commande5_Click() <---- il s'agit d'un module de formulaire.
Procédure accessible uniquement dans ce formulaire et lors de l'évènement
Clic sur le bouton de commande nomé Commande5.

Les procédures(Sub) ou fonctions (Function) écrites dans les modules
standards sont chargées au démarrage de l'application. Donc ca consomme
des ressources même si celles-ci ne sont pas immédiatement utilisées.

Les procédures (Private Sub, Sub) ou fonction (function) écrites dans les
modules associées aux formulaires ou états ne sont chargées par
l'application qu'au moment ou le formulaire/état est chargé en mémoire,
donc économie de ressources.

Voila, j'espère que ces quelques remarques t'aideront à poursuivre en
VBA.

A+
Eric

PS: Il existe aussi des modules de classe mais ca sera pour une autre
fois. ;-))



Ok, merci du truc

Donc mon module est dans la page "modules" avec les forms, les états,
les tables et requetes et mon module se compose du texte suivant
complet pompé dans le VBA editor

Option Compare Database
Function txl()
Dim strSQL As String
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("rqoffrescrees")
tr = rst(0)
rst.Close: Set rst = Nothing
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("rqoffressucces")
ts = rst(0)
rst.Close: Set rst = Nothing
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("rqoffresxmises")
te = rst(0)
rst.Close: Set rst = Nothing
Dim tr, ts, te As Integer
Dim ts As Integer
Dim te As Integer
If Not IsNull(DLookup("[Dateenr]", "Tblstat", "[dateenr]=#" &
Format(Date, "mm/dd/yy") & "#")) Then
strSQL = "Update tblstat set tr=" & tr & ", ts=" & ts & ",
te=" &
te & " Where dateenr=#" & Format(Date, "mm/dd/yy") & "#;"
Else
strSQL = "Insert Into Tblstat(dateenr, tr, te, ts)" & "
Values(#"
& Format(Date, "mm/dd/yy") & "#," & tr & "," & te & "," & ts & ");"
End If
CurrentDb.Execute strSQL
End Function



Comment je sais si c'est un module "standard" ou spécial ou d'un autre
type ?

Désolé pour les questions idiotes mais je nage complètement (en fait
je coule meme pas mal, ha ha ha)

Merci







--
Email contact

http://cerbermail.com/?ltQ8eCFmRa


Avatar
3stone
Salut,

"Txl"

Function txl()
Dim strSQL As String
Dim rst As DAO.Recordset


<snip>



le tout est sauvé dans le module "txl", je fais une macro avec "executer



Sans regarder le code ;-)


Il ne faut pas que le module porte le nom d'une fonction qui s'y trouve!

Préfixe ton module par mod_ comme mod_TXL



--
A+
Pierre (3stone) Access MVP
-----------------------------
http://users.skynet.be/mpfa
-----------------------------

Avatar
Txl
Ben voila, mon soucie est résole, il y avait encore une erreur dans le
code avec un dim en trop mais celui la je l'ai résolu tout seul, comme un
grand (ou presque)

Merci beaucoup a tous les deux pour cette aide précieuse...

Dernière question : ca marche dans un runtime une fonction de ce type ou
il faut impérativement avoir access ?

A bientot

TXL le boulet



Salut,

"Txl"

Function txl()
Dim strSQL As String
Dim rst As DAO.Recordset


<snip>



le tout est sauvé dans le module "txl", je fais une macro avec "executer



Sans regarder le code ;-)


Il ne faut pas que le module porte le nom d'une fonction qui s'y
trouve!

Préfixe ton module par mod_ comme mod_TXL



--
A+
Pierre (3stone) Access MVP
-----------------------------
http://users.skynet.be/mpfa
-----------------------------








--
Email contact

http://cerbermail.com/?ltQ8eCFmRa


Avatar
3stone
Salut Txl,

"Txl"

Dernière question :


Des idées de suicide ?

;-)))


ca marche dans un runtime une fonction de ce type ou
il faut impérativement avoir access ?


Le runtime empêche principalement les modifications du style:

"J'ouvre le formulaire en mode création, le modifie pour
le sauver sous sa nouvelle forme"

ca, ca ne fonctionne définitivement pas !


--
A+
Pierre (3stone) Access MVP
-----------------------------
http://users.skynet.be/mpfa
-----------------------------

1 2