UPDATE DE TABELA

AZORSCA 24/09/2012 15:45:46
#410367
Boa tarde.

Amigos mais uma vez eu aqui com uma dúvida e gostaria de saber se alguém poderia ajudar.

é o seguinte eu tenho um formulário em que são lançadas notas de compras e seus equipamentos.

As notas lançadas são armazenadas na Tabela 105 com o status de [Ô]A[Ô] indicando que a nota está Aberta.
Os lançamentos permanecem abertos até que ela é baixada, porém, enquanto aberta é possível que o usuário altere os dados desta nota, conforme regra de negócio da empresa.

Aí nesta parte que esta minha dúvida, como eu faria o Update destes dados, sendo que o usuário pode incluir mais itens.

Fazer o update dos itens já gravado eu sei porém para realizar o Update dos novos itens é que eu não sei.

Alguém poderia me ajudar?
OMAR2011 24/09/2012 16:21:22
#410370
Quando for incluir um novo ITEM na nota,não é UPDATE e INSERT.
A sua tabela que é a 105 tem que ter um campo com Número da nota.
é ai onde vai inserir um novo registro com o número da mesma nota e
Status = A.Depois quando for fechar a nota com Status = F é onde ocorre
o Update.
AZORSCA 24/09/2012 16:40:53
#410372
Eu sei o que é um insert! kkkkkk

Aff deixa me explicar melhor.

Tenho uma grade com diversos produtos saca? consegue entender?

Pois bem, eu posso alterar um produto que já esta gravado e aparecendo na grade assim como incluir um novo produto na grade.

Ou seja alterei os que já estavam lá armazenados e inclui mais um. Entende?

Quando clicar em salvar alterações eu quero salvar (update) nos que já tinha e armazenar mais o novo que acabei de incluir. CONSEGUE ENTENDER?????



Esta é a minha dúvida e não o que é um Insert ou um Update.

Obg
OMAR2011 24/09/2012 16:52:26
#410374
O que usa para encher e alterar.Flexgrid ou .....
AZORSCA 24/09/2012 17:10:51
#410376
Omar vou ser bem detalhista

Para salvar eu utilizo isto aqui. Atenção SALVAR

Set oConCadC = New ADODB.Connection
oConCadC.ConnectionString = Init.vStrConSQLServer
oConCadC.Open

Set oRecCadC = New ADODB.Recordset
vStrSql = [Ô]Select * From ger106[Ô]
oRecCadC.Open vStrSql, oConCadC, adOpenDynamic, adLockOptimistic

With grdEquipamentos
For i = 1 To .Rows - 1
oConCadC.Execute ([Ô] Insert Into ger106 (codprod, qtdeprod, valorvenda, valorunit, valortotal, bcicms, valicms, controlecompra, removido) Values ([ô][Ô] & grdEquipamentos.TextMatrix(i, 0) & [Ô][ô], [ô][Ô] & grdEquipamentos.TextMatrix(i, 6) & [Ô][ô], [ô][Ô] & Replace(Replace(grdEquipamentos.TextMatrix(i, 3), [Ô],[Ô], [Ô].[Ô]), [Ô]R$[Ô], [Ô][Ô]) & [Ô][ô], [ô][Ô] & Replace(Replace(grdEquipamentos.TextMatrix(i, 2), [Ô],[Ô], [Ô].[Ô]), [Ô]R$[Ô], [Ô][Ô]) & [Ô][ô], [ô][Ô] & Replace(Replace(grdEquipamentos.TextMatrix(i, 7), [Ô],[Ô], [Ô].[Ô]), [Ô]R$[Ô], [Ô][Ô]) & [Ô][ô], [ô][Ô] & Replace(Replace(grdEquipamentos.TextMatrix(i, 4), [Ô],[Ô], [Ô].[Ô]), [Ô]R$[Ô], [Ô][Ô]) & [Ô][ô], [ô][Ô] & Replace(Replace(grdEquipamentos.TextMatrix(i, 5), [Ô],[Ô], [Ô].[Ô]), [Ô]R$[Ô], [Ô][Ô]) & [Ô][ô], [ô][Ô] & txtNumControle.Text & [Ô][ô], [ô]0[ô])[Ô])
Next i
End With
[ô] Fecha a conexão com SQL Server e esvazia a Recordset
Call fechaObjetoConnection(oConCadC)
Call fechaObjetoRecordset(oRecCadC)



Certo, isto acima é um Insert ou seja para salvar e não é utilizando na rotina do Update. Esta funcionando corretamente, não sendo necessário ajustes.

Uso para Inserir dos campos para o Grid (MSHFlexGrid)

