|
Usando variáveis em SQL por trás de formulários |
Em código por trás do meu formulário, estou tentando referenciar o valor de um controle do formulário em uma declaração SQL. Mas não estou conseguindo. A sintaxe que estou usando é : strSQL="SELECT * FROM Funcionários WHERE [Sobrenome] = forms!MeuForm!MeuControle". O Que está errado?Autor: Dev Hashish e Michel Walsh |
Para referenciar valores contidos em controles de formulários, devemos usar o operador & e concatenar os resultados. A posição das aspas também é importante. Por exemplo: - Se o controle contém valores numéricos (exemplo: um campo Código), - Se o controle contém um valor do tipo Data, Notas: **Postado por Alex Dybenko** Uma forma recomendada é usar [EmpEntrada] < " & format(me!Entrada,"0") ** Postado por OsmarJr ** Outra forma é usar a função Format [EmpEntrada] < #" & Format(Me!EmpEntrada,"mmddyyyy") porque esta estrutura ## depende das configurações regionais e isso pode causar erros em algumas máquinas. - Se o controle contém um valor do tipo texto (string), Em dúvida sobre qual delimitador usar? Não se preocupe. Se usar o ADO, simplesmente pergunte: Dim prefix As String Dim suffix As String Dim rst As ADODB.Recordset Set rst= ........ ' Agora preparamos uma comparação com "NomeDeCampo": PrefixAndSuffixForDataType rst.FieldName.Type, prefix, suffix ' Já temos os delimitadores corretos a serem usados... mySql = "... FieldName=" & prefix & Value & suffix & "..." já que o ADO sabe quais delimitadores deve usar através do "schema" apropriado, ele consegue devolver as informações. Eis a função PrefixAndSuffixForDataType: '************* Início do Código **************
' Este código foi escrito originalmente por Michel Walsh
' Ele não deve ser alterado ou distribuído,
' exceto como parte de um aplicativo.
' Use-o livremente em qualquer aplicativo,
' desde que esta nota de copyright permaneça inalterada.
'
' Código cortesia de
' Michel Walsh
'
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 = "")
'
' Devolve prefixo e sufixo literais a serem usados com determinado tipo
' de dados, para o data provider padrão.
' ex.: devolve "#" and "#" para adDate com 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 ' Não se preocupe em devolver um erro
' mesmo que este tipo de dados provavelmente não seja suportado,
' apenas use o valor padrão fornecido pelo usuário.
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
' Não acredite na sorte, faça uma limpeza cuidadosa (provavelmente excessiva, mas
' não estamos nos preocupando com velocidade).
If Not (rst Is Nothing) Then
If (rst.State And adStateClosed) <> adStateClosed Then rst.Close
Set rst = Nothing
End If
End Sub
' ***** Code End ******
Nota final: Ainda é necessário o uso de datas no formato americano para campos Data/Hora.
|