OVH Cloud OVH Cloud

interoger le contenu entier d'une table par code

5 réponses
Avatar
Yann
bonjours
J'ais une fonction de sauvegarde
qui devrais tester les enregistrements de la colone d'une table pour
pouvoire faire cette sauvegarde
ca marche quand je fait
srtQuoi et egale a 1 ou 2 ou 3 ou 4 etc...5..7


If strQuoi = remA Then
MsgBox "Le N° de l'Archive existe déjà. Recomence."
End If
ou bien
----------------------------------------------------------------
If IsNull(strQuoi) Then
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO ARCHIVE ( nart, quantite, [archive n°],
description )SELECT [Bons de commande].nart, [Bons de commande].quantite,
[Bons de commande].[archive N°] AS Expr2, Feuil1.Champ9 FROM [Bons de
commande] LEFT JOIN Feuil1 ON [Bons de commande].nart = Feuil1.Champ4 ;", -1
DoCmd.SetWarnings True
End If
-------------------------------------------------------------
mais quand je fait
If remA < strQuoi Then
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO ARCHIVE ( nart, quantite, [archive n°],
description )SELECT [Bons de commande].nart, [Bons de commande].quantite,
[Bons de commande].[archive N°] AS Expr2, Feuil1.Champ9 FROM [Bons de
commande] LEFT JOIN Feuil1 ON [Bons de commande].nart = Feuil1.Champ4 ;", -1
DoCmd.SetWarnings True
End If
----------------------------------------------------
ca ne marche pas

Merci

le code complet de la fonction

Function sauv()
On Error Resume Next
Dim srtquoi As String
strQuoi = DLookup("[archive n°]", "ARCHIVE")
remA = InputBox("N° de l'Archive")
If strQuoi = remA Then
MsgBox "Le N° de l'Archive existe déjà. Recomence."
End If
If remA > strQuoi Then
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO ARCHIVE ( nart, quantite, [archive n°],
description )SELECT [Bons de commande].nart, [Bons de commande].quantite,
[Bons de commande].[archive N°] AS Expr2, Feuil1.Champ9 FROM [Bons de
commande] LEFT JOIN Feuil1 ON [Bons de commande].nart = Feuil1.Champ4 ;", -1
DoCmd.SetWarnings True
End If
If remA < strQuoi Then
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO ARCHIVE ( nart, quantite, [archive n°], descriptio
n )SELECT [Bons de commande].nart, [Bons de commande].quantite, [Bons de
commande].[archive N°] AS Expr2, Feuil1.Champ9 FROM [Bons de commande] LEFT
JOIN Feuil1 ON [Bons de commande].nart = Feuil1.Champ4 ;", -1
DoCmd.SetWarnings True
End If
If IsNull(strQuoi) Then
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO ARCHIVE ( nart, quantite, [archive n°],
description )SELECT [Bons de commande].nart, [Bons de commande].quantite,
[Bons de commande].[archive N°] AS Expr2, Feuil1.Champ9 FROM [Bons de
commande] LEFT JOIN Feuil1 ON [Bons de commande].nart = Feuil1.Champ4 ;", -1
DoCmd.SetWarnings True
End If
End Function

5 réponses

Avatar
Xavier HUE
Bonjour Yann,

Avant tout, quelques remarques:
1) Le SQL exécuté dans les trois cas est le même, tu
aurais donc avantage à regrouper tes tests pour n'exécuter
qu'une fois ce SQL. C'est plus facile à lire et à
maintenir.

2) Que cherches-tu à faire au juste? DLookup sans
critère retourne une valeur aléatoire, si le jeu
d'enregistrement du domaine consulté contient plusieurs
enregistrements. Si le but est de demander un N° d'archive
puis controler que ce N° n'existe pas, tu peux t'en sortir
comme ci-après.

3) Tu déclares srtQuoi et utilises strQuoi. Pas la même
chose ;-) donc ton Dim ne sert à rien.

4) Tu utilises remA mais ne la déclare pas. Donc remA
est déclaré implicitement en Variant.

5) Je te conseille vivement d'inclure systématiquement
la ligne "Option Explicit" dans tous tes modules. Cela
permet d'éviter beaucoup d'erreur de saisie de ce type.
Utiliser une variable non initialisée car mal déclarée te
mène à coup sûr vers un disfonctionnement.

Si "Oui" est la réponse à ma question 2, alors, voici une
solution ;-)

Function sauv2()
Dim srtquoi As String 'Prendre l'habitude de déclarer
toutes les variables en début de procédure ou fonction
'De la sorte, celles-ci ne se
trouvent pas "noyées" dans le code
'Dans cette fonction, srtquoi
est inutile. Tu peux donc supprimer cette déclaration
Dim remA As String

On Error Resume Next

