11
votes

SQL comme source de contrôle pour le champ de formulaire d'accès

Y a-t-il un moyen de renseigner à la valeur de Feilce de Forme d'accès à l'aide de SQL?

J'ai lu qu'il n'est pas possible de simplement entrer SQL comme source de contrôle. Est-ce vrai? P>

merci pour tout halp :) p>

- Edit - P>

Je dois effectuer cette requête; P>

SELECT tblCaseIssues.IssueDesc FROM tblCaseIssues INNER JOIN tblCaseNewHS_Issues ON tblCaseIssues.ID = tblCaseNewHS_Issues.IssueID WHERE(tblCaseNewHS_Issues.HS_ID = 81))


1 commentaires

Y a-t-il une raison quelconque les données ne doivent pas être incluses dans les Records sous-jacents du formulaire?


6 Réponses :


9
votes

Assurez-vous que c'est vrai SQL, mais vous pouvez utiliser la fonction:
= dlookup ("Field_Name", "Nom de table", "Any_FieldName = 'Valeur'")


2 commentaires

Est-il possible de faire quelque chose aussi complexe que Select TblcaseSissues.issuedesc de TblcaseSissues Inner Joindre Tblcaseenews_issues sur TblcaseSissues.id = Tblcaseenews_issues.issuid où (Tblcaseenews_issues.hs_id = 81) avec une telle fonction?


Créez une requête dans l'accès où toutes les tables sont jointes. Ensuite, dans votre dbLookup, vous pouvez substituer Table_Name avec le nom de la requête (désolé indiquant une table et supposer qu'une requête fonctionnerait également). Remarque: il y a de meilleures façons de faire dans VBA.



2
votes

Vous pouvez définir la source de contrôle de votre champ sur un nom de la fonction. Cette fonction peut facilement exécuter votre SQL, et / ou passer dans une variable. Voici ma plaque de chaudière simple pour une fonction d'exécution d'une instruction SQL dans un enregistrement et renvoyez la première valeur. Dans mon monde, j'inclus habituellement une clause très spécifique où, mais vous pouvez certainement faire de cette fonction plus robuste pour vos besoins.

=fnName(sVariable, iVariable)

Public Function fnName( _
    sVariable as String, _
    iVariable as Integer _
    ) As String

On Error GoTo Err_fnName

    Dim con As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim sSQL As String

    sSQL = ""

    Set con = Access.CurrentProject.Connection
    Set rst = New ADODB.Recordset

    rst.Open sSQL, con, adOpenDynamic, adLockOptimistic

        If rst.BOF And rst.EOF Then

            'No records found
            'Do something!

        Else

            'Found a value, return it!
            fnName = rst(0)

        End If

    rst.Close
    Set rst = Nothing

    con.Close
    Set con = Nothing

Exit_fnName:

    Exit Function

Err_fnName:

    Select Case Err.Number
    Case Else
        Call ErrorLog(Err.Number, Err.Description, "fnName", "", Erl)
        GoTo Exit_fnName
    End Select

End Function


0 commentaires

2
votes

Il peut être plus facile d'utiliser une combinaison de comboBox et de définir la source de ligne sur votre requête, alternativement, DAO est originaire d'accès.

Private Sub Form_Current()
''Needs reference to Microsoft DAO 3.x Object Library
Dim db As Database
Dim rs As DAO.Recordset
Dim strSQL As String
Dim strResult  As String


strSQL = "SELECT ci.IssueDesc FROM tblCaseIssues ci " _
       & "INNER JOIN tblCaseNewHS_Issues cni ON ci.ID = cni.IssueID " _
       & "WHERE cni.HS_ID = 81"

Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL)

If rs.RecordCount > 0 Then
    Do While Not rs.EOF
        strResult = strResult & ", " & rs!IssueDesc
        rs.MoveNext
    Loop

    strResult = Mid(strResult, 3)
Else
    strResult = "Not found"
End If

Me.TextBoxName = strResult

End Sub


0 commentaires

2
votes

Prenez simplement votre requête SQL et enregistrez-la comme une requête.

Puis dans la zone de texte, juste place:

= (dlookup ("problèmes", "Nom de la requête"))

I à une perte assez importante quant à toutes ces affiches suggérant des rondes du code où aucun n'est nécessaire. Il suffit de sauvegarder votre SQL comme une requête puis utilisez la fonction dlookup () en tant que source de données de la zone de texte et que vous avez terminé.


1 commentaires

Parce que la première réponse a déjà suggéré votre solution, l'OP recherchait toujours une méthode qu'il pourrait utiliser une instruction SQL comme source de sa requête.



0
votes
Private Sub Form_Load()
    Me.Text0 = CurrentDb.OpenRecordset("SELECT COUNT(name) AS count_distinct_clients FROM (SELECT DISTINCT name FROM Table1 WHERE subject='Soc')  AS tmp;").Fields(0)
End Sub

2 commentaires

Il est préférable d'inclure des explications / contextes plutôt que de simplement avoir une réponse uniquement du code.


Bienvenue dans le débordement de la pile! Bien que ce code puisse répondre à la question, fournissant un contexte supplémentaire concernant la raison et / ou la manière dont ce code répond à la question améliore sa valeur à long terme. Les réponses du code seulement sont découragées.



0
votes

J'ai créé la fonction suivante pour résoudre ce problème même. J'aime cette solution car vous n'avez pas à gérer les requêtes sauvegardées obstruant votre volet de navigation ou vos longueurs de contournement. XXX

C'était comme ça que je l'ai expliqué à mon patron. "Vous pouvez avoir une fonction dlookup () comme source de contrôle d'une zone de texte. Pourquoi pas simplement écrire une fonction qui fait une requête et utilise la fonction comme source de contrôle?" Essayez-le, cela a corrigé ma situation.


0 commentaires