Jump to content

Maior valor numa coluna da base de dados


Go to solution Solved by Rui Carlos,

Recommended Posts

Posted

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

Posted

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".

Posted
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)?

Posted
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.

Posted

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.

  • Solution
Posted

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();
            }
Posted

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

Posted

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".

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.