DUVIDAS NA CLAUSULA WHERE

WATZECK 26/08/2013 20:33:19
#428146
Boa noite galera, sou eu novamente solicitando ajuda do pessoal do vbmania.

Estou com uma dúvida na cláusula where de uma combobox, vou colocar abaixo o código que usei para facilitar o entendimento.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If cboDepto.Text = String.Empty Then
MessageBox.Show([Ô]Favor inserir o Departamento que Pretende Consultar.[Ô], [Ô]Alerta de Campo Vazio!!![Ô], MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
cboDepto.Focus()
Exit Sub
End If
dgdPesqProt.Rows.Clear()
[ô]Conexão com a Base de Dados Access
Dim Cn As OleDbConnection
Dim cmd As OleDbCommand
Dim cmdsql As New StringBuilder
Dim DR As OleDbDataReader
cmdsql.Append([Ô]SELECT codigo, Data, Num_Cond, Nome_Cond, Depto, Cod_Usuario, Usuario, A_C, Cod_Descr, Descricao FROM Protocolos WHERE Depto = [Ô] & cboDepto.Text)
cmdsql.Append([Ô] ORDER BY Val(codigo)[Ô])
Cn = New OleDbConnection(conexao)
cmd = New OleDbCommand(cmdsql.ToString, Cn)
Try
Cn.Open()
DR = cmd.ExecuteReader()
Do While DR.Read()
dgdPesqProt.Rows.Add(DR.GetValue(0).ToString, DR.GetValue(1).ToString, DR.GetValue(2).ToString, DR.GetValue(3).ToString,
DR.GetValue(4).ToString, DR.GetValue(5).ToString, DR.GetValue(6).ToString, DR.GetValue(7).ToString,
DR.GetValue(8).ToString, DR.GetValue(9).ToString)
Loop
DR.Close()
Catch ex As Exception
MessageBox.Show([Ô]Mensagem de Erro: [Ô] + ex.ToString + [Ô] - [Ô] + ex.Message)
Finally
[ô] A conexão deve ser fechada tanto em caso de sucessor ou fracasso (Erro)
[ô] Portanto usamos a clausula Finally
If Cn.State <> ConnectionState.Closed Then Cn.Close()
End Try
dgdPesqProt.Focus()
End Sub

Eu utilizei os mesmo códigos com o SELECT (abaixo) e funcionou perfeitamente.
cmdsql.Append([Ô]SELECT codigo, Data, Num_Cond, Nome_Cond, Depto, Cod_Usuario, Usuario, A_C, Cod_Descr, Descricao FROM Protocolos WHERE Num_Cond = [Ô] & txtNumCond.Text)
cmdsql.Append([Ô] ORDER BY Val(codigo)[Ô])

O meu formulário é para consultar os protocolos existentes, através de 4 RadioButton (Data, Nº Cond, Nº Usuário, e Departamento), mas por data e por departamento não estou conseguindo pesquisar.
Segue abaixo o SELECT que usei na cláusula Where por data.
cmdsql.Append([Ô]SELECT codigo, Data, Num_Cond, Nome_Cond, Depto, Cod_Usuario, Usuario, A_C, Cod_Descr, Descricao FROM Protocolos WHERE Data >= [Ô] & mskInicial.Text & [Ô] AND Data <= [Ô] & mskFinal.Text)
cmdsql.Append([Ô] ORDER BY Val(codigo)[Ô])

Eu usei MaskedTextBox.

Novamente peço a ajuda de todos para solucionar esse problema.
Muito obrigado.
FILMAN 26/08/2013 22:57:37
#428151
Resposta escolhida
Qual o tipo de campo que é o Departamento?
creio que não seja numérico, portanto deve utilizar aspas simples (apostrofo) para localizar o departamento

       cmdsql.Append([Ô]SELECT codigo, Data, Num_Cond, Nome_Cond, Depto, Cod_Usuario, Usuario, A_C, Cod_Descr, Descricao FROM Protocolos WHERE Depto = [ô][Ô] & cboDepto.Text & [Ô][ô][Ô])
cmdsql.Append([Ô] ORDER BY Val(codigo)[Ô])


Já o campo data se realmente for data pelo que percebi você esta utilizando o access então faça assim

           cmdsql.Append([Ô]SELECT codigo, Data, Num_Cond, Nome_Cond, Depto, Cod_Usuario, Usuario, A_C, Cod_Descr, Descricao FROM Protocolos WHERE Data BETWEEN [ô]#[Ô] & mskInicial.Text & [Ô]#[ô] AND [ô]#[Ô] & mskFinal.Text & [Ô]#[ô][Ô])
cmdsql.Append([Ô] ORDER BY Val(codigo)[Ô])



Espero ter ajudado
WATZECK 27/08/2013 00:11:58
#428153
Sr. Filman, Boa noite.

Cara muito obrigado pela ajuda, referente o ComboBox, funcionou perfeitamente acrescentando o apostrofo.
Confesso que eu não sabia desse detalhe, tenho muito que aprender sobre VB. Net

Referente a Data, não funcionou.
Eu nunca havia utilizado esse sustenido (#) em VB.NET.

Mais uma vez, muito obrigado pela ajuda, você já me ajudou a resolver um problema.
Que Deus abençoe você e todos os demais que ajudam o próximo.

Parabéns ao Fórum VBMania!
SAMUKA 27/08/2013 07:49:15
#428156
WATZECK, isso não é VB.NET isso é SQL, a Linguagem dos Bancos de Dados Relacionais. é muito importante estudar SQL
PEGUDO 27/08/2013 08:18:26
#428157
se o seu campo onde ficam as datas for do tipo DATE, então a variável não pode estar entre aspas simples.
Exemplo:
Ao invés de: [txt-color=#e80000][Ô]SELECT * FROM tblDados WHERE campo_data <= [ô]#[Ô][/txt-color] & varData & [txt-color=#e80000][Ô]#[ô] [Ô][/txt-color]
Retire as aspas simples: [Ô][txt-color=#e80000][Ô]SELECT * FROM tblDados WHERE campo_data <= #[Ô][/txt-color] & varData & [txt-color=#e80000][Ô]#[Ô][/txt-color]
PROFESSOR 27/08/2013 22:42:17
#428212
O BETWEEN funciona sem problema algum com a maioria das bases de dados.

Uma pequena correção: O [Ô]jogo da velha[Ô] ( # ), também chamado de [Ô]Pond[Ô], [Ô]Sharp[Ô], [Ô]Cerquilha[Ô] e [Ô]Sustenido[Ô], é delimitador padrão para data e hora na lingüagem Basic e suas derivadas, como VBA e VB.Net. Para o ANSI SQL, requer o padrão 92 no mínimo, de forma que não são todos os mecanismos que interpretam esse símbolo. Por sorte, o Jet Engine utiliza o Access SQL, que reconhece. Assim, a cerquilha não é assim [Ô]tão[Ô] universal, hehehe...

Mas repare que o MS-Access sempre irá salvar valores de campos do tipo DATA com o formato nativo, ou seja, MM/dd/YYYY HH:mm:ss.ttt, independente de se pedir que ele mostre com outra formatação.

Ao consultar, portanto, as datas devem respeitar esse formato de gravação, se você envia a consulta como um texto.

Em tempo:

No VB.Net você possui controle mais adequado á entrada de data e hora, o DateTimePicker.
Em um Masked, um valor arbitrário pode ser digitado que não represente data ou hora efetivamente.
Se quiser, só uma sugestão, use o DateTimePicker em lugar do Masked.

Ainda assim, como você está enviando um texto de consulta, formate o valor da entrada antes de a efetuar.

Por exemplo, depois de confirmar que ambos os Masked possuem valores de data válidos:

...
Dim dt0 As String = CType(mskInicial.Text, DateTime).ToString([Ô]MM/dd/YYYY[Ô])
Dim dt1 As String = CType(mskFinal.Text, DateTime).ToString([Ô]MM/dd/YYYY[Ô])
...
With cmdsql
.AppendLine([Ô]SELECT [Ô])
.AppendLine([Ô] codigo,Data,Num_Cond,Nome_Cond,Depto,Cod_Usuario,Usuario,A_C,Cod_Descr,Descricao [Ô])
.AppendLine([Ô]FROM [Ô])
.AppendLine([Ô] Protocolos [Ô])
.AppendLine([Ô]WHERE [Ô])
.AppendLine([Ô] Data BETWEEN [ô][Ô] & dt0 & [Ô][ô] AND [ô][Ô] & dt1 & [Ô][ô] [Ô])
.AppendLine([Ô]ORDER BY Val(codigo)[Ô])
End With
...


Outra forma (melhor para todos os efeitos) é aplicar o valor dos Masked em forma de data mesmo, via parâmetros do DbCommand, por exemplo assim:

...
Dim tabelaRetorno As New DataTable
Dim dt0 As DateTime = CType(mskInicial.Text, DateTime)
Dim dt1 As DateTime = CType(mskFinal.Text, DateTime)
Dim sq0 As String = [Ô]SELECT [...campos...] FROM [Protocolos] WHERE ([Data] BETWEEN ? AND ?) ORDER BY...[Ô]
Using adaptador As New OleDBDataAdapter(sq0, conexao)
adaptador.SelectCommand.Parameters.AddWithValue([Ô]@D0[Ô], dt0)
adaptador.SelectCommand.Parameters.AddWithValue([Ô]@D1[Ô], dt1)
adaptador.Fill(tabelaRetorno)
End Using
...


E finalmente, com o uso do DateTimePicker, ficaria ainda mais simples, por exemplo:
...
Const sq0 As String = [Ô]SELECT [...campos...] FROM [Protocolos] WHERE ([Data] BETWEEN ? AND ?) ORDER BY...[Ô]
...
Dim tabelaRetorno As New DataTable
Using adaptador As New OleDBDataAdapter(sq0, conexao)
With adaptador
With .SelectCommand.Parameters
.AddWithValue([Ô]@D0[Ô], DateTimePicker1.Value)
.AddWithValue([Ô]@D1[Ô], DateTimePicker2.Value)
End With
.Fill(tabelaRetorno)
End With
End Using
...


Acredito que deve ajudar.
F001E 28/08/2013 00:19:34
#428216
quanto ao filtro por Data, você precisa ver se o Usuário SA do SQL esta como English ou Brazilian...se estiver como English o formatado da data seria CampoData >= [ô][Ô] & 2013/01/01 & [Ô][ô] and CampoData <= [ô][Ô] & 2013/01/31 & [Ô][ô] e se estiver como Brazilian seria CampoData >= [ô][Ô] & 01/01/2013 & [Ô][ô] and CampoData <= [ô][Ô] & 31/01/2013 & [Ô][ô]...isso vale também se for usar o Between...
WATZECK 01/09/2013 00:47:20
#428356
Galera, agradeço a todos que escreveram no tópico para me ajudar, mas infelizmente ainda não funcionou.

Pegudo, eu retirei o apóstrofo, mas também não funcionou, não chega a dar erro, mas também não traz nenhum dado.

Professor, fiz o teste com os três exemplos, mas não funcionou nenhum, não sei se deixei de fazer alguma coisa.

F001E, obrigado pela dica, será muito útil.

Samuka, quero acreditar que sua crítica tenha sido construtiva, para que eu também possa lhe agradecer.

Obs.: Estou com meu projeto 98% pronto, só falta esse detalhe na consulta por data e outro no relatório que vou postar em seguida.

Estarei tentando até conseguir, e assim que funcionar posto o código para que vejam.

Mais uma vez, muito obrigado pela ajuda e boa vontade de ajudarem.
SAMUKA 02/09/2013 16:58:51
#428409
WATZECK, foi uma observação.

Sobre seu problema, apesar de você não pedir o Access guarda a data no formato completo.

E também, qdo vc faz uma consulta SQL, você precisa utilizar o padrão internacional de data que é mm/dd/yyyy isso independe do banco.

Para resolver seu problema, você pode formatar a data e o campo.

Exemplo:

SELECT codigo, Data, Num_Cond, Nome_Cond, Depto, Cod_Usuario, Usuario, A_C, Cod_Descr, Descricao FROM Protocolos WHERE FORMAT(Data,[ô]dd/MM/yyyy[ô]) BETWEEN #[Ô] & Format$(mskInicial.Text,[Ô]dd/MM/yyyy[Ô]) & [Ô]# AND #[Ô] & Format$(mskFinal.Text, [Ô]dd/MM/yyyy[Ô]) & [Ô]#[Ô]

O # é utilizado pelo Access para limitar datas.
Tópico encerrado , respostas não são mais permitidas