• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Chamuanza

Select sem Resultados

4 mensagens neste tópico

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

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dava para fazer um livro de erros :) estou a brincar mas tens alguns :confused:

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"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora