Usuário com melhor resposta
Ajuda! Carregar dados especificos do BD para botoes/datagrid

Pergunta
-
Ola pessoal! Vb.net
Estou com um banco de dados que contem uma coluna ITEM e outra coluna STATUS.
A coluna ITEM tera numeros inteiros sendo que podera ser repetido o numero em outras linhas.
A coluna STATUS tera somente 2 valores diferentes: podera ser FECHADO ou PENDENTE. Exemplo:Coluna Item Coluna Status
35 PENDENTE
35 PENDENTE
36 FECHADO
37 PENDENTE
37 PENDENTE
37 PENDENTE
37 PENDENTE
38 FECHADO
38 FECHADO
39 FECHADO
40 PENDENTE
41 FECHADO
42 PENDENTE
42 PENDENTE
43 FECHADOTenho um form com 30 botoes (Nao terei mais do que 30 itens com status PENDENTE)
Parte 1 do dilema:Muito bem, com base nessas informacoes, eu gostaria de tudo o que estivesse com o status PENDENTE automaticamente preencheria cada botao com seu respectivo numero. Tomando como exemplo a "tabela" acima ficaria:
Botao 1 com o rotulo: 35
Botao 2 com o rotulo: 37
Botao 3 com o rotulo: 40
Botao 4 com o rotulo: 42
Parte 2 do dilema:E quando eu clicar no botao, todas as linhas do banco de dados correspondentes ao numero do botao serao adicionadas a um datagrid e devera remover esse dado do banco de dados.
- Editado MRD2018 terça-feira, 6 de março de 2018 04:35 Linguagem Vb.net
Respostas
-
Ok, coloquei os neuronios para funcionar e consegui resolver esse dilema com o seguinte codigo:
Dim I As Integer = 0
For I = 0 To dgvCheck.Rows.Count - 1
For Each btn As Control In Me.Controls
If TypeOf (btn) Is Button Then
If btn.Name = "btnCheck" & I + 1 Then
btn.Text = dgvCheck.Rows(I).Cells(0).Value
btn.Visible = True
End If
End If
Next
Next- Marcado como Resposta MRD2018 quarta-feira, 28 de março de 2018 02:53
Todas as Respostas
-
Bom dia Lucio,
Obrigado.
Se trata de um sistema de comandas para restaurantes, nada muito complexo. Mas estou armazenando na tabela os itens da comanda e identificando todos os itens com o numero do recibo que seria a coluna Item. As comandas que foram cobradas sao as que estao sendo armazenadas com o status: FECHADO e as que estao em aberto sao as que estao com status PENDENTE. E que podem ser reabertas e exibidas no datagrid para cobranca ou para adicionar mais itens e novamente armazenar na tabela. Tenho um botao Reabri comanda que chama o form onde estao os botoes, que devera exibir o numero de cada recibo em aberto (PENDENTE), e clicando no botao os itens daquele recibo sao enviados ao datagrid.
Obrigado pela ajuda e se precisar de mais informacoes eu posto aqui.
Marcio Duo
-
Ola Lucio, desculpe a demora.
Como eu comentei acima, esta funcionando bem para os recibos que sao abertos e pagos logo e seguida, porem como eu comentei acima, gostaria de armazenar os recibos em abertos (Os que nao foram pagos ainda), como se a mesa do restaurante ainda estivesse com as pessoas ordenando bebidas ou outros itens e esses recibos podem ser reabertos posteriormente tanto para agregar mais itens como tambem para serem finalizados e pagos.
Segue abaixo o codigo que estou usando para inserir os dados nas tabelas por SQLite:
Public Sub AdicionarTransacao()
Dim Transacao As SQLiteTransaction
Try
Dim cn As SQLiteConnection = GetConnectionSQLite()
cn.Open()
Transacao = cn.BeginTransaction
Dim sql As String = "insert into tblRecibos (DataRecibo, TotalRecibo) Values (@DataRecibo, @TotalRecibo)"
Dim cmd As New SQLiteCommand
cmd.Connection = cn
cmd.Transaction = Transacao
cmd.CommandText = sql
cmd.Parameters.AddWithValue("@DataRecibo", Now.Date)
cmd.Parameters.AddWithValue("@TotalRecibol", txtTotal.Text)
cmd.ExecuteNonQuery()
cmd.Dispose()
sql = "select max(ReciboID) as MAXID from tblRecibos"
Dim cmd2 As New SQLiteCommand
cmd2.Connection = cn
cmd2.Transaction = MyTransaction
cmd2.CommandText = sql
Dim ReciboID As Long = cmd2.ExecuteScalar()
cmd2.Dispose()
Dim I As Integer
For I = 0 To dgvCheck.Rows.Count - 1
Dim Descricao As String = dgvCheck.Rows(I).Cells(0).Value
Dim QTY As Integer = dgvCheck.Rows(I).Cells(1).Value
Dim Preco As Decimal = dgvCheck.Rows(I).Cells(2).Value
Dim Taxa As Decimal = dgvCheck.Rows(I).Cells(3).Value
Dim Total As Decimal = dgvCheck.Rows(I).Cells(4).Value
Dim Departamento As String = dgvCheck.Rows(I).Cells(5).Value
Dim cmd3 As New SQLiteCommand
sql = "insert into tblReciboDetalhe (ReciboID, Descricao, Departamento, QTY, Preco, Taxa, DataRecibo) Values (@ReciboID, @Descricao, @Departamento, @QTY, @Preco, @Taxa, @DataRecibo)"
cmd3.Connection = cn
cmd3.Transaction = Transacao
cmd3.CommandText = sql
cmd3.Parameters.AddWithValue("@ReciboID", ReciboID)
cmd3.Parameters.AddWithValue("@Descricao", Descricao)
cmd3.Parameters.AddWithValue("@Departamento", Departamento)
cmd3.Parameters.AddWithValue("@QTY", QTY)
cmd3.Parameters.AddWithValue("@Preco", Preco)
cmd3.Parameters.AddWithValue("@Taxa", Taxa)
cmd3.Parameters.AddWithValue("@DataRecibo", Now.Date)
cmd3.ExecuteNonQuery()
cmd3.Dispose()
'End If
Next
Transacao.Commit()
Transacao.Dispose()
cn.Close()
cn.Dispose()
Catch ex As Exception
If Transacao IsNot Nothing Then
Transacao.Rollback()
End If
MsgBox(ex.Message, MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, "Test")
End Try
End Sub
Obrigado pela ajuda!
-
Ola Lucio, desculpe a demora.
Como eu comentei acima, esta funcionando bem para os recibos que sao abertos e pagos logo e seguida, porem como eu comentei acima, gostaria de armazenar os recibos em abertos (Os que nao foram pagos ainda), como se a mesa do restaurante ainda estivesse com as pessoas ordenando bebidas ou outros itens e esses recibos podem ser reabertos posteriormente tanto para agregar mais itens como tambem para serem finalizados e pagos.
Segue abaixo o codigo que estou usando para inserir os dados nas tabelas por SQLite:
Public Sub AdicionarTransacao()
Dim Transacao As SQLiteTransaction
Try
Dim cn As SQLiteConnection = GetConnectionSQLite()
cn.Open()
Transacao = cn.BeginTransaction
Dim sql As String = "insert into tblRecibos (DataRecibo, TotalRecibo) Values (@DataRecibo, @TotalRecibo)"
Dim cmd As New SQLiteCommand
cmd.Connection = cn
cmd.Transaction = Transacao
cmd.CommandText = sql
cmd.Parameters.AddWithValue("@DataRecibo", Now.Date)
cmd.Parameters.AddWithValue("@TotalRecibol", txtTotal.Text)
cmd.ExecuteNonQuery()
cmd.Dispose()
sql = "select max(ReciboID) as MAXID from tblRecibos"
Dim cmd2 As New SQLiteCommand
cmd2.Connection = cn
cmd2.Transaction = MyTransaction
cmd2.CommandText = sql
Dim ReciboID As Long = cmd2.ExecuteScalar()
cmd2.Dispose()
Dim I As Integer
For I = 0 To dgvCheck.Rows.Count - 1
Dim Descricao As String = dgvCheck.Rows(I).Cells(0).Value
Dim QTY As Integer = dgvCheck.Rows(I).Cells(1).Value
Dim Preco As Decimal = dgvCheck.Rows(I).Cells(2).Value
Dim Taxa As Decimal = dgvCheck.Rows(I).Cells(3).Value
Dim Total As Decimal = dgvCheck.Rows(I).Cells(4).Value
Dim Departamento As String = dgvCheck.Rows(I).Cells(5).Value
Dim cmd3 As New SQLiteCommandsql = "insert into tblReciboDetalhe (ReciboID, Descricao, Departamento, QTY, Preco, Taxa, DataRecibo) Values (@ReciboID, @Descricao, @Departamento, @QTY, @Preco, @Taxa, @DataRecibo)"
cmd3.Connection = cn
cmd3.Transaction = Transacao
cmd3.CommandText = sql
cmd3.Parameters.AddWithValue("@ReciboID", ReciboID)
cmd3.Parameters.AddWithValue("@Descricao", Descricao)
cmd3.Parameters.AddWithValue("@Departamento", Departamento)
cmd3.Parameters.AddWithValue("@QTY", QTY)
cmd3.Parameters.AddWithValue("@Preco", Preco)
cmd3.Parameters.AddWithValue("@Taxa", Taxa)
cmd3.Parameters.AddWithValue("@DataRecibo", Now.Date)
cmd3.ExecuteNonQuery()
cmd3.Dispose()
'End If
Next
Transacao.Commit()
Transacao.Dispose()
cn.Close()
cn.Dispose()
Catch ex As Exception
If Transacao IsNot Nothing Then
Transacao.Rollback()
End If
MsgBox(ex.Message, MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, "Test")
End Try
End SubObrigado pela ajuda!
-
-
Um outro detalhe eh que mesmo colocando em ordem a modelagem, eu ainda terei o mesmo problema em reabrir todos os itens cadastrados no recibo com status em aberto e apresenta-los no datagrid. E tambem o segundo problem que eu gostaria de em um form separado ter 30 botoes onde seriam preenchidos automaticamente com o numero dos recibos de status em aberto e clicando nos botoes aconteceria o carregamento dos itens para o datagrid.
-
Lucio, boa noite!
Acertei a modelagem de dados e realmente funcionou! Obrigado.
Agora me falta somente popular os botoes com os registros que tenham o status como PENDENTE.
Tenho 30 botoes e poderei ter ate 30 recibos em aberto, preciso somente ter o numero do recibo nos botoes.
Exemplo:
- Tenho apenas 3 recibos com status PENDENTE (Recibo numero 11, Recibo numero 21 e Recibo numero 52)
- O text dos 3 primeiros botoes seria os respectivos numeros de cada recibo.
Os demais (27 botoes) teriam o text em branco ou simplismente visible=false.
Poderia me ajudar com essa parte do codigo?
Penso em um For com a seguinte estrutura:
For Each btn As Control In Me.Controls
If TypeOf (btn) Is Button Then
E dai pra frente nao sei mais o que fazer rsrsrs
Nao creio que estou pensando na estrutura correta.
-
Ok, coloquei os neuronios para funcionar e consegui resolver esse dilema com o seguinte codigo:
Dim I As Integer = 0
For I = 0 To dgvCheck.Rows.Count - 1
For Each btn As Control In Me.Controls
If TypeOf (btn) Is Button Then
If btn.Name = "btnCheck" & I + 1 Then
btn.Text = dgvCheck.Rows(I).Cells(0).Value
btn.Visible = True
End If
End If
Next
Next- Marcado como Resposta MRD2018 quarta-feira, 28 de março de 2018 02:53