Vídeo recomendado
https://youtu.be/diWPPPhW-9E

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
Avatar do usuário
Mauro Coutinho
Jedi
Jedi
Mensagens: 1561
Registrado em: Sáb Mar 13, 2010 8:10 pm
Localização: São José dos Pinhais - Pr

MontaClausulaWhere usando DATAS ?

Mensagem por Mauro Coutinho »

Tomas, na personalização ao seu Modelo Cadastro para a minha utilização, tudo funciona corretamante conforme o pretendido, não obtive nenhum erro em nenhuma das adaptações, mas gostaria de uma ajuda na Rotina MontaClausulaWhere, em meu aplicativo eu uso um campo DATA, e alterei na Função PreecheRecordSet a linha :

Call MontaClausulaWhere(txtDataIni.Name, "DATA", sqlWhere)

e ao Filtrar, se solicito 4/1/2010 me é retornado tanto a data solicitada como todas as datas que contenha 4/1 ou seja 14/1/2010, 24/1/2010, cheguei a criar uma outra rotina baseada na PopulaLixtbox, eliminando algumas linhas e colocolando outra como :
(sql = "SELECT * FROM [Fornecedores$] WHERE [DATA] = #" & Format(txtDataIni, "m/d/yyyy") & "#") e tudo bem, mas o que gostaria de saber se tem como se utilizar a MontaClausulaWhere sem eu ter de criar essa nova rotina.

E aproveitando, pretendo tambem utilizar uma opção entre AS DATAS, se tambem for possível utilizar a MontaClausulaWhere, favor passar como eu deveria proceder.

Espero que tenha explicado corretamente.

abraços


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
webmaster
Administrador
Mensagens: 3114
Registrado em: Sex Jul 24, 2009 2:44 pm
Contato:

Re: MontaClausulaWhere usando DATAS ?

Mensagem por webmaster »

Mauro,

Acho que já respondi essa pergunta aqui. A resposta é não, a não se que modifique o método MontaClausulaWhere para aceitar mais algum parâmetro que identifique o mesmo como data e aplique as formatações necessárias. Podemos trabalhar em algo do tipo. O que acha?

Pode ser até uma funcionalidade para a próxima versão do modelo cadastro, com os devidos créditos ao colega Mauro, certo? ;)

Abraços


Avatar do usuário
Mauro Coutinho
Jedi
Jedi
Mensagens: 1561
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 »

Tomas, eu tinha efetuado busca no site procurando por MontaClausulaWhere e DATAS e sinceramente não tinha encontrado nada especifico a minha duvida (DATA)e depois de muita pesquisa na net, só encontrava links que me traziam de volta ao seu modelo, me desculpe, mas mais uma vez acabei esgotando meus reursos e postei a duvida, mais pelo stress de estar trabalhando em outros aplicativos que tinha de entregar, e tentando resolver outras coisas ao mesmo tempo, mas nada como refrescar a mente e lidar somente com uma coisa, que antes de você postar eu já ia colocar uma solução que encontrei, fiz alguns testes e funcionou, farei novos testes mais prolongados par ver se não da nenhum problema, então gostaria da opinião do mestre sobre o que fiz, se estaria correto, quanto a lidar com duas datas como eu comentei tambem, essa já tenho uma rotina separada, não com MontaClausulaWhere, mas tentarei achar algo.

O que fiz foi acrecentar mais um IF comparando o NomeControle, assim quando for o campo com a Data vai para a linha especifica :

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 NomeControle = "txtDataIni" 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
Aos poucos estou conseguindo entender um pouco mais como funciona as Rotinas e Function de seu modelo, e é como você ja disse em outro tópico, da para brincar bastante, é só entender e saber aonde mexer, pode levar um tempo mas eu chego lá.

Abraços


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

Re: MontaClausulaWhere usando DATAS ?

Mensagem por webmaster »

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


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: 1561
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 »

Valeu Tomas, pode não acreditar, mas depois que postei, tambem pensei que talves pudesse usar o IsDate, mas ia mexer nisso a noite somente, no momento não tenho como testar, depois posto o resultado.

Grato

abraços


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

Re: MontaClausulaWhere usando DATAS ?

Mensagem por webmaster »

Sem problemas Mauro. A intenção é nunca parar de melhorar, certo?

Abraços


Calizmo
Colaborador
Colaborador
Mensagens: 14
Registrado em: Sáb Jul 31, 2010 10:00 pm

Re: MontaClausulaWhere usando DATAS ?

Mensagem por Calizmo »

Caros Tomas e Mauro,

Fiz algumas adpatações no projeto Cadastro (utilizo o v2), pois tbém tenho necessidade de pesquisar a base de dados (planilha de movimentos CtasPagar) por data.
E como precisava buscar os dados por intervalo, utilizei uma variante da rotina, porém, colocando no bloco SQL : campoData >= #data_inicial# e campoData <= #data_inicial# , que funcionou corretamente.

Sds,
Cássio Motta

ps. o código não ficou aquela "belesura" mas antende ;) (sou iniciante em VBA).

E Parabéns ! pela seriedade com que os assuntos são abordados/tratados.

Cássio Motta


Avatar do usuário
Mauro Coutinho
Jedi
Jedi
Mensagens: 1561
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 »

