FILTRAR

CRCJ 06/01/2015 16:40:38
#443635
Srs Boa Tarde
Estou elaborando um sistema em VBNET de contas a pagar e receber, o cadastro eu já consegui fazer.Tenho um formulário de relatório dessas contas onde eu tenho um combo (Pagar, Pago Receber, Recebida) outro combo (Fornecedores) uma TextBox ( Data Inicial ) e outra TextBox (Data Final ) e uma DataGridView e estou precisando filtrar nessa DataGridView o seguinte, por EX:
Todas as contas a Pagar de um Fornecedor ( x ) no período de 11/11/1111 até 22/22/2222, e o resultado será mostrado na DataGridView.
Os dados estão gravados no Access 2007 e estou usando Visual Studio 2010, Segue o código que estou usando, e a tela do relatório.

Imports System
Imports System.Data
Imports System.Data.OleDb

Public Class RelaContasCompleto
Inherits System.Windows.Forms.Form

[ô] DataTable que vou carregar e trabalhar...
Dim dt As DataTable
Dim ds As New DataSet
Public conn As OleDbConnection
Public da As OleDbDataAdapter
Public cb As OleDbCommandBuilder

[ô]ABERTURA DO FORMULÁRIO
Private Sub RelaContasCompleto_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

[ô]CARREGA OS ITENS NO COMBO POSIÇÃO DA CONTA
CmbPosicaoConta.Items.Add([Ô]Pagar[Ô])
CmbPosicaoConta.Items.Add([Ô]Pago[Ô])
CmbPosicaoConta.Items.Add([Ô]Receber[Ô])
CmbPosicaoConta.Items.Add([Ô]Recebida[Ô])

CmbPosicaoConta.Focus()
btnFiltrar.Text = [Ô]Filtrar[Ô]

[ô]FAZ A CONEXÃO COM O BANCO DE DADOS E CARREGA A LISTA DE FORNECEDORES NO COMBO FORNECEDOR
CmbFornecedor.Items.Clear() [ô] Apaga os itens existentes. Previne a duplicação dos mesmos
Dim ligação As String = [Ô]Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\cadastro.mdb;jet oledb:database password=adm[Ô]
Dim sintaxe As String = [Ô]Select * From Fornecedor where fornecedor<>null order by fornecedor asc[Ô]
Dim conecção As New OleDbConnection(ligação)
Dim command As New OleDbCommand(sintaxe, conecção)
conecção.Open()
Dim leitor As OleDbDataReader = command.ExecuteReader()
If leitor.HasRows Then
While leitor.Read
CmbFornecedor.Items.Add(leitor.Item([Ô]fornecedor[Ô]))
End While
End If
conecção.Close()
sintaxe = Nothing
conecção = Nothing

ObterDados()
End Sub
[ô]CARREGA TODOS OS DADOS NO FORMÚLÁRIO CONTAS
Private Sub ObterDados()
Dim aut As New Contas()
dt = aut.GetContas()
dgContas.DataSource = dt
dgContas.ReadOnly = True

txtCodigo.DataBindings.Clear()
TxtDataRecebimento.DataBindings.Clear()
TxtDataVencimento.DataBindings.Clear()
TxtValor.DataBindings.Clear()
TxtTipo.DataBindings.Clear()
TxtPosicaoConta.DataBindings.Clear()
TxtDocumento.DataBindings.Clear()
TxtFornecedor.DataBindings.Clear()
txtCodigoBarras.DataBindings.Clear()
Me.txtTotal.Text = [Ô][Ô]

[ô]ALINHA TODAS AS COLUNAS DO DATA GRID VIEW E FORMATA O TAMANHO
For Each columns As DataGridViewColumn In Me.dgContas.Columns
Me.dgContas.Columns(columns.Index).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
Next

