Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Access 2010 Filtre sur formulaire et récuperer le filtre dans une table

17 réponses
Avatar
acn
Bonjour,

Je voudrais récupérer le résultat d'un filtre sur formulaire réalisé avec un bouton "Recherche" et copier le résultat dans une autre table.
Le filtre sur la table Naissances fonctionne très bien, mais je ne sais pas recopier son résultat dans une table nommée Temp_Naissances.
Voici le code du bouton "Recherche"

Private Sub CmdFiltre_Click()
On Error GoTo Err_CmdFiltre_Click
Dim f As String

f = ""

'recherche nom
If Not IsNull(Me.RNom) And Me.RNom <> "" Then
f = "Nom LIKE ""*" & Me.RNom & "*"""
End If

'recherche prenom
If Not IsNull(Me.RPrenom) And Me.RPrenom <> "" Then
If f <> "" Then
f = f & " AND Prenom LIKE ""*" & Me.RPrenom & "*"""
Else
f = "Prenom LIKE ""*" & Me.RPrenom & "*"""
End If
End If

'recherche nom mère
If Not IsNull(Me.RNomM) And Me.RNomM <> "" Then
If f <> "" Then
f = f & " AND Prenom LIKE ""*" & Me.RPrenom & "*"""
f = f & " AND NomM LIKE ""*" & Me.RNomM & "*"""
Else
f = "NomM LIKE ""*" & Me.RNomM & "*"""
End If
End If

'recherche commune
If Not IsNull(Me.RLieu) And Me.RLieu <> "" Then
If f <> "" Then
f = f & " AND Prenom LIKE ""*" & Me.RPrenom & "*"""
f = f & " AND NomM LIKE ""*" & Me.RNomM & "*"""
f = f & " AND Lieu LIKE ""*" & Me.RLieu & "*"""
Else
f = "Lieu LIKE ""*" & Me.RLieu & "*"""
End If
End If

Me.Filter = f
Me.FilterOn = True
Exit_CmdFiltre_Click:
Exit Sub
Err_CmdFiltre_Click:
MsgBox Err.Description
Resume Exit_CmdFiltre_Click
End Sub

7 réponses

1 2
Avatar
acn
Gloops a écrit le 24/10/2010 à 14h43 :
acn a écrit, le 23/10/2010 12:14 :
La fenetre de débogage se positionne sur
db.Execute sQry




Bonjour,

Par "la fenêtre de débogage se positionne sur", faut-il
entendre qu'u ne
erreur se produit, un message s'affiche, et ensuite cette instruction
est affichée surlignée en jaune ?

C'est assez classique si il y a une erreur dans la requête.

Dans la fenêtre d'exécution (celle qu'on ouvre par Ctrl G), taper
? sQry
(et appuyer sur Entrée)

Si on veut obtenir ça par une instruction placée juste avant
db.Execu te,
c'est

Debug.Print sQry

Ensuite, copier le code de la requête, tel qu'il s'affiche dans la
fenêtre d'exécution, et le coller dans l'éditeur de
requête.

C'est-à-dire, créer une nouvelle requête, fermer la
boîte de dial ogue de
choix d'une table, changer le mode d'affichage vers SQL, et coller (Ctrl
V) ce qu'on a copié par Ctrl C depuis la fenêtre
d'exécution.

Exécuter en cliquant sur le point d'exclamation rouge sur la barre
d'outils en haut de l'éditeur de requêtes, lire le message
d'erreur, il
est fort susceptible d'être plus clair que depuis un module.

Ensuite, je crois qu'on n'a plus qu'à le taper si on a une question
à
poser dessus. Pour une erreur qui se produit depuis un module, on peut
taper dans la fenêtre d'exécution ? Err.Number &
Err.Description, mai s
depuis l'éditeur de requêtes, je doute que l'équivalent
existe.


Bonjour,

J'ai fait la manip. indiquée.
Voici la requète en SQL générée:

Insert Into T_Temp (Nom, Prenom, Dates, PNomP, NomM, PNomM, Lieu, Paroisse, AN, MOIS, JOUR, Reference, Observations, INSEE) Values ("CHALON","Françoise Anne","17/11/1745","Jean","BERTON","Françoise","Loches 37132","","1745","11","17","",,"37132");

voici celle qui fonctionne:

Insert Into T_Temp (Nom, Prenom, Dates, PNomP, NomM, PNomM, Lieu, Paroisse, AN, MOIS, JOUR, Reference, Observations, INSEE) Values ("CHALON","Françoise
Anne","17/11/1745","Jean","BERTON","Françoise","Loches 37132","","1745","11","17","","","37132");

Elle fonctionne après avoir mis à jour 1 noms de champs dans la table: le champ Date est renommé en Dates, il devait y avoir un problème car Date doit être vu comme une instruction je pense.
La 2ème erreur vient de la définition du champ Observations qui a le Type de données Mémo et cela je ne peux pas le changer car les infos de ce champs dépassent les 255 caractères.
Dans la requète d'origine j'ai ajouté les "" avant "37132"); qui ne viennent pas sur le message
d'erreur et cela fonctionne.
Reste à régler le problème du Type de données Mémo;

J'espère mon explication assez claire.
Merci
Avatar
3stone
Salut,

Pourrais-tu répondre correctement dans le fil ?
et non bêtement au dernier post ?...


acn wrote:
J'ai fait la manip. indiquée.
Voici la requète en SQL générée:

Insert Into T_Temp (Nom, Prenom, Dates, PNomP, NomM, PNomM, Lieu,
Paroisse, AN, MOIS, JOUR, Reference, Observations, INSEE) Values
("CHALON","Françoise
Anne","17/11/1745","Jean","BERTON","Françoise","Loches
37132","","1745","11","17","",,"37132");

voici celle qui fonctionne:

Insert Into T_Temp (Nom, Prenom, Dates, PNomP, NomM, PNomM, Lieu,
Paroisse, AN, MOIS, JOUR, Reference, Observations, INSEE) Values
("CHALON","Françoise
Anne","17/11/1745","Jean","BERTON","Françoise","Loches
37132","","1745","11","17","","","37132");

Elle fonctionne après avoir mis à jour 1 noms de champs dans la
table: le champ Date est renommé en Dates, il devait y avoir un
problème car Date doit être vu comme une instruction je pense.




Erreur de débutant !
Il ne faut jamais utiliser de noms de fonction ou mots réservés
pour nommer les champs.
Ceci s'applique à TOUS LES OBJETS d'Access.
A lire absolument:
http://support.microsoft.com/kb/286335/fr?spid%09&sida8
http://support.microsoft.com/kb/826763/fr



La 2ème erreur vient de la définition du champ Observations qui a le
Type de données Mémo et cela je ne peux pas le changer car les infos
de ce champs dépassent les 255 caractères.
Dans la requète d'origine j'ai ajouté les "" avant "37132"); qui ne
viennent pas sur le message d'erreur et cela fonctionne.
Reste à régler le problème du Type de données Mémo;



En général, les guillemets n'ont rien à faire dans un champ...

Je regarde pour les mémo !

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)
Avatar
acn
3stone a écrit le 25/10/2010 à 16h31 :
Salut,

Pourrais-tu répondre correctement dans le fil ?
et non bêtement au dernier post ?...


acn wrote:
J'ai fait la manip. indiquée.
Voici la requète en SQL générée:

Insert Into T_Temp (Nom, Prenom, Dates, PNomP, NomM, PNomM, Lieu,
Paroisse, AN, MOIS, JOUR, Reference, Observations, INSEE) Values
("CHALON","Françoise
Anne","17/11/1745","Jean","BERTON","Françoise","Loches
37132","","1745","11","17","",,"37132");

voici celle qui fonctionne:

Insert Into T_Temp (Nom, Prenom, Dates, PNomP, NomM, PNomM, Lieu,
Paroisse, AN, MOIS, JOUR, Reference, Observations, INSEE) Values
("CHALON","Françoise
Anne","17/11/1745","Jean","BERTON","Françoise","Loches
37132","","1745","11","17","","","37132");

Elle fonctionne après avoir mis à jour 1 noms de champs dans la
table: le champ Date est renommé en Dates, il devait y avoir un
problème car Date doit être vu comme une instruction je pense.





Erreur de débutant !
Il ne faut jamais utiliser de noms de fonction ou mots réservés
pour nommer les champs.
Ceci s'applique à TOUS LES OBJETS d'Access.
A lire absolument:
http://support.microsoft.com/kb/286335/fr?spid%09&sida8
http://support.microsoft.com/kb/826763/fr



La 2ème erreur vient de la définition du champ Observations qui
a le
Type de données Mémo et cela je ne peux pas le changer car les
infos
de ce champs dépassent les 255 caractères.
Dans la requète d'origine j'ai ajouté les "" avant
"37132"); qui ne
viennent pas sur le message d'erreur et cela fonctionne.
Reste à régler le problème du Type de données
Mémo;




En général, les guillemets n'ont rien à faire dans un
champ...

Je regarde pour les mémo !

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)


Bonjour,

Je n'avais pas répondu au message précédent car cela ne provient pas de ma page Web mais c'est moi qui attendais une réponse et je n'avais pas vu l'information page suivante por la suite des message.

pour les " j'ai bien vu que les champs de la requète sont séparés par des virgule (,) et à l'intérieur des virgule la valeur du champ est entre ". pour le champ Observations qui est défini en Mémo les " n'étaient pas présent et la requète ne fonctionnait pas. Quand j'ai ajouté les " la requète fonctionne mais il reste à incorporer dansla fonction le Type Mémo comme le Type Texte ( If f.Type = dbText Then )
Voila le resultat de la requète SQL de la fenètre de débogagne avec Erreur de sybtaxe dans l'instruction INSERT INTO.
On voit bien ,,"37132"); il manque les "" entre les virgule. quand cette requète est lancée en création de requète et que j'ajoute les deux " entre les virgule la requète fonctionne.

Insert Into T_Temp (Nom, Prenom, Dates, PNomP, NomM, PNomM, Lieu, Paroisse, AN, MOIS, JOUR, Reference, Observations, INSEE) Values ("CHALON","Catherine","06/01/1747","Jean","BERTON","Françoise","Loches 37132","","1747","01","06","",,"37132");

On voit bien ,,"37132"); il manque les "" entre les deux virgules. quand cette requète est lancée en création de requète et que j'ajoute les deux " entre les virgules, la requète fonctionne.

Merci de votre patience.
Avatar
3stone
Salut,

acn wrote:
[...]
On voit bien ,,"37132"); il manque les "" entre les deux virgules.
quand cette requète est lancée en création de requète et que j'ajoute
les deux " entre les virgules, la requète fonctionne.




Essaie cette version :


