Home
Home

--Soumis par Dev Ashish---

Utilisation d'une valeur d' un  formulaire dans un énoncé SQL.

(Q) Dans le code, derrière mon formulaire, j'essaie de référer à la valeur d'un contrôle du formulaire, à l'intérieur d'un énoncé SQL. Je n'y arrive pas, bien que j'utilise la syntaxe:

    strSQL="Select * from Employees where [LastName] = forms!myForm!myControl"

Qu'est ce que je fais de croche??

(A) De façon à se référer à la valeur contenu dans un contrôle d'un formulaire, il est préférable d'utiliser l'opérateur de concaténation &. L'utilisation d'apostrophes est également critique. Par exemple:

- Si le champ comparé est de type numérique  (exemple, un champ ID),
    strSQL = "Select [LastName] from Employees where [EmpID]=" & me!EmpIDControl

- Si le champ est de type date,
    strSQL = "Select * from Employees where [EmpStartDate] < #" & _
                        me!EmpStartDate & "#"

Note: **Soumis par Alex Dybenko**

Une approche recommandée pour les dates est d'utiliser

    [EmpStartDate] < " & format(me!EmpStartDate,"0")

car autrement, le formatage de dates dépend du paramétrage régional du PC, ce qui peut générer une erreur, dans certains cas.

- Si le champ est de type alpha-numérique, 
    const cQUOTE = """" 'Thats 2 quotes in sequence
    strSQL = "Select * from Employees where [LastName]=" & cQuote & _
                me!EmpLastName & cQuote

---Soumis par Michel Walsh---

On ne sait pas quel délimiteur utiliser? C'est sans importance, avec ADO, il suffit de le demander:

Dim prefix As String
Dim suffix As String
Dim rst As ADODB.Recordset
Set rst= ........
' maintenant, on prépare une comparaison impliquant "FieldName":
PrefixAndSuffixForDataType rst.FieldName.Type, prefix, suffix

' on a récupéré les délimiteurs, ne reste qu'à les utiliser, simplement...
mySql = "... FieldName=" & prefix & Value & suffix & "..."

En effet  ADO se doit de connaître les délimiteurs à utiliser, selon le "schéma" approprié. ADO peut donc vous renseigner, si vous l'ignorez. Voici la fonction PrefixAndSuffixForDataType:

'   ***** Code Start ******
Public Sub PrefixAndSuffixForDataType(ByVal DataType As Long, _
                                ByRef prefix As String, _
                                ByRef suffix As String, _
                                Optional ByVal d_prefix As String = "", _
                                Optional ByVal d_suffix As String = "")
' Retourne les caractères, littéral, prefixe et suffixe délimitant le type de donnée fourni,
'               selon le "data provider" par défaut.
' ex.: retourne "#" et "#"  pour adDate avec Jet 4.0

Dim rst As ADODB.Recordset
    On Error GoTo NotSupported
    Set rst = CurrentProject.Connection.OpenSchema(adSchemaProviderTypes)
    rst.Find "DATA_TYPE=" & DataType
    If Not rst.EOF Then
        prefix = Nz(rst!LITERAL_PREFIX, d_prefix)
        suffix = Nz(rst!LITERAL_SUFFIX, d_suffix)
    Else    ' ne pas signaler d'erreur, même si le
            ' DataType n'est probablement pas supporté,
            ' retourner avec les valeurs par défaut fournies par l'utilisateur
        prefix = d_prefix
        suffix = d_suffix
    End If
    rst.Close
    Set rst = Nothing
    Exit Sub

NotSupported:

    On Error Resume Next
    prefix = d_prefix
    suffix = d_suffix

    ' ne prenons pas de chance, effectuons un ménage soigneux, excessif même, 
    '   on n'est pas préoccupé par la vitesse, ici, de toutes façons.
    If Not (rst Is Nothing) Then
        If (rst.State And adStateClosed) <> adStateClosed Then rst.Close
        Set rst = Nothing
    End If
End Sub
'   ***** Code End ******

Note finale: les dates doivent quand même être présentées sous un format  US .