< Liens entre deux formulaires (violation de clé primaire) | Forum des BTS

Liens entre deux formulaires (violation de clé primaire)

The_tiger85

New Member
Bonjour @ tous,
Voici mon code pour mettre à jour le numéro du dossier en fonction du type

Me.NumDossier.RowSource = &quot;SELECT NumDossier FROM Dossier WHERE TypeDossier ='&quot; &amp; TypeDossier.Value &amp; &quot;'&quot;

Mais quand je quitte le formulaire, j'ai un problème de violation de clé primaire ...

J'ai donc essayé avec un recordset :

Dim RsetNum As DAO.Recordset
Dim RsetDossier As DAO.Database
Dim Source As String

Set RsetDossier = CurrentDb

Source = &quot;SELECT NumDossier FROM Dossier WHERE TypeDossier ='&quot; &amp; TypeDossier.Value &amp; &quot;'&quot;
Set RsetNum = RsetDossier.OpenRecordset(Source, dbOpenDynaset)


Mais cela ne fonctionne toujours pas, j'ai une erreur à la dernière ligne &quot;91&quot; : Variable objet ou variable de bloc With non définie.

J'ai aussi essayé ceci :

Set rstForm = db.OpenRecordset(&quot;FormAccueil&quot;)
rstForm.Index = &quot;SELECT NumDossier FROM Dossier WHERE TypeDossier ='&quot; &amp; TypeDossier.Value &amp; &quot;'&quot;
rstForm.MoveFirst



Et cela :

Dim RsetNum As ADODB.Recordset
Set RsetNum = New ADODB.Recordset
RsetNum.CursorLocation = adUseServer
RsetNum.Open (&quot;SELECT NumDossier FROM Dossier WHERE TypeDossier ='&quot; &amp; TypeDossier.Value &amp; &quot;'&quot;)
Set NumDossier.Recordset = RsetNum


Voila, si quelqu'un à une solution car ça m' :spam1: !!
 
Salut ! Sois un peu plus précise dans ta demande. Pourquoi dans l'intitulé parle-tu de &quot;liens entre deux formulaires...&quot; ?

Qu'est-ce que tu veux que cela fasse en fonction de quelle action ?
 
Bonjour
En fait, j'ai un code pour mettre à jour la liste des numéros de dossiers en fonctions du type (que l'on choisi dans une liste déroulante).
Ensuite, on choisi un numéro de dossier puis on clique sur un bouton pour valider et allez sur la page de suivi des dossiers.

Page d'Accueil

Cela marche bien mais quand on reviens sur la page d'accueil et que l'on veut quitter, il me met qu'il y a une violation de clé primaire (je pense que le problème vient du RowSource)

Donc j'ai essayé avec un RecodSet à la place du RowSource mais cela me met une erreur.
Voila, en espérant avoir été plus claire
 
Je me demande si ce n'est pas parce que tu n'as pas fait de requête de validation de formulaire ou de bouton permettant d'enregistrer l'action dans la table...

Il y aurait, selon moi, violation de clé primaire si tu lui demandes de créer une ligne d'enregistrement dans une table, dont la clé primaire est clé étrangère d'une autre table, mais que tu ne mets rien dedans...

Je n'ai jamais rencontré d'erreur de ce type. As-tu fais un débug pas-à-pas ?
 
Sous Access je n'arrive pas à débugé en pas à pas.
Pourtant je ne créé pas de ligne d'enregistrement puisque c'est juste pour sélectionné le numéro, de plus le numéro et le type de dossier sont dans la même table où le numéro est la clé primaire.
 
Peut-être parce que dans ta listbox, tu proposes de choisir un numéro, meme s'il est déjà &quot;pris&quot;. Tonformulaire est-il indépendant ?
 
Mykle link=topic=61470.msg637356#msg637356 date=1182325562 a dit:
Peut-être parce que dans ta listbox, tu proposes de choisir un numéro, meme s'il est déjà &quot;pris&quot;. Tonformulaire est-il indépendant ?

Désolée, je ne comprend pas. :embarassed:
 
Je recommence. Tu as bien un numéro à choisir dans ton formulaire ? Si oui, ce choix se fait à travers une liste déroulante ? (appelée aussi listbox)

Ton formulaire, est-il basé sur une table, où les noms de champ sont référencés dans le formulaire, et où chaque action effectuée met à jour directement la table lorsque tu passes d'un champ à remplir à un autre, puisque le formulaire est directement lié à la table ? Ou bien le formulaire est-il indépendant, c'est-à-dire qu'il n'a aucun lien avec une table, et que toutes les informations recensées dans celui-ci sont ensuite envoyées dans la table à travers des requêtes dans le code, lors d'un clic sur un bouton de validation ?
 
Oui mon numéro je le choisi dans une liste non modifiable.