'Demander un N° d'archive
remA = InputBox("N° de l'Archive")

If remA = "" Then
MsgBox "Veuillez saisir un N° d'archive. Recommencez."

Else

'Vérifier existance
If DCount("[archive n°]", "ARCHIVE", "[archive n°]='"
& remA & "'") <> 0 Then
MsgBox "Le N°" & remA & " d'Archive existe déjà.
Recommencez."

Else

DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO ARCHIVE ( nart, quantite,
[archive n°], description )SELECT [Bons de commande].nart,
[Bons de commande].quantite, [Bons de commande].[archive
N°] AS Expr2, Feuil1.Champ9 FROM [Bons de commande] LEFT
JOIN Feuil1 ON [Bons de commande].nart =
Feuil1.Champ4 ;", -1
DoCmd.SetWarnings True
End If
End If
End Function

Espérant t'avoir aidé.
Cordialement.
Xavier.

PS: Enlever blurg de l'adresse mail.
Avatar
Daniel Carollo
Bonjour Yann!

Votre code est tres difficile a lire. J'espere que vous utilisez des tabs
dans l'editeur de code. Sinon, cela expliquerait pourquoi votre code ne
marche pas.

La table Archive n'a-t-elle qu'un seul enregistrement?

A moins que quelque chose d'important (mais tout petit) m'echappe, vous
faites trois fois la meme chose, dans le cas ou strQuoi > remA, strQuoi <
remA, et strQuoi est nul. Ne serait-il pas plus aise de faire
if IsNull(strQuoi) or strQuoi <> remA Then
<procedure d'insert ici>
end if
sans avoir a re-ecrire (et a debugger) trois fois la meme chose?

De plus, dans le cas ou le numero de l'archive existe deja, vous affichez
le message a l'utilisateur, mais vous continuez a executer le code comme si
de rien n'etait...

Bon courage.

Daniel :-)

Computing Technologies International - www.computing-tech.com
We provide solutions...
P.S. Je suis maintenant disponible pour contrats à courte et moyenne durée.
Envoyer un courrier a: d a n i e l c @ c o m p u t i n g - t e c h . c o
m

"Yann" wrote in message
news:
bonjours
J'ais une fonction de sauvegarde
qui devrais tester les enregistrements de la colone d'une table pour
pouvoire faire cette sauvegarde
ca marche quand je fait
srtQuoi et egale a 1 ou 2 ou 3 ou 4 etc...5..7


If strQuoi = remA Then
MsgBox "Le N° de l'Archive existe déjà. Recomence."
End If
ou bien
----------------------------------------------------------------
If IsNull(strQuoi) Then
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO ARCHIVE ( nart, quantite, [archive n°],
description )SELECT [Bons de commande].nart, [Bons de commande].quantite,
[Bons de commande].[archive N°] AS Expr2, Feuil1.Champ9 FROM [Bons de
commande] LEFT JOIN Feuil1 ON [Bons de commande].nart = Feuil1.Champ4
;", -1

DoCmd.SetWarnings True
End If
-------------------------------------------------------------
mais quand je fait
If remA < strQuoi Then
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO ARCHIVE ( nart, quantite, [archive n°],
description )SELECT [Bons de commande].nart, [Bons de commande].quantite,
[Bons de commande].[archive N°] AS Expr2, Feuil1.Champ9 FROM [Bons de
commande] LEFT JOIN Feuil1 ON [Bons de commande].nart = Feuil1.Champ4
;", -1

DoCmd.SetWarnings True
End If
----------------------------------------------------
ca ne marche pas

Merci

le code complet de la fonction

Function sauv()
On Error Resume Next
Dim srtquoi As String
strQuoi = DLookup("[archive n°]", "ARCHIVE")
remA = InputBox("N° de l'Archive")
If strQuoi = remA Then
MsgBox "Le N° de l'Archive existe déjà. Recomence."
End If
If remA > strQuoi Then
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO ARCHIVE ( nart, quantite, [archive n°],
description )SELECT [Bons de commande].nart, [Bons de commande].quantite,
[Bons de commande].[archive N°] AS Expr2, Feuil1.Champ9 FROM [Bons de
commande] LEFT JOIN Feuil1 ON [Bons de commande].nart = Feuil1.Champ4
;", -1

DoCmd.SetWarnings True
End If
If remA < strQuoi Then
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO ARCHIVE ( nart, quantite, [archive n°],
descriptio

n )SELECT [Bons de commande].nart, [Bons de commande].quantite, [Bons de
commande].[archive N°] AS Expr2, Feuil1.Champ9 FROM [Bons de commande]
LEFT

