OVH Cloud OVH Cloud

projet adp : formulaire et requête liée

2 réponses
Avatar
Paul
Bonjour,

Je débute dans les projets adp. Je voudrais savoir comment on peut créer une
requête dont un critère est un champ sur un formulaire affiché, pour obtenir
l'équivalent de ce qu'on a dans les bases mdb :
select * from toto where [id]=forms![monformulaire]![monchamp]
Dans sql server je ne vois pas trop comment faire ?
Merci de votre aide.

--
Paul

2 réponses

Avatar
J-Pierre
Bonjour,

Désolé, on va faire compliqué.............

Pour les sous-formulaires, c'est simple:

Voilà un exemple avec 2 paramètres, la valeur des paramètres se trouve dans le formulaire principal. Avec cet exemple,
performance optimale car seules les lignes sélectionnées par SQLServer sont retournées. Ne pas oublier de renseigner les
propriétés pères et fils de ton objet sous-formulaire pour lier les enregistrements.

La procédure cataloguée dans SQLserver s'appelle:
F502_projets_ouverture_SF_reference

Son code:
CREATE Procedure F502_projets_ouverture_SF_reference
@codeClient int, @refClient varchar(20)
As
SELECT T001_code_client, T001_reference_client, T001_no_projet
FROM T001_projets
WHERE T001_code_client = @codeClient AND T001_reference_client = @refClient
ORDER BY T001_no_projet;
GO

Pour l'appeler, dans ton formulaire:
Source:
F502_projets_ouverture_SF_reference
Input Parameters:
@codeClient int = [Forms]![F502_projets_ouverture]![T001_code_client], @refClient varchar(20) =
[Forms]![F502_projets_ouverture]![T001_reference_client]

Pour les formulaires, c'est moins simple: Ce qu'il faut absolument éviter pour avoir une bonne performance, c'est qu'un
formulaire, quand il est ouvert, ne récupère l'intégralité des lignes de la table, chose qui se produit fréquemment avec un
mdb.

Tu peux utiliser une procédure stockée comme pour le sous-formulaire, mais avant d'ouvrir ce formulaire, il faudra stocker les
valeurs des paramètres quelque part.

Tu peux créer une vue dans SQLserver, spécifier cette vue comme source dans ton formulaire, et utiliser la propriété
ServerFilter de ton formulaire (exactement de la même manière que tu peux utiliser me.filter dans un projet mdb)

Normalement, ça se fait avec un:
DoCmd.OpenForm MonForm, , , conditionwhere

Mais dans le cas ou la conditionwhere n'est pas fournie, SQLServer va te retourner toutes les lignes de ta table. Pour éviter
ça, sur l'évènement ouverture du formulaire, avant qu'Acces n'ait interrogé la base de données, tu rajoutes un peu de code:

If IsNull(Me.ServerFilter) Or Me.ServerFilter = "" Then
Me.ServerFilter = "T001_no_projet= " & FindFirstFile()
Me.Requery
End If

Dans ce cas, comme il n'y a pas de N° de projet certain, FindFirstFile est une procédure qui retourne le numéro du premier
dossier de la table. Cela entraîne une double lecture dans la base, d'abord pour ne récupérer que la clé, puis pour récupérer
les données, mais c'est mieux qu'un recordset de plusieurs dizaines ou centaines de milliers de lignes, non ?

Pendant que j'y suis:
Attention à la propriété table unique, dans un formulaire, tu ne peux mettre à jour qu'une seule table à la fois, et à la
propriété command resync.

J-Pierre

"Paul" a écrit dans le message de news: 443a629b$
Bonjour,

Je débute dans les projets adp. Je voudrais savoir comment on peut créer une
requête dont un critère est un champ sur un formulaire affiché, pour obtenir
l'équivalent de ce qu'on a dans les bases mdb :
select * from toto where [id]=forms![monformulaire]![monchamp]
Dans sql server je ne vois pas trop comment faire ?
Merci de votre aide.

--
Paul




Avatar
Paul
Merci beaucoup, Jean-Pierre.
Je regarde tout ça.

--
Paul