Cássio, parabens pela iniciativa, é assim mesmo que chegamos a resultados que precisamos, os modelos cadastros enriqueceram muito meu aprendizado, e apesar de já estar familiarizado com VBA, não sou expert, mas quebro um galho, eu não tinha tido ainda experiências com Instrução SQL, então precisamos sempre ir tentando e nos aprimorando, e o compartilhamento aqui no forun é muito importante.
Voltando a sua colocação, eu tambem usei uma outra variante para buscar os dados por intervalos de Datas, só que usei uma adaptação da propria rotina Sub PopulaListBox, sem passar pelas Rotinas, PreecheRecordSet e MontaClausulaWhere, e funciona perfeitamente, tambem ficou um pouco robusta, e como de momento me serviu, parti para outros pontos que estou adaptando e assim que tiver concluído vou estudar uma maneira de jogar isso na MontaClausulaWhere, enxugando as rotinas no meu app.
Eu montei uma segunda Rotina da seguinte forma :

Código: Selecionar todos

Private Sub PopulaListBox2(ByVal DataInicio As String, ByVal DataFim As String)
    On Error GoTo TrataErro
    Dim rst As ADODB.Recordset
    Dim conn As ADODB.Connection
    Dim campo As Field
    Dim myArray() As Variant
    Dim i As Integer
    Dim sql As String

    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$] Where [DATA] >= #" & Format(txtDtIniP, "mm/dd/yyyy") & "#   AND DATA <= #" & Format(txtDtFimP, "mm/dd/yyyy") & "#ORDER BY DATA "
    
    Set rst = New ADODB.Recordset
        With rst
            .ActiveConnection = conn
            .Open sql, conn, adOpenDynamic, _
                  adLockBatchOptimistic
        End With
    
    'pega o número de registros para atribuí-lo ao listbox
    lstLista.ColumnCount = rst.Fields.Count

'Essas linhas são opcionais, definem a largura das Colunas que uso no meu ListBox
'lstLista.ColumnWidths = "1 cm;2 cm;2 cm;2 cm;4 cm;3 cm;5 cm;1 cm;0,8 cm"

    'preenche o combobox com os nomes dos campos
    'persiste o índice
    Dim indiceTemp As Long
    indiceTemp = cboOrdenarPor.ListIndex
    cboOrdenarPor.Clear
    For Each campo In rst.Fields
        cboOrdenarPor.AddItem campo.Name
    Next
    'recupera o índice selecionado
    cboOrdenarPor.ListIndex = indiceTemp

    'coloca as linhas do RecordSet num Array, se houver linhas neste
    If Not rst.EOF And Not rst.BOF Then
        myArray = rst.GetRows
        'troca linhas por colunas no Array
        myArray = Array2DTranspose(myArray)
        'atribui o Array ao listbox
        lstLista.List = myArray
        'adiciona a linha de cabeçalho da coluna
        lstLista.AddItem , 0
        'preenche o cabeçalho
        For i = 0 To rst.Fields.Count - 1
            lstLista.List(0, i) = rst.Fields(i).Name
        Next i
        'seleciona o primeiro item da lista
        lstLista.ListIndex = 0
    Else
        lstLista.Clear
    End If

    'atualiza o label de mensagens
    If lstLista.ListCount <= 0 Then
        lblMensagP.Caption = lstLista.ListCount & " registros encontrados"
    Else
        lblMensagP.Caption = lstLista.ListCount - 1 & " registros encontrados"
    End If

    ' Fecha o conjunto de registros.
    Set rst = Nothing
    ' Fecha a conexão.

TrataSaida:
    Exit Sub
TrataErro:
    Debug.Print Err.Description & vbNewLine & Err.Number & vbNewLine & Err.Source
    Resume TrataSaida
End Sub
Abraços, e mais uma vez parabéns pela iniciativa.


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

Re: MontaClausulaWhere usando DATAS ?

Mensagem por webmaster »

Pessoal,

Parabéns a todos pelas sugestões. Quanto a busca por datas, talvez seja o caso de usar a cláusula BETWEEN. Mais detalhes:

http://www.w3schools.com/sql/sql_between.asp

Abraços a todos


Avatar do usuário
Mauro Coutinho
Jedi
Jedi
Mensagens: 1561
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 »

webmaster escreveu:Pessoal,
Parabéns a todos pelas sugestões. Quanto a busca por datas, talvez seja o caso de usar a cláusula BETWEEN. Mais detalhes:
http://www.w3schools.com/sql/sql_between.asp
Abraços a todos
Tomas, eu já tenho esse site no meu favoritos, e já havia até feitos alguns testes no editor online deles, ótimo mesmo, vale a pena mante-lo sempre a mão, e pelo menos pelas varias buscas que fiz foi o único que encontrei com material mais completo, mas se tiver conhecimentos de outros, por favor, é sempre bom termos opções.
Mas é como eu disse acima, foi uma solução paliativa e imediata para resolver esse empasse que necessitava, e assim que tiver resolvido os outros pontos irei retornar a mesma, não só pelas Datas mas pelo fato de a opção de ordenar "cboOrdenarPor" não funcionar, mas mantive a mesma para eu não esquecer que tenho de mexer.

abraços


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