Vídeo recomendado
https://youtu.be/diWPPPhW-9E
https://youtu.be/diWPPPhW-9E
MontaClausulaWhere usando DATAS ?
- Mauro Coutinho
- Jedi
- Mensagens: 1561
- Registrado em: Sáb Mar 13, 2010 8:10 pm
- Localização: São José dos Pinhais - Pr
MontaClausulaWhere usando DATAS ?
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
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
Re: MontaClausulaWhere usando DATAS ?
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
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
- Mauro Coutinho
- 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 ?
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 :
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
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
Abraços
Re: MontaClausulaWhere usando DATAS ?
Mauro,
Sem problemas. Nem eu encontrei.... Só lembrei que já tinha falado sobre.
O que acha dessa sugestão de melhoria?
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
Sem problemas. Nem eu encontrei.... 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
Abraços
- Mauro Coutinho
- 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 ?
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
Grato
abraços
Re: MontaClausulaWhere usando DATAS ?
Sem problemas Mauro. A intenção é nunca parar de melhorar, certo?
Abraços
Abraços
Re: MontaClausulaWhere usando DATAS ?
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
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
- Mauro Coutinho
- 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 ?
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 :
Abraços, e mais uma vez parabéns pela iniciativa.
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
Re: MontaClausulaWhere usando DATAS ?
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
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
- Mauro Coutinho
- 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 ?
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.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
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