For i = 1 To .Rows - 1
If .TextMatrix(i, 0) = txtCodEquipamento.Text Then
Aviso = MsgBox(cboEquipamentos.Text & [Ô] Já existe na lista! Deseja adicionar assim mesmo?[Ô], vbQuestion + vbYesNo, [Ô]Aviso[Ô])
If Aviso = vbNo Then
Limpa_Campos_Equip
Exit Sub
End If
End If
Next i
.Rows = .Rows + 1
.TextMatrix(.Rows - 1, 0) = txtCodEquipamento.Text
.TextMatrix(.Rows - 1, 1) = cboEquipamentos.Text
.TextMatrix(.Rows - 1, 2) = txtValUn.Text
.TextMatrix(.Rows - 1, 3) = txtEValUn.Text
.TextMatrix(.Rows - 1, 4) = txtEBCICMS.Text
.TextMatrix(.Rows - 1, 5) = txtEValICMS.Text
.TextMatrix(.Rows - 1, 6) = txtQtde.Text
.TextMatrix(.Rows - 1, 7) = txtEValTotal.Text
End With

Acima esta o que joga os dados dos campos para o grid.


Não sei o que isto irá ajudar você, porém, está aí.
ROBSON220BASS 24/09/2012 17:37:18
#410384
ja tentou algo do tipo:
update tabela set coluna1=?, coluna2=? where coluna1=?

exemplo:

Set oConCadC = New ADODB.Connection
oConCadC.ConnectionString = Init.vStrConSQLServer
oConCadC.Open

Set oRecCadC = New ADODB.Recordset
vStrSql = [Ô]Select * From ger106[Ô]
oRecCadC.Open vStrSql, oConCadC, adOpenDynamic, adLockOptimistic

With grdEquipamentos
For i = 1 To .Rows - 1
oConCadC.Execute ([Ô]update ger106 set codprod=[ô][Ô] & grdEquipamentos.TextMatrix(i, 0) & [Ô][ô],qtdeprod=[ô][Ô] & grdEquipamentos.TextMatrix(i, 6) & [Ô][ô], valorvenda=[ô][Ô] & Replace(Replace(grdEquipamentos.TextMatrix(i, 3), [Ô],[Ô], [Ô].[Ô]), [Ô]R$[Ô], [Ô][Ô]) & [Ô][ô],valorunit=[ô][Ô] & Replace(Replace(grdEquipamentos.TextMatrix(i, 2), [Ô],[Ô], [Ô].[Ô]), [Ô]R$[Ô], [Ô][Ô]) & [Ô][ô], valortotal=[ô][Ô] & Replace(Replace(grdEquipamentos.TextMatrix(i, 7), [Ô],[Ô], [Ô].[Ô]), [Ô]R$[Ô], [Ô][Ô]) & [Ô][ô], bcicms=[ô][Ô] & Replace(Replace(grdEquipamentos.TextMatrix(i, 4), [Ô],[Ô], [Ô].[Ô]), [Ô]R$[Ô], [Ô][Ô]) & [Ô][ô], valicms=[ô][Ô] & Replace(Replace(grdEquipamentos.TextMatrix(i, 5), [Ô],[Ô], [Ô].[Ô]), [Ô]R$[Ô], [Ô][Ô]) & [Ô][ô], controlecompra=[ô][Ô] & txtNumControle.Text & [Ô][ô], removido=[ô]0[ô] where controlecompra=txtCodEquipamento.Text [Ô])[Ô])
Next i
End With
[ô] Fecha a conexão com SQL Server e esvazia a Recordset
Call fechaObjetoConnection(oConCadC)
Call fechaObjetoRecordset(oRecCadC)
OMAR2011 24/09/2012 22:38:08
#410402
Ai onde mora o problema.Se você encher o Flexgrid com os registros da tabela da referida compra
e incluiu mais um ou dois itens neste flexgrid como vai dar um Update e Insert ao mesmo tempo.Vai
ser um verdadeiro malabarismo.Pra que esse Update se não modificou nada.
O que deve fazer é incluir outros itens na tabela com o mesmo número de CONTROLECOMPRA com as caixas de texto
ou então preencher o flexgrid e somente gravar.
Você vai criar um campo para identificar a compra,acho que seja o ControleCompra.Para alterar dados da tabela
preenche o Grid com uma consulta da compra e edita o Grid,isto é modificar no prório Flexgrid.Este código permite
a Editar o Flex.Basta da um click e modificar.
veja.

Private Sub grdEquipamentos_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyReturn, vbKeyTab
[ô]move para a proxima celula.

With grdEquipamentos

