none
DataGridView não carrega coluna RRS feed

  • Pergunta

  • Olá pessoal, boa noite!

    Tenho a seguinte instrução SQL:

    SELECT Tbl_Financeiro_Temp.IDMov, Tbl_Financeiro_Temp.DTMov, Tbl_Financeiro_Temp.Nome, Tbl_Financeiro_Temp.Categoria, Tbl_Financeiro_Temp.Titulo, CD AS CDT, DB AS DBT, (SELECT Sum(DD.CD - DD.DB) FROM Tbl_Financeiro_Temp AS DD WHERE DD.IDMov <= Tbl_Financeiro_Temp.IDMov) AS SaldoT, Tbl_Financeiro_Temp.Pagamento, Tbl_Financeiro_Temp.IDFinanceiro
    FROM Tbl_Financeiro_Temp
    ORDER BY Tbl_Financeiro_Temp.IDMov;

    A coluna SaldoT é uma SubQuery, e, já tentei de tudo mas o DataGridView não exibe essa coluna corretamente de jeito nenhum.

    O DataGrid não aceita subQuerys?


    Um Abraço, Nelson

    terça-feira, 25 de outubro de 2016 21:24

Respostas

  • Nelson, realmente não vi nada no seu código que possa ser causador do problema, mas pesquisando vi que o driver de conexão com Access tem alguns problemas com subqueries no SELECT.

    Então no seu caso poderia contornar o problema fazendo dois SQLs separados (o atual sem subquery e um outro que seria apenas a subquery) para então mesclar os resultados via código VB.Net.

    A única coisa que vi de estranho no seu código é que no código da função RetornarDataSet você executa o ExecuteNonQuery do OleDbCommand e depois executa o Fill do OleDbDataAdapter. Assim você está executando uma consulta a mais, desnecessariamente, visto que o próprio DataAdapter realiza a execução do DbCommand.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    • Marcado como Resposta Nelson Sousa quarta-feira, 26 de outubro de 2016 18:14
    quarta-feira, 26 de outubro de 2016 17:31

Todas as Respostas

  • Nelson,

    Como você executa esse SQL e alimenta o grid? Usando Commnad e DataSet?


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    quarta-feira, 26 de outubro de 2016 09:35
  • Olá Juliano,

    Eu carrego um DataSet com essa instrução SQL e o coloco como DataSorce do Grid.

    Veja o código:

            ds = Busca.RetornarDataSet(sSQL)
    
            'preenche a dgCustoFixo
            With dgFluxo_Caixa
    
                .Columns.Clear()
    
                .DataSource = ds.Tables(0)
    
                .Update()
                .Refresh()
            End With
    

    Para efeito de testes, retirei todas as formatações das colunas e deixo o grid simplesmente carregar o dataset.

    A coluna SaldoT, ao invés de assumir o valor carregado pela coluna correspondente na instrução SQL, assume o valor da coluna anterior(DBT) porém, nem isso ela o faz corretamente, não carrega os centavos.


    Um Abraço, Nelson

    quarta-feira, 26 de outubro de 2016 11:39
  • Você já checou se no DataSet o valor da coluna SaldoT está correto? Pergunto isto para descobrir se o erro está antes ou após chegar no DataSet.

    Se o DataSet já estiver com valor errado, possivelmente seu erro está no código que executa o SQL e preenche o DataSet.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    quarta-feira, 26 de outubro de 2016 11:44
  • Sim, chequei sim.

    Uso o Access como banco de dados.

    Peguei a instrução SQL, criei uma consulta no Access com a mesma, e, os dados são exibidos na consulta corretamente.

    Minha conclusão é de que o DataGridView não lida muito bem com subQuerys como a da coluna SaldoT.

    Esse então é o motivo de minha solicitação aqui no fórum, saber se alguém já teve esse tipo de "experiência" com o DataGrid.


    Um Abraço, Nelson

    quarta-feira, 26 de outubro de 2016 12:51
  • Você verificou o valor da coluna no DataSet ou na consulta no Access?

    Se no DataSet o valor está correto, o grid nem sabe que a coluna é originada de uma subQuery.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    quarta-feira, 26 de outubro de 2016 13:04
  • Acabo de fazer as duas verificações.

    Realmente o valor está sendo carregado errado no DataSet. Percorri todas as linhas do DataSet e o valor da coluna está errado.

    No Access, o valor da coluna é exibido corretamente.

    Salvei então a consulta no Access, fiz um vinculo direto com a consulta salva, acrescentei um segundo grid no formulário para efeito de teste, vinculei à consulta salva no Access...e...continuou o erro.

    O erro da Coluna SaldoT, é provocado em algum lugar da "ponte" entre Access e vb.net.


    Um Abraço, Nelson

    quarta-feira, 26 de outubro de 2016 13:13

  • Como está o código do seu método Busca.RetornarDataSet?

    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    quarta-feira, 26 de outubro de 2016 13:38
  • O código do RetornarDataset é:

        Public Function RetornarDataSet(ByVal strQuery As String) As DataSet
    
            Dim cn As New OleDbConnection()
    
            Try
                'Abrir o banco de dados e passar os
                'parametros da consulta SQL, parametros
                'e ordem de execução.
                cn = AbrirBanco()
                Dim cmdCommand As New OleDbCommand
                With cmdCommand
                    .CommandText = strQuery.ToString
                    .CommandType = CommandType.Text
                    .Connection = cn
                    .ExecuteNonQuery()
                End With
                'Declarado um dataadapter e um dataset
                'passar o comando para o dtAdapter e 
                'carregar o dataset com resultado da busca
    
                Dim dtAdapter As New OleDbDataAdapter
                Dim dsDataSet As New DataSet
    
                With dtAdapter
                    .SelectCommand = cmdCommand
                    .Fill(dsDataSet)
                End With
    
                'Retorna o Dataset
    
                Return dsDataSet
            Catch ex As Exception
                Throw ex
            Finally
                FecharBanco(cn)
            End Try
        End Function
    


    Um Abraço, Nelson

    quarta-feira, 26 de outubro de 2016 16:59
  • Nelson, realmente não vi nada no seu código que possa ser causador do problema, mas pesquisando vi que o driver de conexão com Access tem alguns problemas com subqueries no SELECT.

    Então no seu caso poderia contornar o problema fazendo dois SQLs separados (o atual sem subquery e um outro que seria apenas a subquery) para então mesclar os resultados via código VB.Net.

    A única coisa que vi de estranho no seu código é que no código da função RetornarDataSet você executa o ExecuteNonQuery do OleDbCommand e depois executa o Fill do OleDbDataAdapter. Assim você está executando uma consulta a mais, desnecessariamente, visto que o próprio DataAdapter realiza a execução do DbCommand.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    • Marcado como Resposta Nelson Sousa quarta-feira, 26 de outubro de 2016 18:14
    quarta-feira, 26 de outubro de 2016 17:31
  • Blz,

    Corrigi a consulta dupla no RetornarDataSet...obrigado!

    Quanto ao DataGrid, acho que vou mudar o enfoque. Fica tudo muito "bonitinho" quando são poucos dados, mas acho que quando o sistema estiver realmente em uso, e forem mais registros, vai ser meio demorado pra carregar o DataGrid.

    Vou estudar um pouco mais a situação deste formulário.

    Muito grato pela ajuda!


    Um Abraço, Nelson

    quarta-feira, 26 de outubro de 2016 18:14