2009-04-06 8 views
4

J'ai un formulaire dans une base de données MS Access qui répertorie tous les propriétaires consultés pour une nouvelle ligne électrique. À la fin de chaque ligne est un bouton qui ouvre un autre formulaire, montrant les détails de toutes les consultations, offres faites etc.MS Access - ouvrir un formulaire en prenant une valeur de champ à partir d'un formulaire précédent

J'essaie d'utiliser vb dans MS Access pour prendre le contactID et le mettre automatiquement dans un champ dans le formulaire de détails, de sorte que les détails de consultation du propriétaire apparaîtront automatiquement. Je ne suis pas du tout un programmeur vb (j'ai un diplôme en informatique principalement en Java et je travaille actuellement en tant qu'analyste SIG mais c'est une petite entreprise donc on m'a demandé de faire fonctionner une base de données Access).

Je veux dire [detailsForm]! [ContactID] = [landownerlist]! [ID] d'une manière dont vb et l'accès seront heureux avec. Ensuite, je peux voir si je suis sur la bonne voie et si ça va fonctionner! Ce que j'ai ci-dessus ne fonctionne pas réellement. Il ne compilera pas.

De Kaliana

Répondre

3

Vous pouvez regarder dans le code qui se trouve derrière ces boutons. Si vous utilisez un docmd.openform, vous pouvez définir le paramètre 4 sur une clause where à l'ouverture du formulaire suivant.

DoCmd.OpenForm "OpenFormName", acNormal, , "[contactID] = " _ 
    & [detailsForm]![contactID] , acFormEdit, acWindowNormal 

Ceci suppose que l'ID de contact est numérique et ne nécessite pas de guillemets.

6

Si vous souhaitez ouvrir un formulaire à un nouveau record et de définir l'ID là, vous pouvez utiliser OpenArgs, un argument de OpenForm:

DoCmd.OpenForm "FormName",,,,acFormAdd,,Me.ID 

La forme ouverte aurait aussi besoin d'un code:

If Me.Openargs<>vbNullstring Then 
    Me.Id = Me.Openargs 
End If 

Il est également possible de trouver:

Forms!LandownersList.Recordset.FindFirst "ID=" & Me.ID 

ou remplir une valeur:

Forms!LandownersList!Id = Me.ID 

sur le formulaire en cours d'ouverture à partir du formulaire appelant.

0

Comme précédemment publié OpenArgs est idéal pour cela. Une astuce que j'ai appris est qu'il est facile de passer plusieurs paramètres si nécessaire comme une chaîne délimitée (virgule par exemple), la forme cible peut alors accéder à ces valeurs à l'aide de la fonction split() ainsi:

StringArrayVariable()= Split(me.OpenArgs,",") 
Me.textbox= StringArrayVariable(0) 
Me.textbox1= StringArrayVariable(1) 

Il s'agit d'un code aérien, consultez le fichier d'aide pour Split().

Il est également possible de passer des objets dans OpenArgs, il nécessite une manipulation manuelle du pointeur de mémoire et je n'ai pas le code à portée de main mais je suis sûr qu'une recherche Google trouvera quelques exemples. Cette technique peut causer des accidents aléatoires cependant. Être averti!

0

L'utilisation d'arguments ouverts est la solution généralement acceptée, comme mentionné par d'autres. Cela tombe juste dans la catégorie de "Pour votre édification" :) Un des problèmes avec l'utilisation des arguments ouverts est que, à moins que vous soyez prudent avec vos commentaires, il est facile d'oublier ce qu'ils étaient censés signifier. En avez-vous dépassé plus d'un? Lequel est lequel? Comment l'ai-je fait ici? Comment l'ai-je fait là, etc.Pour mon propre argent, je standardisé à ceci (ci-dessous) ainsi je peux toujours passer plus d'un argument sans crainte, et quand j'examine mon code un an à partir de maintenant, je peux encore voir ce qui sans tracas:

Option Explicit 

'Example use: DoCmd.OpenForm "Example", OpenArgs:="Some Filter|True" 

Public Enum eForm1Args 
    eFilter = 0 
    eIsSpecial = 1 
End Enum 

Private m_strArgs() As String 

Public Property Get Args(ByVal eForm1Args As eForm1Args) As String 
    Args = m_strArgs(eForm1Args) 
End Property 

Private Sub Form_Open(Cancel As Integer) 
    m_strArgs = Split(Nz(Me.OpenArgs, vbNullString), "|") 
    If LenB(Me.Args(eFilter)) Then Me.Filter = Me.Args(eFilter) 
End Sub 

Private Sub Command1_Click() 
    If LCase$(Me.Args(eIsSpecial)) = "true" Then 
     'Do something special 
    End If 
End Sub 
+0

Merci. Je l'ai juste utilisé. – HarveyFrench

+0

OU Sans utiliser Ouvrir Args ouvrir une autre forme comme si elle était une classe Créer un module appelé GlobalVars qui comprend cette ligne: \t \t Form_ProviderFileContents1 public comme Form_ProviderFileContents1 Ensuite, dans le code que vous voulez ouvrir une autre utilisation du formulaire: Définir GlobalVars.Form_ProviderFileContents1 = Nouveau Form_ProviderFileContents1 'Le modifier le formulaire que vous venez d'ouvrir comme vous le souhaitez. Avec Form_ProviderFileContents1 .Visible = Vrai .Controls ("ProviderID") = Me.ProviderID Finir par Ou utiliser des méthodes/préopératoires sur le formulaire appelé – HarveyFrench

Questions connexes