Jump to content
D3POD

[Resolvido] Maior valor numa coluna da base de dados

Recommended Posts

D3POD

Boas, preciso de uma ajuda... como posso obter o maior valor de uma coluna numa base de dados?

Já vi algures utilizarem max(coluna) mas não consigo colocar a funcionar...

A forma que sei é passando os dados para um datagridview e depois então ir buscar o valor, mas isso iria obrigar-me a ter mais um tool sem necessidade.

 

Cumprimentos

Share this post


Link to post
Share on other sites
DiogoCosta

Bom dia, se estiveres a usar uma DataGridView podes usar o seguinte código:

int rowindex = ver.CurrentCell.RowIndex;
int columnindex = ver.CurrentCell.ColumnIndex;
string NOME_DA_COLUNA = nome_datagridview.Rows[ver.CurrentRow.Index].Cells[10].Value.ToString();

O "10" neste caso é a 11 coluna.

Para a primeira coluna seria o "0".

 

Share this post


Link to post
Share on other sites
Rui Carlos
1 hora atrás, D3POD disse:

Boas, preciso de uma ajuda... como posso obter o maior valor de uma coluna numa base de dados?

Já vi algures utilizarem max(coluna) mas não consigo colocar a funcionar...

A forma que sei é passando os dados para um datagridview e depois então ir buscar o valor, mas isso iria obrigar-me a ter mais um tool sem necessidade.

Que código usaste com o MAX(coluna)?

Share this post


Link to post
Share on other sites
D3POD

Usei um SELECT Max(id) from Clientes;

 

Mas não funciona... eu sei que em tempos vi algo do género dai ter tentado desta forma.

 

 

Cumprimentos

Share this post


Link to post
Share on other sites
apocsantos

Boa tarde,

select max (id) as maximo from Clientes;

Cordiais cumprimentos,

Apocsantos

  • Vote 1

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
D3POD

Boas, acabei por resolver de outra forma, pois com o max() dava sempre erro.

Solução: SELECT TOP 1 DocNo FROM Sales ORDER BY DocNo DESC

 

Cumprimentos

Share this post


Link to post
Share on other sites
Rui Carlos
2 horas atrás, D3POD disse:

Boas, acabei por resolver de outra forma, pois com o max() dava sempre erro.

Solução: SELECT TOP 1 DocNo FROM Sales ORDER BY DocNo DESC

 

Cumprimentos

Isso pode funcionar, mas a query com o MAX era a forma mais apropriada de calcular o resultado.  Se dá erro, era útil saber qual o erro que dá, e até o código que usas para executar e obter o resultado da query.  Possivelmente o que te falta é o detalhe que o @apocsantos mencionou, que pode causar problemas se estiveres a aceder à coluna por identificador.

 

Share this post


Link to post
Share on other sites
D3POD

Sendo assim vamos lá explorar a opção com o max()...

Erro: Additional information: Syntax error (missing operator) in query expression '(max)DocNo'.

Código:

OleDbConnection con = new OleDbConnection(cs);
            string query = "SELECT (max)DocNo, Doc FROM Sales WHERE doc = @doc";
            OleDbCommand cmd = new OleDbCommand(query, con);
            con.Open();
            cmd.Parameters.AddWithValue("@doc", cb_doctype.Text);
            rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {

                txt_ndoc.Text = rdr[0].ToString();
                cb_doctype.Text = rdr[1].ToString();
            }
            con.Close();

 

Já tentei várias formas e dá sempre o mesmo erro.

Share this post


Link to post
Share on other sites
Rui Carlos

Essa query precisa de dois ajustes.  Em primeiro lugar, a sintaxe correcta será max(DocNo) (em vez de (max)DocNo).  Em segundo lugar, não faz sentido ir buscar o valor de Doc quando tens a condição doc = @doc (na tua query com o TOP 1 também não estavas a ir buscar este campo).

Algo deste género deverá fazer o que pretendes.

            string query = "SELECT MAX(DocNo) FROM Sales WHERE doc = @doc";
            OleDbCommand cmd = new OleDbCommand(query, con);
            con.Open();
            cmd.Parameters.AddWithValue("@doc", cb_doctype.Text);
            rdr = cmd.ExecuteReader();

            // Uma query com uma função de aggregate deve devolver exactamente um resultado, pelo que não faz sentido ter um while a iterar o resultado
            // while (rdr.Read())
            // Coloquei um if em alternativa, mas um simples rdr.Read() devia ser suficiente
            if (rdr.Read())
            {
                txt_ndoc.Text = rdr[0].ToString();
                // A linha seguinte sai, pois o cb_doctype.Text não muda de valor
                // cb_doctype.Text = rdr[1].ToString();
            }

 

Share this post


Link to post
Share on other sites
D3POD

Ok, já experimentei e agora sim funcionou  Obrigado...

 

Na query que coloquei estava referenciado o doc porque estou também a utilizar esse valor, mas só adicionei depois de ter o TOP1 a funcionar bem.

 

Para finalizar, como posso colocar alem do max(id) colocar o doc?

 

Cumprimentos

Share this post


Link to post
Share on other sites
Rui Carlos

Ir buscar o Doc só faz sentido se a condição WHERE doc = @doc não existir.  Se existir, a coluna Doc não te trás qualquer informação nova.

Assumindo que era esse o caso, e que precisavas então das duas colunas, já seria necessário uma query mais complexa.  A solução do TOP 1 era aceitável, mas poderia não ser a mais eficiente (pelo menos se o SGBD não conseguir perceber que não é necessário ordenar os resultados, e se a tabela for grande).  Uma alternativa seria SELECT DocNo, Doc FROM Sales WHERE DocNo = (SELECT MAX(DocNo) FROM Sales).  Convinha que o DocNo fosse chave primária ou tivesse um índice.

É possível que haja soluções melhores.  Mas este problema já é mais complexo do que "obter o maior valor de uma coluna numa base de dados".

Share this post


Link to post
Share on other sites

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.