ATENÇÃO NOVOS USUÁRIOS

Se registrou recentemente? Seu cadastro será avaliado e mendiante aprovação, a conta será ativada e você poderá usufruir do fórum. O tempo de avaliação gira em torno de 24 a 48 horas.

Esqueceu sua senha?

Você pode usar o mecanismo de lembrete neste link: Recuperar senha

Você receberá um link de reativação no email cadastrado.

Não recebeu o email? Lembre-se checar o Lixo Eletrônico.

MontaClausulaWhere usando DATAS ?

Esclarecimentos e dúvidas sob o Modelo de Aplicativo de Cadastro em VBA no Microsoft Excel publicado no site e blog http://www.tomasvasquez.com.br
Ronaldo Filho
Acabou de chegar
Acabou de chegar
Mensagens: 5
Registrado em: Ter Mai 24, 2011 12:30 am

Re: MontaClausulaWhere usando DATAS ?

Mensagem por Ronaldo Filho » Ter Mai 24, 2011 12:58 am

Sou iniciante em VBA. Gostaria do arquivo de exemplo postado viewtopic.php?f=5&t=375 , mas ele está corrompido. :( Estou procurando isso faz um tempo. Uso o v3. Gostaria de filtrar a pesquisa entre datas e entre horários. Ex.: filtrar de 01/02/2011 à 23/03/2011 | Ex.2: filtrar de 12h00min as 14h00min) .

Desculpe por perguntar tanto. Mas teria como gerar um relatório deste filtro com cabeçalho e um rodapé com campo de assinatura. (consigo fazer isso com um registro, mandando imprimir no formulário). Mas o que queria é que gerasse um relatório compacto com vários registros.

A intenção é protocolar documentos e gerar relatório para entrega dos mesmos. É por horário, devido eles serem entregues aos poucos.

Ronaldo Filho
Anexos
Registro de Protocolo.zip
Meu arquivo
(115.34 KiB) Baixado 265 vezes



Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Avatar do usuário
Mauro Coutinho
Jedi
Jedi
Mensagens: 1559
Registrado em: Sáb Mar 13, 2010 8:10 pm
Localização: São José dos Pinhais - Pr

Re: MontaClausulaWhere usando DATAS ?

Mensagem por Mauro Coutinho » Ter Mai 24, 2011 7:33 pm

Ronaldo, você quer dois tipos de Filtros separados ?
Um para Datas e outro para Horários ?

No modelo que anexou, não tem celulas com Horários, só Datas.

Assim que possível vou fazer um exemplo para o forum com filtros de Datas., conforme eu mencionei, apesar que see baixar o Modelo do Tomas e seguir o que expliquei terá facilmente a filtragem entre Datas.

[]s


Mauro Coutinho - Exemplos Somente em Office 2003
São José dos Pinhais - Pr
Se sua Duvida foi solucionada . . . .Acrescente [RESOLVIDO] ao título.
Ficou satisfeito com o FORUM ? Divulgue, indicando-o aos colegas !

Ronaldo Filho
Acabou de chegar
Acabou de chegar
Mensagens: 5
Registrado em: Ter Mai 24, 2011 12:30 am

Re: MontaClausulaWhere usando DATAS ?

Mensagem por Ronaldo Filho » Qua Mai 25, 2011 3:29 am

Mauro Coutinho escreveu:Ronaldo, você quer dois tipos de Filtros separados ?
Um para Datas e outro para Horários ?

No modelo que anexou, não tem celulas com Horários, só Datas.

Assim que possível vou fazer um exemplo para o forum com filtros de Datas., conforme eu mencionei, apesar que see baixar o Modelo do Tomas e seguir o que expliquei terá facilmente a filtragem entre Datas.

[]s
Atualizei o arquivo. Agora está mais limpo, nomes corretos e coloquei um calendário na pesquisa para preencher as datas. O filtro é para datas em todos os horários (Ex: de 01/05/2011 à 23/05/2011 independente dos horários) e Período de horário em determinada data (Ex: Todos do dia 15/05/2011 das 10:30 às 11:20). Obrigado pela pronta resposta.
Anexos
Registro de Protocolo_atualizado.zip
Meu arquivo atualizado
(251.46 KiB) Baixado 275 vezes