[ô]ALINHA AS COLUNAS E DIMENCIONA A LARGURA NO MODO INDIVIDUAL E ALTERA O NOME DA COLUNA
[ô]Código
dgContas.Columns(0).HeaderText = [Ô]Código[Ô]
dgContas.Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
[ô]Data Do Recebimento
dgContas.Columns(1).HeaderText = [Ô]Recebimento[Ô]
dgContas.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
dgContas.Columns(1).Width = 80
[ô][ô]Data Do Vencimento
dgContas.Columns(2).HeaderText = [Ô]Vencimento[Ô]
dgContas.Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
dgContas.Columns(2).Width = 80
[ô]Valor
dgContas.Columns(3).HeaderText = [Ô]Valor[Ô]
dgContas.Columns(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
dgContas.Columns(3).Width = 120
[ô]Nº Do Documento
dgContas.Columns(4).HeaderText = [Ô]Documento[Ô]
dgContas.Columns(4).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
dgContas.Columns(4).Width = 105
[ô]Tipo
dgContas.Columns(5).HeaderText = [Ô]Tipo[Ô]
dgContas.Columns(5).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
dgContas.Columns(5).Width = 120
[ô]Posição Da conta
dgContas.Columns(6).HeaderText = [Ô]Posição[Ô]
dgContas.Columns(6).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
dgContas.Columns(6).Width = 70
[ô]Novo Vencimento
dgContas.Columns(7).HeaderText = [Ô]Novo Vencimento[Ô]
dgContas.Columns(7).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
dgContas.Columns(7).Width = 80
[ô]Novo Valor
dgContas.Columns(8).HeaderText = [Ô]Novo Valor[Ô]
dgContas.Columns(8).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
dgContas.Columns(8).Width = 120
[ô]Acréscimo
dgContas.Columns(9).HeaderText = [Ô]Acréscimo[Ô]
dgContas.Columns(9).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
dgContas.Columns(9).Width = 120
[ô]Fornecedor
dgContas.Columns(10).HeaderText = [Ô]Fornecedor[Ô]
dgContas.Columns(10).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
dgContas.Columns(10).Width = 200
[ô]Banco
dgContas.Columns(11).HeaderText = [Ô]Banco[Ô]
dgContas.Columns(11).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
dgContas.Columns(11).Width = 150
[ô]Código De Barras
dgContas.Columns(12).HeaderText = [Ô]Código De Barras[Ô]
dgContas.Columns(12).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
dgContas.Columns(12).Width = 150
[ô]Obs
dgContas.Columns(13).HeaderText = [Ô]Obs[Ô]
dgContas.Columns(13).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
dgContas.Columns(13).Width = 150

[ô]CARREGA TODOS OS DADOS NA DATA GRID VIEW E MOSTRA NOS TEXT BOX
txtCodigo.DataBindings.Add([Ô]Text[Ô], dt, [Ô]codigo[Ô])
TxtDataRecebimento.DataBindings.Add([Ô]Text[Ô], dt, [Ô]recebimento[Ô], (Funcoes.OpcaoFormata.ForData))
TxtDataVencimento.DataBindings.Add([Ô]Text[Ô], dt, [Ô]vencimento[Ô], (Funcoes.OpcaoFormata.ForData))
TxtValor.DataBindings.Add([Ô]Text[Ô], dt, [Ô]valor[Ô])
TxtTipo.DataBindings.Add([Ô]Text[Ô], dt, [Ô]tipo[Ô])
TxtPosicaoConta.DataBindings.Add([Ô]Text[Ô], dt, [Ô]posicaoconta[Ô])
TxtDocumento.DataBindings.Add([Ô]Text[Ô], dt, [Ô]documento[Ô])
TxtFornecedor.DataBindings.Add([Ô]Text[Ô], dt, [Ô]fornecedor[Ô])
txtCodigoBarras.DataBindings.Add([Ô]Text[Ô], dt, [Ô]codigobarras[Ô])

[ô]DEFINE A COR DO CABEÇALHO
Dim estilo_cabecalho As New DataGridViewCellStyle
estilo_cabecalho.BackColor = Color.LightYellow
dgContas.Columns(0).HeaderCell.Style = estilo_cabecalho
dgContas.Columns(1).HeaderCell.Style = estilo_cabecalho
dgContas.Columns(2).HeaderCell.Style = estilo_cabecalho
dgContas.Columns(3).HeaderCell.Style = estilo_cabecalho
dgContas.Columns(4).HeaderCell.Style = estilo_cabecalho
dgContas.Columns(5).HeaderCell.Style = estilo_cabecalho
dgContas.Columns(6).HeaderCell.Style = estilo_cabecalho
dgContas.Columns(7).HeaderCell.Style = estilo_cabecalho
dgContas.Columns(8).HeaderCell.Style = estilo_cabecalho
dgContas.Columns(9).HeaderCell.Style = estilo_cabecalho
dgContas.Columns(10).HeaderCell.Style = estilo_cabecalho
dgContas.Columns(11).HeaderCell.Style = estilo_cabecalho
dgContas.Columns(12).HeaderCell.Style = estilo_cabecalho
dgContas.Columns(13).HeaderCell.Style = estilo_cabecalho
[ô] desabilita o estilo visual do cabecalho
dgContas.EnableHeadersVisualStyles = False

[ô]DEFINE A COR DAS LINHAS
For x As Integer = 1 To dgContas.Rows.Count Step 1
If x Mod 2 = 0 Then
dgContas.Rows(x - 1).DefaultCellStyle.BackColor = Color.Gainsboro
Else
dgContas.Rows(x - 1).DefaultCellStyle.BackColor = Color.White
End If
Next
End Sub


End Class
TUNUSAT 07/01/2015 08:28:39
#443646
CRCJ,

Você tem que colocar um botão para atualizar baseado na range (faixa) de datas que foram digitados nos campos de datas inicial e data final.
Este botão irá fazer o seguinte:
- Limpar a grade;
- Disparar novamente a query de consulta que você chamou de [Ô]sintaxe[Ô] (está no seu código acima) mas modificada para ter dentro da cláusula [Ô]WHERE[Ô] outra condição (COM [Ô]AND[Ô]) isolando as datas mínima e data máxima que você quer dentro da grid;

Seria algo deste tipo:

Dim sintaxe As String = [Ô]Select * [Ô] & _
[Ô]From Fornecedor [Ô] & _
[Ô]where fornecedor<>null AND [Ô] & _
[Ô]Data Inicial >= [Ô] & dtaINICIAL & _
[Ô]Data Final <= [Ô] & dtaFinal & _
[Ô]order by fornecedor asc[Ô]

- Tenta fazer, se você não conseguir me avisa que te ajudo.

Dica: Tenta NÃO usar a [Ô]*[Ô], descreva campo a campo que você realmente vai precisar... mesmo que seja todos.

[][ô]s,
Tunusat.
CRCJ 07/01/2015 10:38:56
#443651
Tunusat., bom dia
Na realidade eu não queria colocar um botão, o que eu queria é quando escolho no combo posição da conta (Pagar, Pago...) no combo fornecedor (AAAAAAAA.....) e digitase a data inicial e a data final e apertar a tecla enter, já me daria o filtro na Grid (isso eu sei fazer em VB) , mas tudo bem se não der, não tem problema. Agora vou precisar da sua ajuda, como sou novo em VBNET, não sei como e onde colocar o que você me mandou, pode me ajudar.
TUNUSAT 07/01/2015 10:57:10
#443652
CRCJ,

Não tem problema, coloque o tratamento no evento [Ô]lost focus[Ô] do campo da segunda data, por exemplo.

[][ô]s,
Tunusat.
CRCJ 07/01/2015 16:32:04
#443657
Tunusat, boa tarde
Antes de pedir ajuda aqui, eu tinha feito um filtro com um botão para filtrar, ( segue abaixo o código ), só que ele me filtra todas as contas para pagar ( por exemplo ), sem as datas inciais e finais. Desculpe a minha incapacidade de entender o que você me mandou, não vou mentir, não entedi nada. Se fosse possivel me ajudar com o código completo, ficaria muito grato.
Segue o código que fiz anteriormente:

[ô]FILTRO NO COMBO POSIÇÃO DA CONTA
Private Sub btnFiltrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFiltrar.Click
If btnFiltrar.Text = [Ô]Filtrar[Ô] Then
If Trim(CmbPosicaoConta.Text) = [Ô][Ô] Then
If MsgBox([Ô]VOÇE DEVE ESCOLHER UMA POSIÇÃO DA CONTA[Ô], MsgBoxStyle.Information, [Ô]POSIÇÃO DA CONTA[Ô]) Then
CmbPosicaoConta.Focus()
Exit Sub
End If
End If
da = New OleDbDataAdapter
ds = New DataSet
conn = New OleDbConnection([Ô]Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\cadastro.mdb;jet oledb:database password=adm[Ô])
da = New OleDbDataAdapter([Ô]SELECT * FROM Contas WHERE posicaoconta LIKE [ô][Ô] & CmbPosicaoConta.Text & [Ô]%[ô] [Ô], conn)
cb = New OleDbCommandBuilder(da)
ObterDados()
da.Fill(ds, [Ô]Cadastro[Ô])
dgContas.DataSource = ds.Tables(0)
btnFiltrar.Text = [Ô]Todos[Ô]
Else
btnFiltrar.Text = [Ô]Filtrar[Ô]
ObterDados()
Dispose()
Dim f As New RelaContasCompleto
f.Show()
End If



[ô]SOMA TOTOS OS VALORES DA COLUNA VALOR NO DATA GRID VIEW
Try
Dim SomaColuna As Double
For Each coluna As DataGridViewRow In dgContas.Rows
If Me.dgContas.Rows(coluna.Index).DefaultCellStyle.BackColor <> Color.Silver Then
SomaColuna = SomaColuna + coluna.Cells(3).Value
End If
Next
txtTotal.Text = Format(Convert.ToDouble(SomaColuna), [Ô]#,##0.00[Ô])
Catch ex As Exception
MsgBox(ex.ToString)
End Try


End Sub



End Class
TUNUSAT 08/01/2015 08:29:20
#443660
CRCJ,

Basicamente o código é muito parecido, podendo até ser reutilizado ou modificado o código acima.
Seus campos data são do tipo [Ô]DateTimePicker[Ô]? é legal você usar este tipo de objeto. Está na sua ToolBox.
Você acrescenta dois [Ô]IFs[Ô] para verificar se foi preenchido o campo DateTimePicker. Não esqueça de declarar o [Ô]Imports[Ô] Por exemplo rapidamente...:
Imports System.Text

Dim strQuery As New StringBuilder

If Not DateTimePicker1.Value >= Now Then
strQuery.Append([Ô] AND dtInicial >= [Ô])
strQuery.Append(DateTimePicker1)
End If

If Not Date.Compare(Now, DateTimePicker1.Value) Then
strQuery.AppendFormat(([Ô]AND dtInicial >= {0}[Ô] & Environment.NewLine), DateTimePicker1.Value)
End If


Sacou? Você [Ô]monta[Ô] sua query antes de dispará-la dentro do seu OleDbDataAdapter.
Depois você pode substituir aqui:
da = New OleDbDataAdapter(strQuery.ToString(), conn)


Use uma [Ô]StringBuilder[Ô] para construir isto.
Veja mais sobre String Buider em:

=======================================
VB.NET StringBuilder Examples
http://www.dotnetperls.com/stringbuilder-vbnet
=======================================
StringBuilder : tratando Strings de modo mais eficiente.
http://www.macoratti.net/vbn_strb.htm
=======================================
Usando a classe StringBuilder no .NET Framework
http://msdn.microsoft.com/pt-br/library/2839d5h5(v=vs.110).aspx
=======================================

Veja se você consegue.

[][ô]s,
Tunusat.
CRCJ 08/01/2015 14:52:24
#443663
Tunusat., boa tarde
Não consegui fazer isso, tentei de todas as maneiras, mas não funcionou. Outra coisa dtInicial ?, não entendi, se eu tenho DateTimePicker1
TUNUSAT 09/01/2015 08:59:19
#443675
CRCJ,

[Ô]dtInicial[Ô] é para você trocar com o nome de seu campo no banco de dados.

Você coloca mais uma restrição na sua cláusula WHERE, dai você associa o nome do seu campo no banco de dados com sua datetimepicker.

Dá uma olhada neste artigo:

==================================================================
Trabalhando com datas no SQL Server
http://imasters.com.br/artigo/229/sql-server/trabalhando-com-datas-no-sql-server/#
==================================================================

Com o BETWEEN você pode colocar duas datas também, veja o exemplo:

http://msdn.microsoft.com/pt-br/library/ms187922.aspx
USE AdventureWorks2012;
GO
SELECT BusinessEntityID, RateChangeDate
FROM HumanResources.EmployeePayHistory

WHERE RateChangeDate BETWEEN [ô]20011212[ô] AND [ô]20020105[ô];


[][ô]s,
Tunusat.
Tópico encerrado , respostas não são mais permitidas