Mon formulaire est basé sur une requête (je n'avais pas besoin de tout les champs de ma table).
Mais je ne veux pas mettre à jour ma table (je pense que c'est d'ailleur à cause de cela que j'ai un problème).
Je veux seulement passé d'un formulaire à un autre en gardant les données (que les données du formulaire de suivi de dossier soit en liens avec le numéro du formulaire d'accueil)
 
Alors ce qu'il faudrait faire, c'est rendre ton formulaire complètement indépendant, et lors de la validation (c'est à dire lorsque tu veux passer d'un formulaire à un autre), tout est contrôlé par du code; en gros ton code va faire des contrôles de saisie (comme la vérification d'un doublon dans la table par exemple, ou le fait que l'utilisateur a bien saisi tous les champs obligatoires, comme il faut, etc.), et va ajouter les informations sous forme de ligne d'enregistrement, dans la table par des requêtes.

Et si l'utilisateur a mal fait quelque chose, tu lui dis ce qui ne va pas, et tu stopes la procédure, afin d'éviter tout problème avec la table.
 
Le truc c'est que je n'ai aucune information à inséré ou à mettre à jour dans ma table, je veux juste allé chercher y les infos.

Le RowSource met à jour la table ? Si oui, c'est surement à cause de cela qu'il me met &quot;violation de clé primaire&quot; puisque je clique sur un numéro qui existe déjà.
Je veux seulement pouvoir, grâce à ce numéro, touver les informations correspondante dans les autres tables qui se mettrons dans un autre formulaire.

Voila, en espérant avoir été claire.
 
Alors, dans ce cas, si tu ne l'as pas déjà fait et si j'ai bien compris, tu crée un formulaire qui va demander la saisie du numero de dossier, puis lorsque tu cliqueras sur le bouton de recherche, ton code ira vérifier si ce numero existe dans ta table, et si c'est le cas, il ouvrira un formulaire contenant les informations correspondantes (tu peux rendre ce formulaire ouvert, dépendant d'une requête, ou le numero du dossier attendu dans un where, sera celui saisi dans le formulaire précédent).

Code pour le formulaire &quot;Recherche&quot;:
Dans un bouton de validation, tu y mets un code du genre:

private sub Recherche
On Error Goto Err_Recherche

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim qdf As DAO.QueryDef

Set db = CurrentDb

sql = &quot;select numero_dossier from dossiers where numero_dossier = &quot; &amp; ton_numero_saisi &amp; &quot;&quot;

Set qdf = db.CreateQueryDef(&quot;&quot;, sql)
Debug.Print sql
Set rs = qdf.OpenRecordset()

If rs.EOF Then
MsgBox &quot;Aucun dossier&quot;, vbExclamation
Else
'Tu crées un textbox dans ton formulaire de recherche que l'utilisateur ne verra pas, pour y placer le résultat de ta requête. Cette manipulation a pour but de conserver le numero de dossier lorsque tu ouvriras le formulaire dossier, pour que la requête dont elle dépendra puisse retrouver les informations correspondantes
hidNum_Dossier = rs!numero_dossier
DoCmd.OpenForm &quot;Dossier&quot;
End If

Exit_Recherche:
Exit Sub

Err_Recherche:
MsgBox Err.Description
Resume Exit_Recherche

End Sub


Et pour la requête dont le formulaire dépend, tu peux y mettre:

SELECT &quot;la liste des champs que tu veux voir apparaitre dans le formulaire&quot; FROM dossier WHERE numero_dossier=Forms!Recherche!hidNum_Dossier;


Ainsi, en principe, tu devrais retrouver dans ton formulaire les informations voulues. En espérant que cela t'éclaire.
 
Le numéro se met dans une liste suivant le type que l'on a choisi dans la liste déroulante et c'est à partir du numéro que l'on choisi (il faut cliqué dessus) &amp; quand on clique sur le bouton &quot;Valider&quot; qu'on arrive sur l'autre formulaire avec les données en liens.
 
Bon, alors tu pourras te baser sur le code que je t'ai donné pour la dernière étape...

Pour ce qui est du numero que tu peux choisir lorsque tu as fait un choix de type dans la listbox:

tu crées une requête qui sera source de ton objet listbox_num_dossier:

select numero_dossier from dossiers where type = [listbox_Type]


Essaye cela, et dis-moi si c'est ce que tu veux.
 
Comme ça :
    'Me.NumDossier.RowSource = &quot;SELECT NumDossier FROM Dossier WHERE TypeDossier ='&quot; &amp; TypeDossier.Value &amp; &quot;'&quot;

Mais si c'est comme cela, c'est (je pense) à cause de ça que j'ai l'erreur de violation de clé primaire.

EDIT : Ca ne me met plus de numéro dans ma liste ...
 
Non, tu ne dois pas passer par du vba, mais par la gestion d'objets sous Access. Quand tu crées un objet (qu'il textbox, listbox, combobox, ...), tu peux soit lui donner comme source un champ d'une table, soit une requête. Eh bien c'est là qu'intervient la requête que je t'ai donné. Tu vois ce dont je veux parler ?
 
Oui je vois.
J'ai créé ma requête et je l'ai associé à une liste mais je n'ai aucun numéro dans cette liste.

Voici le code de ma requête : SELECT NumDossier FROM Dossier WHERE TypeDossier ='&quot; &amp; TypeDossier.Value &amp; &quot;'
 
Mykle link=topic=61470.msg637871#msg637871 date=1182343683 a dit:

select numero_dossier from dossiers where type = [nom_de_ton_objet]

C'est comme ceci qu'il faut faire. Il ne faut pas oublier que ce n'est pas du VBA que tu implantes, mais une vraie requête Access, avec un objet provenant d'un formulaire.

Edit: sans le &quot;.value&quot; !
 
Merci, effectivement il ne falait pas mettre le .value ni les &amp;.
Maintenant il faudrais que les numéros soit en lien avec le type de dossiers.

Lorsque je clique sur un numéro de dossier, il me met : &quot;Variable objet ou variable de bloc With non définie&quot;
 
The_tiger85 link=topic=61470.msg637974#msg637974 date=1182346522 a dit:
Maintenant il faudrais que les numéros soit en lien avec le type de dossiers.

Je ne comprends pas, il me semblait que c'était le cas lorsque tu exécutais la requête dont nous venions de parler non ?
 
Retour
Haut