If .Col + 1 <= .Cols - 1 Then
.Col = .Col + 1
Else
If .Row + 1 <= .Rows - 1 Then
.Row = .Row + 1
.Col = 0
Else
.Row = 1
.Col = 0
End If
End If
End With

Case vbKeyBack

With grdEquipamentos
[ô]remove o ultimo caractere
If Len(.Text) Then
.Text = Left(.Text, Len(.Text) - 1)
End If
End With

Case Is < 32

Case Else
With grdEquipamentos
.Text = .Text & Chr(KeyAscii)
End With
End Select
End Sub

Isto é do Macoratti.

Depois disso ai pode dar Update com o Flexgrid com todos os itens modificados

With grdEquipamentos
For i = 1 To .Rows - 1
oConCadC.Execute ([Ô]update ger106 set codprod=[ô][Ô] & grdEquipamentos.TextMatrix(i, 0) & [Ô][ô],qtdeprod=[ô][Ô] & grdEquipamentos.TextMatrix(i, 6) & [Ô][ô], valorvenda=[ô][Ô] & Replace(Replace(grdEquipamentos.TextMatrix(i, 3), [Ô],[Ô], [Ô].[Ô]), [Ô]R$[Ô], [Ô][Ô]) & [Ô][ô],valorunit=[ô][Ô] & Replace(Replace(grdEquipamentos.TextMatrix(i, 2), [Ô],[Ô], [Ô].[Ô]), [Ô]R$[Ô], [Ô][Ô]) & [Ô][ô], valortotal=[ô][Ô] & Replace(Replace(grdEquipamentos.TextMatrix(i, 7), [Ô],[Ô], [Ô].[Ô]), [Ô]R$[Ô], [Ô][Ô]) & [Ô][ô], bcicms=[ô][Ô] & Replace(Replace(grdEquipamentos.TextMatrix(i, 4), [Ô],[Ô], [Ô].[Ô]), [Ô]R$[Ô], [Ô][Ô]) & [Ô][ô], valicms=[ô][Ô] & Replace(Replace(grdEquipamentos.TextMatrix(i, 5), [Ô],[Ô], [Ô].[Ô]), [Ô]R$[Ô], [Ô][Ô]) & [Ô][ô], where controlecompra=txtCodEquipamento.Text [Ô])[Ô])
Next i
End With

Eu fiz um projeto semelhante a este que está querendo.Tinha um formulário onde registrava a compra.Ao abrir outro formulario listava minhas compras como Data,Valor,Número da Nota.
Basta clicar na nota abre outro formulário com todos os itens da compra com a imagem da Nota Fiscal.Ficou Legal.Atendeu minhas necessidades.
Valeu.
ALVAROVB2009 25/09/2012 11:08:16
#410440
Resposta escolhida
Cara uma coisa simples que você pode fazer é o seguinte, criar no grid uma coluna oculta com o Status I-Incluído A-Alterado S-Sem Alteração para cada item
Ao preencher o grid vc coloca todos os item como S e quando tiver alguma inclusão ou alteração basta atualizar esse campo também e depois na gravação é só verificar esse campo e aplicar o insert ou update
AZORSCA 25/09/2012 14:12:24
#410454
Verdade heim.

Boas dicas ajudou a esclarecer.
Só que vendo aqui testei de uma forma e funcionou legal até, só nao sei se é a mais correta.

Estou fazendo o seguinte eu apago todos os itens da tabela de determinada nota e depois faço um outro insert.

Desta maneira vai as alterações e as novas inclusões.


O que vocês acham desta maneira?
MARCELO.TREZE 25/09/2012 14:29:28
#410457
bom vai a minha dica eu sempre faço assim:

coloco 04 botões, novo, salvar, alterar e excluir



repare que apenas o botão (novo - que sempre fica ativo) e (salvar estão ativo)

então digito nos campos o novo item,



e clico em salvar os mesmo botões ficam ativos.

depois seleciono um dos itens, e os dados são exibidos nos campos, repare que agora alterar e excluir ficaram ativos e o salvar inativo



a maneira acima é a que sempre uso e não tenho problemas, a cada operação faço um update ou insert ou delete, sem ter problemas, e sempre atualizo o grid coma as alterações efetuadas

FEDERHEN 25/09/2012 14:40:19
#410459
Por que voce não deleta todos os registros da tabela e faz um novo insert de todos os registros que estão no Flexgrid ???

Alem de incluir registros novos e alterar ou não registros, provavelmente voce vai tambem excluir registros...
e com o delete/insert voce vai resolver todos estes problemas.
Página 1 de 2 [17 registro(s)]
Tópico encerrado , respostas não são mais permitidas