D3POD Posted October 22, 2016 at 11:49 AM Report #599833 Posted October 22, 2016 at 11:49 AM 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
DiogoCosta Posted October 22, 2016 at 12:03 PM Report #599835 Posted October 22, 2016 at 12:03 PM 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".
Rui Carlos Posted October 22, 2016 at 01:42 PM Report #599841 Posted October 22, 2016 at 01:42 PM 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)? Rui Carlos Gonçalves
D3POD Posted October 25, 2016 at 02:28 PM Author Report #599889 Posted October 25, 2016 at 02:28 PM 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
apocsantos Posted October 25, 2016 at 03:17 PM Report #599896 Posted October 25, 2016 at 03:17 PM Boa tarde, select max (id) as maximo from Clientes; Cordiais cumprimentos, Apocsantos 1 Report "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"
D3POD Posted October 25, 2016 at 03:40 PM Author Report #599898 Posted October 25, 2016 at 03:40 PM 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
Rui Carlos Posted October 25, 2016 at 07:29 PM Report #599901 Posted October 25, 2016 at 07:29 PM 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. Rui Carlos Gonçalves
D3POD Posted October 26, 2016 at 06:29 PM Author Report #599925 Posted October 26, 2016 at 06:29 PM 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 Rui Carlos Posted October 26, 2016 at 07:44 PM Solution Report #599931 Posted October 26, 2016 at 07:44 PM 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(); } Rui Carlos Gonçalves
D3POD Posted October 26, 2016 at 08:26 PM Author Report #599938 Posted October 26, 2016 at 08:26 PM 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
Rui Carlos Posted October 26, 2016 at 09:08 PM Report #599942 Posted October 26, 2016 at 09:08 PM 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". Rui Carlos Gonçalves
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now