Dim Db As DAO.Database
Dim sFld As String, sQry As String
Dim sF As String, sSrc As String
Dim l As Integer
Dim f As Field
Set Db = CurrentDb
'
'/ SQL de création de la table temporaire
If InStr(Me.RecordSource, "Select") Then
'source chaine sql
sF = Me.RecordSource
sSrc = Mid(sF, InStr(1, sF, "From") + 4)
sSrc = Trim(Replace(sSrc, ";", ""))
sF = Replace(sF, sSrc & ".", "")
l = InStr(sF, "From") - 1
sFld = Mid(sF, 7, l - 7)
sQry = "Select Top 1 " & sFld & " Into T_Temp " & Mid(sF, l)
Else
'source est une table
With Me.RecordsetClone
For Each f In .Fields
If Len(sFld) = 0 Then
sFld = f.Name
Else
sFld = sFld & ", " & f.Name
End If
Next f
End With
sQry = "Select TOP 1 " & sFld & " Into T_Temp From " & Me.RecordSource & ";"
End If
'/ Création de la table temporaire
With DoCmd
.SetWarnings False
.RunSQL sQry
.SetWarnings True
End With
'// Vider la table temporaire
Db.Execute "Delete * From T_Temp"
sQry = ""
'
'// Si le formulaire n'est pas vide
If Me.RecordsetClone.RecordCount > 0 Then
With Me.RecordsetClone
'// Boucler sur les enregistrements du formulaire
Do Until .EOF
'// Créer la requête SQL
sQry = "Insert Into T_Temp (" & sFld & ") Values ("
For Each f In .Fields
If f.Type = dbText Or f.Type = dbMemo Then
If IsNull(f.Value) Then
sQry = sQry & """"
Else
sQry = sQry & Chr(34) & f.Value & Chr(34) & ","
End If
Else
sQry = sQry & f.Value & ","
End If
Next f
sQry = Left(sQry, Len(sQry) - 1) & ");"
.MoveNext
Db.Execute sQry
Loop
End With
End If
'// Libérer
Set Db = Nothing


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)
Avatar
acn
3stone a écrit le 28/10/2010 à 15h20 :
Salut,

acn wrote:
[...]
On voit bien ,,"37132"); il manque les "" entre les deux
virgules.
quand cette requète est lancée en création de
requète et que j'ajoute
les deux " entre les virgules, la requète fonctionne.





Essaie cette version :


Dim Db As DAO.Database
Dim sFld As String, sQry As String
Dim sF As String, sSrc As String
Dim l As Integer
Dim f As Field
Set Db = CurrentDb
'
'/ SQL de création de la table temporaire
If InStr(Me.RecordSource, "Select") Then
'source chaine sql
sF = Me.RecordSource
sSrc = Mid(sF, InStr(1, sF, "From") + 4)
sSrc = Trim(Replace(sSrc, ";", ""))
sF = Replace(sF, sSrc & ".", "")
l = InStr(sF, "From") - 1
sFld = Mid(sF, 7, l - 7)
sQry = "Select Top 1 " & sFld & " Into T_Temp "
& Mid(sF, l)
Else
'source est une table
With Me.RecordsetClone
For Each f In .Fields
If Len(sFld) = 0 Then
sFld = f.Name
Else
sFld = sFld & ", " & f.Name
End If
Next f
End With
sQry = "Select TOP 1 " & sFld & " Into T_Temp From
" & Me.RecordSource & ";"
End If
'/ Création de la table temporaire
With DoCmd
.SetWarnings False
.RunSQL sQry
.SetWarnings True
End With
'// Vider la table temporaire
Db.Execute "Delete * From T_Temp"
sQry = ""
'
'// Si le formulaire n'est pas vide
If Me.RecordsetClone.RecordCount > 0 Then
With Me.RecordsetClone
'// Boucler sur les enregistrements du formulaire
Do Until .EOF
'// Créer la requête SQL
sQry = "Insert Into T_Temp (" & sFld & ") Values ("
For Each f In .Fields
If f.Type = dbText Or f.Type = dbMemo Then
If IsNull(f.Value) Then
sQry = sQry & """"
Else
sQry = sQry & Chr(34) & f.Value & Chr(34) & ","
End If
Else
sQry = sQry & f.Value & ","
End If
Next f
sQry = Left(sQry, Len(sQry) - 1) & ");"
.MoveNext
Db.Execute sQry
Loop
End With
End If
'// Libérer
Set Db = Nothing


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)


Bonjour,
Il y a toujours un problème pour délimiter les champs vides