JOIN Feuil1 ON [Bons de commande].nart = Feuil1.Champ4 ;", -1
DoCmd.SetWarnings True
End If
If IsNull(strQuoi) Then
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO ARCHIVE ( nart, quantite, [archive n°],
description )SELECT [Bons de commande].nart, [Bons de commande].quantite,
[Bons de commande].[archive N°] AS Expr2, Feuil1.Champ9 FROM [Bons de
commande] LEFT JOIN Feuil1 ON [Bons de commande].nart = Feuil1.Champ4
;", -1

DoCmd.SetWarnings True
End If
End Function




Avatar
Yann
peut ont remplacer dans la requette tou la zone [Bons de commande].[archive
N°] AS Expr2 pour eviter la resaisie du n° de l'archive.

"Xavier HUE" a écrit dans le message de news:
01e701c34c36$93f863a0$
Bonjour Yann,

Avant tout, quelques remarques:
1) Le SQL exécuté dans les trois cas est le même, tu
aurais donc avantage à regrouper tes tests pour n'exécuter
qu'une fois ce SQL. C'est plus facile à lire et à
maintenir.

2) Que cherches-tu à faire au juste? DLookup sans
critère retourne une valeur aléatoire, si le jeu
d'enregistrement du domaine consulté contient plusieurs
enregistrements. Si le but est de demander un N° d'archive
puis controler que ce N° n'existe pas, tu peux t'en sortir
comme ci-après.

3) Tu déclares srtQuoi et utilises strQuoi. Pas la même
chose ;-) donc ton Dim ne sert à rien.

4) Tu utilises remA mais ne la déclare pas. Donc remA
est déclaré implicitement en Variant.

5) Je te conseille vivement d'inclure systématiquement
la ligne "Option Explicit" dans tous tes modules. Cela
permet d'éviter beaucoup d'erreur de saisie de ce type.
Utiliser une variable non initialisée car mal déclarée te
mène à coup sûr vers un disfonctionnement.

Si "Oui" est la réponse à ma question 2, alors, voici une
solution ;-)

Function sauv2()
Dim srtquoi As String 'Prendre l'habitude de déclarer
toutes les variables en début de procédure ou fonction
'De la sorte, celles-ci ne se
trouvent pas "noyées" dans le code
'Dans cette fonction, srtquoi
est inutile. Tu peux donc supprimer cette déclaration
Dim remA As String

On Error Resume Next

'Demander un N° d'archive
remA = InputBox("N° de l'Archive")

If remA = "" Then
MsgBox "Veuillez saisir un N° d'archive. Recommencez."

Else

'Vérifier existance
If DCount("[archive n°]", "ARCHIVE", "[archive n°]='"
& remA & "'") <> 0 Then
MsgBox "Le N°" & remA & " d'Archive existe déjà.
Recommencez."

Else

DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO ARCHIVE ( nart, quantite,
[archive n°], description )SELECT [Bons de commande].nart,
[Bons de commande].quantite, [Bons de commande].[archive
N°] AS Expr2, Feuil1.Champ9 FROM [Bons de commande] LEFT
JOIN Feuil1 ON [Bons de commande].nart Feuil1.Champ4 ;", -1
DoCmd.SetWarnings True
End If
End If
End Function

Espérant t'avoir aidé.
Cordialement.
Xavier.

PS: Enlever blurg de l'adresse mail.
Avatar
Xavier HUE
peut ont remplacer dans la requette tou la zone [Bons de
commande].[archive

N°] AS Expr2 pour eviter la resaisie du n° de l'archive.
Absolument.

Cela m'a échappé ;-)

DoCmd.RunSQL "INSERT INTO ARCHIVE ( nart, quantite, '"
& remA & "', description )SELECT [Bons de
commande].nart, ...etc...

Si ca ne marche pas avec les simples quotes '
Essayer en mettant double guillemet à la place comme ceci:

DoCmd.RunSQL "INSERT INTO ARCHIVE ( nart, quantite, """
& remA & """, description )SELECT [Bons de
commande].nart, ...etc...

Cordialement.

Avatar
Yann
Re encore merci pour ton aide

ca marche bien



"Xavier HUE" a écrit dans le message de news:
085c01c34c46$028a5df0$
peut ont remplacer dans la requette tou la zone [Bons de
commande].[archive

N°] AS Expr2 pour eviter la resaisie du n° de l'archive.
Absolument.

Cela m'a échappé ;-)

DoCmd.RunSQL "INSERT INTO ARCHIVE ( nart, quantite, '"
& remA & "', description )SELECT [Bons de
commande].nart, ...etc...

Si ca ne marche pas avec les simples quotes '
Essayer en mettant double guillemet à la place comme ceci:

DoCmd.RunSQL "INSERT INTO ARCHIVE ( nart, quantite, """
& remA & """, description )SELECT [Bons de
commande].nart, ...etc...

Cordialement.