Dicas do OsmarJr

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),
    strSQL = "Select [Sobrenome] from Funcionários where [EmpID]=" & me!ControleEmpID

- Se o controle contém um valor do tipo Data,
    strSQL = "Select * from Funcionários where [EmpEntrada] < #" & _
                        me!EmpEntrada & "#"

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),
    const cQUOTE = """" 'Isso mesmo: quatroa aspas duplas em seqüência
    strSQL = "Select * from Funcionários where [Sobrenome]=" & cQuote & _
                me!Sobrenome & cQuote

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.

 

Home

Contato | Copyright©Osmar José Correia Júnior | 24-Nov-2005 18:23