Avec
If f.Type = dbText Or f.Type = dbMemo Then
If IsNull(f.Value) Then
sQry = sQry & """"

Erreur d’exécution 3075
Erreur de syntaxe (opérateur absent ) dans l’expression

Insert Insert Into T_Temp (Nom, Prenom, Dates, PNomP, NomM, PNomM, Lieu, Paroisse, AN, MOIS, JOUR, Reference, Observations, INSEE) Values ("CHALON","Jean","17/11/1777","Jean","CARATES","Anne","Sennevières 37246",""1777","11","17","""37246");
il manque des virgule pour séparer les champs vides.

Avec
If f.Type = dbText Or f.Type = dbMemo Then
If IsNull(f.Value) Then
sQry = sQry & ","

Erreur d’exécution 3075
Erreur de syntaxe dans l’expression INSERT INTO

Insert Into T_Temp (Nom, Prenom, Dates, PNomP, NomM, PNomM, Lieu, Paroisse, AN, MOIS, JOUR, Reference, Observations, INSEE) Values ("CHALON","Françoise Anne","17/11/1745","Jean","BERTON","Françoise","Loches 37132",,"1745","11","17",,,"37132");
il manque des "" entre les virgules

Je n’arrive pas à combiner les 2 expressions
sQry = sQry & """"
et
sQry = sQry & "," pour avoir le résultat voulu, car quand on passe en mode requète un champ vide est bien indiqué ,"",
j'ai fait plusieurs essais avec """," ou ",""" cela déplace les virgule ou les "" mais pas au bon endroit
"","" ne fonctionne pas car message Attendu fin d'instruction.
Je ne sais pas s'il y a une solution.
Merci
Avatar
acn
acn a écrit le 28/10/2010 à 18h12 :
3stone a écrit le 28/10/2010 à 15h20 :
Salut,

acn wrote:
[...]
On voit bien ,,"37132"); il manque les "" entre les deux
virgules.
quand cette requète est lancée en création de
requète et que j'ajoute
les deux " entre les virgules, la requète fonctionne.






Essaie cette version :


Dim Db As DAO.Database
Dim sFld As String, sQry As String
Dim sF As String, sSrc As String
Dim l As Integer
Dim f As Field
Set Db = CurrentDb
'
'/ SQL de création de la table temporaire
If InStr(Me.RecordSource, "Select") Then
'source chaine sql
sF = Me.RecordSource
sSrc = Mid(sF, InStr(1, sF, "From") + 4)
sSrc = Trim(Replace(sSrc, ";", ""))
sF = Replace(sF, sSrc & ".", "")
l = InStr(sF, "From") - 1
sFld = Mid(sF, 7, l - 7)
sQry = "Select Top 1 " & sFld & " Into T_Temp "
& Mid(sF, l)
Else
'source est une table
With Me.RecordsetClone
For Each f In .Fields
If Len(sFld) = 0 Then
sFld = f.Name
Else
sFld = sFld & ", " & f.Name
End If
Next f
End With
sQry = "Select TOP 1 " & sFld & " Into T_Temp From
" & Me.RecordSource & ";"
End If
'/ Création de la table temporaire
With DoCmd
.SetWarnings False
.RunSQL sQry
.SetWarnings True
End With
'// Vider la table temporaire
Db.Execute "Delete * From T_Temp"
sQry = ""
'
'// Si le formulaire n'est pas vide
If Me.RecordsetClone.RecordCount > 0 Then
With Me.RecordsetClone
'// Boucler sur les enregistrements du formulaire
Do Until .EOF
'// Créer la requête SQL
sQry = "Insert Into T_Temp (" & sFld & ") Values
("
For Each f In .Fields
If f.Type = dbText Or f.Type = dbMemo Then
If IsNull(f.Value) Then
sQry = sQry & """"
Else
sQry = sQry & Chr(34) & f.Value & Chr(34) & ","
End If
Else
sQry = sQry & f.Value & ","
End If
Next f
sQry = Left(sQry, Len(sQry) - 1) & ");"
.MoveNext
Db.Execute sQry
Loop
End With
End If
'// Libérer
Set Db = Nothing


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)



