Chamuanza Posted May 8, 2009 at 09:48 PM Report #262509 Posted May 8, 2009 at 09:48 PM oi Pessoal Numa Form faço o select das despesas, noutra Form faço o select dos depositos. Tenho este código e ao fazer o Select, quando coloco a DataInicial igual a Datafinal o select não apresenta qualquer registo. Se colocar a DataFim posterior ao ultimo registo aparecem os ultimos registos, mas faltam os registos correspondentes a Datainicial. Se colocar a DataInicial anterior ao primeiro registo, e a datafin superior ao ultimo registo então ainda fica pior, pois vai buscar valores a coluna das receitas (deposito) Estou todo baralhado ? Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click 'SELECT sobre Despesas ' Declaração de variáveis privadas Dim da As SqlDataAdapter Dim ds As DataSet If DateTimePicker1.Value > DateTimePicker2.Value Then MsgBox("A Data Inicial não pode ser Superior a Data Final", MsgBoxStyle.Information, "Data Inicial Maior que Data Final") DateTimePicker1.Focus() Exit Sub End If ''Converte a data e retira os carecteres a direita 'Dim DataInicio = Convert.ToString(DateTimePicker1.Value) 'DataInicio = DataInicio.Remove(10, 9) 'Dim DataFim = Convert.ToString(DateTimePicker2.Value) 'DataFim = DataFim.Remove(10, 9) Dim DataInicio As New DateTime(Now.Year, Now.Month, Now.Day, 0, 0, 0) Dim DataFim As New DateTime(Now.Year, Now.Month, Now.Day, 23, 59, 59) DataInicio = DateTimePicker1.Value DataFim = DateTimePicker2.Value ' Texto de ligação à base de dados Dim myConnectionString As String = _ "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Documents and Settings\Utilizador\" & _ "My Documents\BalancoFamiliar.mdf;" & _ "Integrated Security=True;Connect Timeout=30;User Instance=True" ' Cria uma nova ligação à base de dados Dim connection As New SqlConnection(myConnectionString) Dim SQL As String = "SELECT Id, Data, Despesa, Designacao [Designação],Categoria,SubCategoria, Familia FROM Principal Where Data Between '" & DataInicio & "' And '" & DataFim & "'" da = New SqlDataAdapter(SQL, connection) ' Cria um novo DataSet, ou seja, uma representação em memória da informação ds = New DataSet ' Coloca a informação da tabela definida no DataSet da.Fill(ds, "Principal") ' Define que a fonte de dados da DataGridView é a nossa DataSet ' criando automáticamente as colunas e linhas de dados Me.DataGridView1.DataSource = ds.Tables("Principal") ' Limpa a ligação à base de dados. Não é necessário fechar a ligação ' porque esta não foi aberta através do comando .Open() connection = Nothing Call ControlaGrid() End Sub Private Sub ControlaGrid() 'Controla a largura das colunas DataGridView1.Columns(0).Width = 50 'Id DataGridView1.Columns(1).Width = 75 'Data DataGridView1.Columns(1).DefaultCellStyle.Format = "d" DataGridView1.Columns(2).Width = 70 'Despesa DataGridView1.Columns(2).DefaultCellStyle.Format = "C2" DataGridView1.Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight DataGridView1.Columns(3).Width = 120 'Descrição DataGridView1.Columns(4).Width = 100 'Categoria DataGridView1.Columns(5).Width = 100 'SubCategoria DataGridView1.Columns(6).Width = 85 ' Famila End Sub 'SELECT sobre Depositos (Receitas) ' Declaração de variáveis privadas Dim da As SqlDataAdapter Dim ds As DataSet ''Converte a data e retira os carecteres a direita 'Dim DataInicio = Convert.ToString(DateTimePicker1.Value) 'DataInicio = DataInicio.Remove(10, 9) 'Dim DataFim = Convert.ToString(DateTimePicker2.Value) 'DataFim = DataFim.Remove(10, 9) If DateTimePicker1.Value > DateTimePicker2.Value Then MsgBox("A Data Inicial não pode ser Superior a Data Final", MsgBoxStyle.Information, "Data Inicial Maior que Data Final") ' DateTimePicker2.Value = DateTimePicker1.Value DateTimePicker1.Focus() Exit Sub End If Dim DataInicio As New DateTime(Now.Year, Now.Month, Now.Day, 0, 0, 0) Dim DataFim As New DateTime(Now.Year, Now.Month, Now.Day, 23, 59, 59) DataInicio = DateTimePicker1.Value DataFim = DateTimePicker2.Value ' Texto de ligação à base de dados Dim myConnectionString As String = _ "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Documents and Settings\Utilizador\" & _ "My Documents\BalancoFamiliar.mdf;" & _ "Integrated Security=True;Connect Timeout=30;User Instance=True" ' Cria uma nova ligação à base de dados Dim connection As New SqlConnection(myConnectionString) Dim SQL As String = "SELECT Id,Data,Deposito [Depósito],Designacao [Designação],Categoria,SubCategoria,Familia FROM Principal Where Deposito > '0' And Data Between @DataInicio And @DataFim" da = New SqlDataAdapter(SQL, connection) da.SelectCommand.Parameters.Add("@DataInicio", SqlDbType.DateTime).Value = DataInicio da.SelectCommand.Parameters.Add("@DataFim", SqlDbType.DateTime).Value = DataFim ' Cria um novo DataSet, ou seja, uma representação em memória da informação ds = New DataSet ' Coloca a informação da tabela definida no DataSet da.Fill(ds, "Principal") ' Define que a fonte de dados da DataGridView é a nossa DataSet ' criando automáticamente as colunas e linhas de dados Me.DataGridView2.DataSource = ds.Tables("Principal") ' Limpa a ligação à base de dados. Não é necessário fechar a ligação ' porque esta não foi aberta através do comando .Open() connection = Nothing Call ControlaGrid1() ' Limpa a ligação à base de dados. Não é necessário fechar a ligação 'porque esta não foi aberta através do comando .Open() connection = Nothing Call ControlaGrid1() End Sub Private Sub ControlaGrid1() 'Controla a largura das colunas DataGridView2.Columns(0).Width = 50 'Id DataGridView2.Columns(1).Width = 75 'Data DataGridView2.Columns(1).DefaultCellStyle.Format = "d" DataGridView2.Columns(2).Width = 70 'Despesa DataGridView2.Columns(2).DefaultCellStyle.Format = "C2" DataGridView2.Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight DataGridView2.Columns(3).Width = 120 'Descrição DataGridView2.Columns(4).Width = 100 'Categoria DataGridView2.Columns(5).Width = 100 'SubCategoria DataGridView2.Columns(6).Width = 85 ' Famila End Sub
jpaulino Posted May 8, 2009 at 10:54 PM Report #262526 Posted May 8, 2009 at 10:54 PM Dava para fazer um livro de erros 🙂 estou a brincar mas tens alguns 😕 Primeiro tu declaras uma variável do tipo DateTime, com a data e hora, e logo a seguir atribuis a data que está no datetimepicker. Dim DataInicio As New DateTime(Now.Year, Now.Month, Now.Day, 0, 0, 0) Dim DataFim As New DateTime(Now.Year, Now.Month, Now.Day, 23, 59, 59) DataInicio = DateTimePicker1.Value DataFim = DateTimePicker2.Value Tens de fazer: Dim DataInicio As New DateTime(DateTimePicker1.Value.Year, DateTimePicker1.Value.Month, DateTimePicker1.Value.Day, 0, 0, 0) Dim DataFim As New DateTime(DateTimePicker1.Value.Year, DateTimePicker1.Value.Month, DateTimePicker1.Value.Day, 23, 59, 59) Depois colocas simplesmente a data no SQL sem formatação ou sem parameters. Coloca lá os parameters como te mostrei e altera o SQL para: "... WHERE Data BETWEEN @DataInicio AND @DataFim"
Chamuanza Posted May 9, 2009 at 09:17 AM Author Report #262576 Posted May 9, 2009 at 09:17 AM Já o meu pai me dizia que "Quem não sabe é como quem não vê" E eu que só sei, que nada sei aqui estou baralhado na mesma Coloquei o código como indicaste,mas quando executo o select filtrando por datas ele vai buscar valores da coluna despesa que como podes verificar não está dentro do select. O mesmo se passa quando faço o select filtrando por datas das despesas, tambem me aparece valores dos depositos. É certo que na tabela existem depositos e despesas com a mesma data, mas para isso é que faço os select diferentes trocando a coluna despesa por deposito. De certeza que tenho algum erro nisto Dim DataInicio As New DateTime(DateTimePicker1.Value.Year, DateTimePicker1.Value.Month, DateTimePicker1.Value.Day, 0, 0, 0) Dim DataFim As New DateTime(DateTimePicker1.Value.Year, DateTimePicker1.Value.Month, DateTimePicker1.Value.Day, 23, 59, 59) ' Texto de ligação à base de dados Dim myConnectionString As String = _ "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Documents and Settings\Utilizador\" & _ "My Documents\BalancoFamiliar.mdf;" & _ "Integrated Security=True;Connect Timeout=30;User Instance=True" ' Cria uma nova ligação à base de dados Dim connection As New SqlConnection(myConnectionString) Dim SQL As String = "SELECT Id,Data,Deposito [Depósito],Designacao [Designação],Categoria,SubCategoria,Familia FROM Principal Where Data Between @DataInicio And @DataFim" da = New SqlDataAdapter(SQL, connection) da.SelectCommand.Parameters.Add("@DataInicio", SqlDbType.DateTime).Value = DataInicio da.SelectCommand.Parameters.Add("@DataFim", SqlDbType.DateTime).Value = DataFim ' Cria um novo DataSet, ou seja, uma representação em memória da informação ds = New DataSet ' Coloca a informação da tabela definida no DataSet da.Fill(ds, "Principal") ' Define que a fonte de dados da DataGridView é a nossa DataSet ' criando automáticamente as colunas e linhas de dados Me.DataGridView2.DataSource = ds.Tables("Principal") ' Limpa a ligação à base de dados. Não é necessário fechar a ligação ' porque esta não foi aberta através do comando .Open() connection = Nothing
Chamuanza Posted May 9, 2009 at 02:04 PM Author Report #262617 Posted May 9, 2009 at 02:04 PM Penso ter dado com o gato Para já tinha a DataInicio e Datafim no mesmo DateTimePicker1.Value Depois alterei o select ficando assim Dim SQL As String = "SELECT Id, Data, Deposito, Designacao [Designação], Categoria, SubCategoria, Familia FROM Principal Where Data BETWEEN @DataInicio And @DataFim And Deposito > 0" Desde já um obrigado pela atenção dispensada
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now