Jump to content

Recommended Posts

Posted

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
Posted

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"

Posted

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 :wallbash:

       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
Posted

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.