Avatar do usuário
Mauro Coutinho
Jedi
Jedi
Mensagens: 1559
Registrado em: Sáb Mar 13, 2010 8:10 pm
Localização: São José dos Pinhais - Pr

Re: MontaClausulaWhere usando DATAS ?

Mensagem por Mauro Coutinho » Qui Mai 26, 2011 12:41 am

Ronaldo, se quer a filtragem somente por Datas "independente dos horários e Período de horário em determinada data", para que colocou TextBox de Hora Inicial e Final ?

Seja como for, fiz as adaptações para Filtrar Por uma única Data e ENTRE DATAS.

Uma Obs, é que em seu Arquivo "ModeloCadastro_Dados.xls" a Coluna Data estava formatada com "Geral", modifiquei a formatação para "Data" e arrumei na Rotina do Form Cadastro a linha para que seja lançada a Data correta já formatada.

Faça os testes e veja se seria isto, qq duvida retorne.
Registro de Protocolo Mauro.rar
(236.98 KiB) Baixado 320 vezes
abraços


Mauro Coutinho - Exemplos Somente em Office 2003
São José dos Pinhais - Pr
Se sua Duvida foi solucionada . . . .Acrescente [RESOLVIDO] ao título.
Ficou satisfeito com o FORUM ? Divulgue, indicando-o aos colegas !

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Ronaldo Filho
Acabou de chegar
Acabou de chegar
Mensagens: 5
Registrado em: Ter Mai 24, 2011 12:30 am

Re: MontaClausulaWhere usando DATAS ?

Mensagem por Ronaldo Filho » Sex Mai 27, 2011 4:22 am

Mauro Coutinho escreveu:Ronaldo, se quer a filtragem somente por Datas "independente dos horários e Período de horário em determinada data", para que colocou TextBox de Hora Inicial e Final ?

Seja como for, fiz as adaptações para Filtrar Por uma única Data e ENTRE DATAS.

Uma Obs, é que em seu Arquivo "ModeloCadastro_Dados.xls" a Coluna Data estava formatada com "Geral", modifiquei a formatação para "Data" e arrumei na Rotina do Form Cadastro a linha para que seja lançada a Data correta já formatada.

Faça os testes e veja se seria isto, qq duvida retorne.
Registro de Protocolo Mauro.rar
abraços
Cara valeu, mesmo pela ajuda!