Bonjour,
Il y a toujours un problème pour délimiter les champs vides

Avec
If f.Type = dbText Or f.Type = dbMemo Then
If IsNull(f.Value) Then
sQry = sQry & """"

Erreur d’exécution 3075
Erreur de syntaxe (opérateur absent ) dans l’expression

Insert Insert Into T_Temp (Nom, Prenom, Dates, PNomP, NomM, PNomM, Lieu,
Paroisse, AN, MOIS, JOUR, Reference, Observations, INSEE) Values
("CHALON","Jean","17/11/1777","Jean","CARATES","Anne","Sennevières
37246",""1777","11","17","""37246");
il manque des virgule pour séparer les champs vides.

Avec
If f.Type = dbText Or f.Type = dbMemo Then
If IsNull(f.Value) Then
sQry = sQry & ","

Erreur d’exécution 3075
Erreur de syntaxe dans l’expression INSERT INTO

Insert Into T_Temp (Nom, Prenom, Dates, PNomP, NomM, PNomM, Lieu, Paroisse, AN,
MOIS, JOUR, Reference, Observations, INSEE) Values
("CHALON","Françoise
Anne","17/11/1745","Jean","BERTON","Françoise","Loches
37132",,"1745","11","17",,,"37132");
il manque des "" entre les virgules

Je n’arrive pas à combiner les 2 expressions
sQry = sQry & """"
et
sQry = sQry & "," pour avoir le résultat voulu, car
quand on passe en mode requète un champ vide est bien indiqué
,"",
j'ai fait plusieurs essais avec """," ou
",""" cela déplace les virgule ou les ""
mais pas au bon endroit
"","" ne fonctionne pas car message Attendu fin
d'instruction.
Je ne sais pas s'il y a une solution.
Merci


Bonjour,

La nuit porte conseil.
J'ai fait une copie de la table en changeant la définition Mémo en Texte et le résultat était toujours le même.
La modification finale a été de reprendre la 1ère formule et d'ajouter
Or f.Type = dbMemo Then
et cela fonctionne avec Texte et Mémo et surtout avec les champs vides.


'// Si le formulaire n'est pas vide
If Me.RecordsetClone.RecordCount > 0 Then
With Me.RecordsetClone
'// Boucler sur les enregistrements du formulaire
Do Until .EOF
'// Créer la requête SQL
sQry = "Insert Into T_Temp (" & sFld & ") Values ("
For Each f In .Fields
If f.Type = dbText Or f.Type = dbMemo Then
sQry = sQry & Chr(34) & f.Value & Chr(34) & ","
Else
sQry = sQry & f.Value & ","
End If
Next f
sQry = Left(sQry, Len(sQry) - 1) & ");"
.MoveNext
db.Execute sQry
Loop
End With
End If

Merci beaucoup de votre aide, sans vous je n'y serais pas arrivé.
Vous pouvez peut-être ne garder qu'une seule page de cette discution avec le résultat pour d'autre personne dans le même cas.
Avatar
3stone
Bonjour,

acn wrote:
La nuit porte conseil.
La modification finale a été de reprendre la 1ère formule et d'ajouter
Or f.Type = dbMemo Then
et cela fonctionne avec Texte et Mémo et surtout avec les champs
vides.


[...]
Vous pouvez peut-être ne garder qu'une seule page de cette discution
avec le résultat pour d'autre personne dans le même cas.




Tu as ce que tu cherchais, c'est le principal...

Pour ce qui est de la "page", comme déjà dit, ici c'est un newsgroup
(mal traduit en français par "forum de discussion") et il n'y a pas de
page à supprimer !
Tu as cette impression uniquement parce-que tu regardes par
la petite lucarne d'une page web :-/

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)
1 2