Quanto a questão da filtragem é por data(ex: quero todos do dia 20/05/2011) OU entre datas (ex: todos de 20/05/2011 à 22/05/2011 OU faixa de horário em determinada data(ex: todos do dia 20/05/2011 de 11:00 à 13:00).

Observei que se na coluna dos dados "data" eu salvar com data e hora e eliminar a coluna hora, posso pesquisar de determinada data e hora a outra data e hora (ou mesma data e hora diferente) é só trocar:

Código: Selecionar todos

'MontaClausulaWhere entre as DATAS
    Private Sub MontaClausulaWhere(ByVal NomeControle As String, ByVal NomeCampo As String, ByRef sqlWhere As String)

        If Trim(Me.Controls(NomeControle).Text) <> vbNullString Then
            If sqlWhere <> vbNullString Then
                sqlWhere = sqlWhere & " AND"
            End If
       
        If IsDate(Me.Controls(NomeControle).Text) Then 'Verifica se é Data
            Select Case LocEntreDatas
            
                Case 0 'Procura por uma unica Data
                    sqlWhere = sqlWhere & " (" & NomeCampo & ") = #" & Format(txtDataini, "mm/dd/yyyy") & "#"
                Case 1 'Procura entre duas Datas
                    sqlWhere = sqlWhere & " (" & NomeCampo & ") BETWEEN #" & Format(txtDataini, "mm/dd/yyyy") & "# AND #" & Format(txtDatafim, "mm/dd/yyyy") & "#"
            End Select
               
            Else
               sqlWhere = sqlWhere & " UCASE(" & NomeCampo & ") LIKE UCASE('%" & Trim(Me.Controls(NomeControle).Text) & "%')"
            End If
           
        End If

    End Sub
'FIM DATAS
por:

Código: Selecionar todos

'MontaClausulaWhere entre as DATAS
    Private Sub MontaClausulaWhere(ByVal NomeControle As String, ByVal NomeCampo As String, ByRef sqlWhere As String)

        If Trim(Me.Controls(NomeControle).Text) <> vbNullString Then
            If sqlWhere <> vbNullString Then
                sqlWhere = sqlWhere & " AND"
            End If
       
        If IsDate(Me.Controls(NomeControle).Text) Then 'Verifica se é Data
            Select Case LocEntreDatas
            
                Case 0 'Procura por uma unica Data
                    sqlWhere = sqlWhere & " (" & NomeCampo & ") = #" & Format(txtDataini, "mm/dd/yyyy") & "#"
                Case 1 'Procura entre duas Datas
                    sqlWhere = sqlWhere & " (" & NomeCampo & ") BETWEEN #" & Format(txtDataini, "mm/dd/yyyy hh:mm") & "# AND #" & Format(txtDatafim, "mm/dd/yyyy hh:mm") & "#"
            End Select
               
            Else
               sqlWhere = sqlWhere & " UCASE(" & NomeCampo & ") LIKE UCASE('%" & Trim(Me.Controls(NomeControle).Text) & "%')"
            End If
           
        End If

    End Sub
'FIM DATAS
Porém na pesquisa em uma só data ele dá resultado vazio para pois o txtDataini recebe a data e "sei" que acrescenta 00:00 na hora. Se uso a entre datas posso colocar: Ex: txtDataini 21/01/2011 00:00 e txtDatafim 21/01/2011 23:59 e exibe todos do dia. Não sei como fazer para que se usuário selecionar uma só data ele pesquisar de 00:00 à 23:59 (talvez usando combobox com padrões nestes extremos e o usuário poder alterar se quiser).

Não sei pq, mas a pesquisa entre datas não filtra por login (sem nenhum selecionado blz!) (se seleciono um ou dois a pesquisa esquece a data de intervalos e mostra dados daquele login em qualquer data).

Se houve erros de portuga foi o sono. Queimei as pestanas mas só esta evolução.



Avatar do usuário
Mauro Coutinho
Jedi
Jedi
Mensagens: 1559
Registrado em: Sáb Mar 13, 2010 8:10 pm
Localização: São José dos Pinhais - Pr

Re: MontaClausulaWhere usando DATAS ?

Mensagem por Mauro Coutinho » Sex Mai 27, 2011 8:46 am

Ronaldo, de fato se alterar a formatação conforme disse sobre data e hora funciona, este seria um proximo passo se você confirmasse que iria utilizar as Horas tambem, não comentei nada antes pois como eu disse não sabia se iria utilizar os TextBoxs Horas separados, mas valeu pelo seu esforço, é sinal que realmente tem intensão de aprender e não somente ter tudo pronto. Parabens.

Então vamos a algumas considerações,
Na rotina que alterou, não sei se foi o sono, mas no "Case 0" a linha tem de estar com a mesma formatação "mm/dd/yyyy hh:mm", acerte na rotina.

Quanto a questão do Login troque a function PreecheRecordSet pela abaixo:
A questão é somente a ordem das sequencias, Login primeiro depois montamos as outras Clausulas, em alguns testes rapidos aqui deu certo, refaça os testes com mais dados e veja se corre tudo bem.

Código: Selecionar todos

Private Function PreecheRecordSet(ByVal Protocolo As String, _
                                  ByVal Placa As String, _
                                  ByVal Arquivo As String, _
                                  ByVal Obs As String, _
                                  ByVal DataInicio As String, _
                                  ByVal DataFim As String) As Recordset
                                  
    On Error GoTo TrataErro

    Dim conn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim sql As String
    Dim sqlWhere As String
    Dim sqlOrderBy As String
    Dim i As Integer
    Dim campo As Field
    Dim myArray() As Variant

    Set conn = New ADODB.Connection
    With conn
        .Provider = "Microsoft.JET.OLEDB.4.0"
        .ConnectionString = "Data Source=" & caminhoArquivoDados & ";Extended Properties=Excel 8.0;"
        .Open
    End With

    sql = "SELECT * FROM [Fornecedores$]"
    
    'Login
    For i = 1 To lstLogin.ListCount
        'verifica se o item está selecionado
        If lstLogin.Selected(i - 1) Then
            'Monta a cláusula WHERE com OR
            Debug.Print lstLogin.List(i - 1) & " selecionado"
            If sqlWhere <> vbNullString Then
                sqlWhere = sqlWhere & " OR"
            End If
            sqlWhere = sqlWhere & " UCASE(Login) LIKE UCASE('%" & Trim(lstLogin.List(i - 1)) & "%')"
        End If
    Next

'monta a cláusula WHERE
'Protocolo
    Call MontaClausulaWhere(txtProtocolo.Name, "Protocolo", sqlWhere)
'Placa
    Call MontaClausulaWhere(txtPlaca.Name, "Placa", sqlWhere)
'Arquivo
    Call MontaClausulaWhere(txtArquivo.Name, "Arquivo", sqlWhere)
'DATA
    Call MontaClausulaWhere(txtDataini.Name, "Data", sqlWhere) 'Coluna DATA
'Obs
    Call MontaClausulaWhere(txtObs.Name, "Obs", sqlWhere)
    
    'faz a união da string SQL com a cláusula WHERE
    If sqlWhere <> vbNullString Then
        sql = sql & " WHERE " & sqlWhere
    End If

    'faz a união da string SQL com a cláusula ORDER BY
    If cboOrdenarPor.ListIndex <> -1 Then
        sqlOrderBy = " ORDER BY " & cboOrdenarPor.List(cboOrdenarPor.ListIndex, 0)
        'define a direção
        Select Case cboDirecao.ListIndex
        Case Ascendente
            sqlOrderBy = sqlOrderBy & " ASC"
        Case Descendente
            sqlOrderBy = sqlOrderBy & " DESC"
        End Select
        'une a query order ao sql
        sql = sql & sqlOrderBy
    End If

    Set rst = New ADODB.Recordset
    rst.CursorLocation = adUseClient
    With rst
        .ActiveConnection = conn
        .Open sql, conn, adOpenForwardOnly, _
              adLockBatchOptimistic
    End With

    Set rst.ActiveConnection = Nothing

    ' Fecha a conexão.
    conn.Close

    Set PreecheRecordSet = rst
    Exit Function
TrataErro:
    Set rst = Nothing
End Function
[]s


Mauro Coutinho - Exemplos Somente em Office 2003
São José dos Pinhais - Pr
Se sua Duvida foi solucionada . . . .Acrescente [RESOLVIDO] ao título.
Ficou satisfeito com o FORUM ? Divulgue, indicando-o aos colegas !

Ronaldo Filho
Acabou de chegar
Acabou de chegar
Mensagens: 5
Registrado em: Ter Mai 24, 2011 12:30 am

Re: MontaClausulaWhere usando DATAS ?

Mensagem por Ronaldo Filho » Sáb Mai 28, 2011 2:06 am

Mauro Coutinho escreveu:Ronaldo, de fato se alterar a formatação conforme disse sobre data e hora funciona, este seria um proximo passo se você confirmasse que iria utilizar as Horas tambem, não comentei nada antes pois como eu disse não sabia se iria utilizar os TextBoxs Horas separados, mas valeu pelo seu esforço, é sinal que realmente tem intensão de aprender e não somente ter tudo pronto. Parabens.

Então vamos a algumas considerações,
Na rotina que alterou, não sei se foi o sono, mas no "Case 0" a linha tem de estar com a mesma formatação "mm/dd/yyyy hh:mm", acerte na rotina.

Quanto a questão do Login troque a function PreecheRecordSet pela abaixo:
A questão é somente a ordem das sequencias, Login primeiro depois montamos as outras Clausulas, em alguns testes rapidos aqui deu certo, refaça os testes com mais dados e veja se corre tudo bem.

Código: Selecionar todos

Private Function PreecheRecordSet(ByVal Protocolo As String, _
                                  ByVal Placa As String, _
                                  ByVal Arquivo As String, _
                                  ByVal Obs As String, _
                                  ByVal DataInicio As String, _
                                  ByVal DataFim As String) As Recordset
                                  
    On Error GoTo TrataErro

    Dim conn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim sql As String
    Dim sqlWhere As String
    Dim sqlOrderBy As String
    Dim i As Integer
    Dim campo As Field
    Dim myArray() As Variant

    Set conn = New ADODB.Connection
    With conn
        .Provider = "Microsoft.JET.OLEDB.4.0"
        .ConnectionString = "Data Source=" & caminhoArquivoDados & ";Extended Properties=Excel 8.0;"
        .Open
    End With

    sql = "SELECT * FROM [Fornecedores$]"
    
    'Login
    For i = 1 To lstLogin.ListCount
        'verifica se o item está selecionado
        If lstLogin.Selected(i - 1) Then
            'Monta a cláusula WHERE com OR
            Debug.Print lstLogin.List(i - 1) & " selecionado"
            If sqlWhere <> vbNullString Then
                sqlWhere = sqlWhere & " OR"
            End If
            sqlWhere = sqlWhere & " UCASE(Login) LIKE UCASE('%" & Trim(lstLogin.List(i - 1)) & "%')"
        End If
    Next

'monta a cláusula WHERE
'Protocolo
    Call MontaClausulaWhere(txtProtocolo.Name, "Protocolo", sqlWhere)
'Placa
    Call MontaClausulaWhere(txtPlaca.Name, "Placa", sqlWhere)
'Arquivo
    Call MontaClausulaWhere(txtArquivo.Name, "Arquivo", sqlWhere)
'DATA
    Call MontaClausulaWhere(txtDataini.Name, "Data", sqlWhere) 'Coluna DATA
'Obs
    Call MontaClausulaWhere(txtObs.Name, "Obs", sqlWhere)
    
    'faz a união da string SQL com a cláusula WHERE
    If sqlWhere <> vbNullString Then
        sql = sql & " WHERE " & sqlWhere
    End If

    'faz a união da string SQL com a cláusula ORDER BY
    If cboOrdenarPor.ListIndex <> -1 Then
        sqlOrderBy = " ORDER BY " & cboOrdenarPor.List(cboOrdenarPor.ListIndex, 0)
        'define a direção
        Select Case cboDirecao.ListIndex
        Case Ascendente
            sqlOrderBy = sqlOrderBy & " ASC"
        Case Descendente
            sqlOrderBy = sqlOrderBy & " DESC"
        End Select
        'une a query order ao sql
        sql = sql & sqlOrderBy
    End If

    Set rst = New ADODB.Recordset
    rst.CursorLocation = adUseClient
    With rst
        .ActiveConnection = conn
        .Open sql, conn, adOpenForwardOnly, _
              adLockBatchOptimistic
    End With

    Set rst.ActiveConnection = Nothing

    ' Fecha a conexão.
    conn.Close

    Set PreecheRecordSet = rst
    Exit Function
TrataErro:
    Set rst = Nothing
End Function
[]s
Grande Professor,
Muito obrigado! Veja se ficou bom. Fiz umas modificações! Não tem mais conflitos. E ficou do jeito que imaginei! :D

Valeu Muito!!!
Anexos
Registro de Protocolo_atualizado2.zip
Meu arquivo atualizado
(231.04 KiB) Baixado 343 vezes



Henry-Systems
Colaborador
Colaborador
Mensagens: 96
Registrado em: Sáb Nov 26, 2011 1:05 pm
Localização: Rio Grande da Serra - São Paulo
Contato:

Re: MontaClausulaWhere usando DATAS ?

Mensagem por Henry-Systems » Dom Nov 11, 2012 9:28 pm

Muito bom.

Estou tentando adaptar às minhas necessidades.

Abraços
Ronaldo Filho escreveu:
Mauro Coutinho escreveu:Ronaldo, de fato se alterar a formatação conforme disse sobre data e hora funciona, este seria um proximo passo se você confirmasse que iria utilizar as Horas tambem, não comentei nada antes pois como eu disse não sabia se iria utilizar os TextBoxs Horas separados, mas valeu pelo seu esforço, é sinal que realmente tem intensão de aprender e não somente ter tudo pronto. Parabens.

Então vamos a algumas considerações,
Na rotina que alterou, não sei se foi o sono, mas no "Case 0" a linha tem de estar com a mesma formatação "mm/dd/yyyy hh:mm", acerte na rotina.

Quanto a questão do Login troque a function PreecheRecordSet pela abaixo:
A questão é somente a ordem das sequencias, Login primeiro depois montamos as outras Clausulas, em alguns testes rapidos aqui deu certo, refaça os testes com mais dados e veja se corre tudo bem.

Código: Selecionar todos

Private Function PreecheRecordSet(ByVal Protocolo As String, _
                                  ByVal Placa As String, _
                                  ByVal Arquivo As String, _
                                  ByVal Obs As String, _
                                  ByVal DataInicio As String, _
                                  ByVal DataFim As String) As Recordset
                                  
    On Error GoTo TrataErro

    Dim conn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim sql As String
    Dim sqlWhere As String
    Dim sqlOrderBy As String
    Dim i As Integer
    Dim campo As Field
    Dim myArray() As Variant

    Set conn = New ADODB.Connection
    With conn
        .Provider = "Microsoft.JET.OLEDB.4.0"
        .ConnectionString = "Data Source=" & caminhoArquivoDados & ";Extended Properties=Excel 8.0;"
        .Open
    End With

    sql = "SELECT * FROM [Fornecedores$]"
    
    'Login
    For i = 1 To lstLogin.ListCount
        'verifica se o item está selecionado
        If lstLogin.Selected(i - 1) Then
            'Monta a cláusula WHERE com OR
            Debug.Print lstLogin.List(i - 1) & " selecionado"
            If sqlWhere <> vbNullString Then
                sqlWhere = sqlWhere & " OR"
            End If
            sqlWhere = sqlWhere & " UCASE(Login) LIKE UCASE('%" & Trim(lstLogin.List(i - 1)) & "%')"
        End If
    Next

'monta a cláusula WHERE
'Protocolo
    Call MontaClausulaWhere(txtProtocolo.Name, "Protocolo", sqlWhere)
'Placa
    Call MontaClausulaWhere(txtPlaca.Name, "Placa", sqlWhere)
'Arquivo
    Call MontaClausulaWhere(txtArquivo.Name, "Arquivo", sqlWhere)
'DATA
    Call MontaClausulaWhere(txtDataini.Name, "Data", sqlWhere) 'Coluna DATA
'Obs
    Call MontaClausulaWhere(txtObs.Name, "Obs", sqlWhere)
    
    'faz a união da string SQL com a cláusula WHERE
    If sqlWhere <> vbNullString Then
        sql = sql & " WHERE " & sqlWhere
    End If

    'faz a união da string SQL com a cláusula ORDER BY
    If cboOrdenarPor.ListIndex <> -1 Then
        sqlOrderBy = " ORDER BY " & cboOrdenarPor.List(cboOrdenarPor.ListIndex, 0)
        'define a direção
        Select Case cboDirecao.ListIndex
        Case Ascendente
            sqlOrderBy = sqlOrderBy & " ASC"
        Case Descendente
            sqlOrderBy = sqlOrderBy & " DESC"
        End Select
        'une a query order ao sql
        sql = sql & sqlOrderBy
    End If

    Set rst = New ADODB.Recordset
    rst.CursorLocation = adUseClient
    With rst
        .ActiveConnection = conn
        .Open sql, conn, adOpenForwardOnly, _
              adLockBatchOptimistic
    End With

    Set rst.ActiveConnection = Nothing

    ' Fecha a conexão.
    conn.Close

    Set PreecheRecordSet = rst
    Exit Function
TrataErro:
    Set rst = Nothing
End Function
[]s
Grande Professor,
Muito obrigado! Veja se ficou bom. Fiz umas modificações! Não tem mais conflitos. E ficou do jeito que imaginei! :D

Valeu Muito!!!



Henry-Systems
Colaborador
Colaborador
Mensagens: 96
Registrado em: Sáb Nov 26, 2011 1:05 pm
Localização: Rio Grande da Serra - São Paulo
Contato:

Re: MontaClausulaWhere usando DATAS ?

Mensagem por Henry-Systems » Sex Fev 22, 2013 5:30 pm

Salve, salve Tomás.

Estou precisando de um help e de sua expertise...

Adaptei a idiea do Mauro e do nosso amigo Ronaldo Filho ao meu projeto de entrevista do RH.

Fiz todas as adaptações nocódigo e o mesmo funciona em parte, por exemplo tenho datas do dia 01/11/2012 até ao dia 11/11/2012 e depois datas no mês Dezembro.

Quando seleciono um intervalo de 01 a 11 de Novembro a pesquisa sai certa, mas por exemplo se faço a mesma pesquisa de 01 a 12 de Novembro aí aparece uma data do inicio do mês de Dezembro.

Já refiz o código uma série de vezes e o problema continua.

Estou deixando em anexo o trabalho para que possa dar uma olhada no código para ver onde estou errando, pois devo estar deixando passar alguma coisa.

Desde já agradeço pela ajuda.

Abraços
webmaster escreveu:Mauro,

Sem problemas. Nem eu encontrei.... :lol: Só lembrei que já tinha falado sobre.

O que acha dessa sugestão de melhoria?

Código: Selecionar todos

Private Sub MontaClausulaWhere(ByVal NomeControle As String, ByVal NomeCampo As String, ByRef sqlWhere As String)
   
    If Trim(Me.Controls(NomeControle).Text) <> vbNullString Then
        If sqlWhere <> vbNullString Then
            sqlWhere = sqlWhere & " AND"
        End If
   
    If IsDate(Me.Controls(NomeControle).Text) Then
            sqlWhere = sqlWhere & " (" & NomeCampo & ") = #" & Format(txtDataIni, "m/d/yyyy") & "#"
        Else
            sqlWhere = sqlWhere & " UCASE(" & NomeCampo & ") LIKE UCASE('%" & Trim(Me.Controls(NomeControle).Text) & "%')"
        End If
    End If
   
End Sub
Assim, não fica para um controle específico, e sim para qualquer um que contenha uma data válida. Veja se funciona.

Abraços
Anexos
Macro - RH - BDAccess.rar
Entrevista RH
(361.11 KiB) Baixado 256 vezes



Avatar do usuário
webmaster
Administrador
Mensagens: 2796
Registrado em: Sex Jul 24, 2009 2:44 pm
Contato:

Re: MontaClausulaWhere usando DATAS ?

Mensagem por webmaster » Qua Fev 27, 2013 5:06 pm

Henry,

Desculpe a demora. A coisa está intensa por aqui. Não consegui executar o projeto. Dá erro de automação.

De toda forma, Datas em programação seguem o formato norte-americano. Antes de continuar, teste como você está coletando as datas e os valores delas, principalmente com as funções Month e Day. É um incômodo enorme, mas é uma das desvantagens do formato tupiniquim.

Do que vejo, apesar de receber as datas no formato brasileiro no formulário, no momento em que ela passar para o código, considerar o formato americano. É uma visão. De repente ajuda.

Abraços


Tomás
https://www.tomasvasquez.com.br/blog
https://www.tomasvasquez.com.br/cursocsharp
https://twitter.com/tomamais
Se sua dúvida foi solucionada, acrescente [RESOLVIDO] ao título.

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Responder