USAR FLEXGRID PARA INCLUIR E EDITAR BANCO DE DADO
Se vc estiver usando algum SGBD, vc poderia usar o INSERT OR UPDATE como é o caso do Firebird:
Description: UPDATE OR INSERT checks if any existing records already contain the new values supplied for the MATCHING columns. If so, those records are updated. If not, a new record is inserted. In the absence of a MATCHING clause, matching is done against the primary key. If a RETURNING clause is present and more than one matching record is found, an error is raised.
Syntax:
Description: UPDATE OR INSERT checks if any existing records already contain the new values supplied for the MATCHING columns. If so, those records are updated. If not, a new record is inserted. In the absence of a MATCHING clause, matching is done against the primary key. If a RETURNING clause is present and more than one matching record is found, an error is raised.
Syntax:
UPDATE OR INSERT INTO
{tablename | viewname} [(<columns>)]
VALUES (<values>)
[MATCHING (<columns>)]
[RETURNING <values> [INTO <variables>]]
<columns> ::= colname [, colname ...]
<values> ::= value [, value ...]
<variables> ::= :varname [, :varname ...]
Para editar estou usando :
Private Sub edita_dados()
TabelaContas
TB_CONTAS.Open [Ô]SELECT * FROM contas [Ô], BD_CAIXA
For L = 1 To Grade.Rows - 1
sql = [Ô]UPDATE contas set con_nome=[ô][Ô] & Grade.TextMatrix(L, 2) & [Ô][ô][Ô] _
& [Ô] where con_codigo =[Ô] & Grade.TextMatrix(L, 1)
BD_CAIXA.Execute (sql)
Next L
FechaTabelaContas
End Sub
Para inlcuir uma nova linha :
Private Sub grava_dados()
TabelaContas
TB_CONTAS.Open [Ô]SELECT * FROM contas ORDER BY CON_CODIGO[Ô], BD_CAIXA
sql = [Ô]INSERT INTO contas(con_nome) VALUES ([Ô]
sql = sql & [Ô][ô][Ô] & Grade.TextMatrix(Grade.Row, 2) & [Ô][ô])[Ô]
BD_CAIXA.Execute (sql)
FechaTabelaContas
End Sub
Só que ele cria um codigo nada a ver tipo:
codigo Nome
1 Carlos
2 Joao
3 Maria
4 Jose
13 Ricardo <- novo registro
Meu campo codigo é autonumeração achei q ele iria criar como 5
4
Private Sub edita_dados()
TabelaContas
TB_CONTAS.Open [Ô]SELECT * FROM contas [Ô], BD_CAIXA
For L = 1 To Grade.Rows - 1
sql = [Ô]UPDATE contas set con_nome=[ô][Ô] & Grade.TextMatrix(L, 2) & [Ô][ô][Ô] _
& [Ô] where con_codigo =[Ô] & Grade.TextMatrix(L, 1)
BD_CAIXA.Execute (sql)
Next L
FechaTabelaContas
End Sub
Para inlcuir uma nova linha :
Private Sub grava_dados()
TabelaContas
TB_CONTAS.Open [Ô]SELECT * FROM contas ORDER BY CON_CODIGO[Ô], BD_CAIXA
sql = [Ô]INSERT INTO contas(con_nome) VALUES ([Ô]
sql = sql & [Ô][ô][Ô] & Grade.TextMatrix(Grade.Row, 2) & [Ô][ô])[Ô]
BD_CAIXA.Execute (sql)
FechaTabelaContas
End Sub
Só que ele cria um codigo nada a ver tipo:
codigo Nome
1 Carlos
2 Joao
3 Maria
4 Jose
13 Ricardo <- novo registro
Meu campo codigo é autonumeração achei q ele iria criar como 5
4
Bom vou explicar primeiro porque a auto numeração não coloca o numero 5 após o 4, bom o o ACCESS trabalha assim com campo autonumeração.
se vc incluir registro na sequencia 1, 2, 3, 4, 5, e depois resolver excluir o registro 5 por exemplo este não será criado novamente ou seja o campo numeração automática vai criar o registro 6, e se vc resolver excluir este registro também, ai o próximo será o 7 ficando assim 1, 2, 3, 4, 7 isto é uma particularidade do campo numeração automática do access.
porém acredito que está faltando um pouco de lógica no seu código.
vou explicar como faço
em um formulário possuo os campos que usarei para salvar os registros no Banco de dados (textbox), ex: txnome, txtendereco, txtidade..etc
neste mesmo formulário possuo 4 command butons que ativo e desativo conforme minha necessidade (são eles NOVO, SALVAR, ALETRAR, EXCLUIR)
e Também possuo um FlexGrid
vamos aos procedimentos, primeiro incluir um registro, como procedo:
No load do form eu Ativo os Botões NOVO e SALVAR, e desativo os Botões ALTERAR e EXCLUIR.
preencho os campos com os dados necessários e clico em salvar, uso a query INSERT normalmente
ex: [Ô]INSERT INTO tabela (Nome,endereco, idade) VALUES ([ô]marcelo[ô], [ô]rua B[ô], 40)[Ô]
nesta inserção não lanço nada no flexgrid na realiade eu crio uma sub PreencheFlex para preencher o grid com os dados ja salvos na tabela
Ex:
este é um exemplo basico da sub , então após o codigo insert, eu chamo a sub PrrencheGrid, que vai atualizar a grid com todos os registros.
após o grid preenchido se eu quiser alterar algum dos registros o que eu faço no enveto click do grid, eu capturo os dados da linha selecionada, e preencho os textbox, ao mesmo tempo eu desativo o Botão SALVAR e ativo ALTERAR e EXCLUIR, o botão NOVO ficará sempre ativo poisele apenas apaga os textbox.
no botão alterar eu tenho a seguinte query
[Ô]UPDATE tabela SET nome = [ô]marcelo[ô], endereco = [ô]rua F[ô],idade = 40 WHERE id = [Ô] & txtID.Text
faço o up date na tabela e chamo
PrrencheGrid
os dados atualizados serã carregados no grid, os Botões ALTERAR e EXCLUIR são desativados e o Botão SALVAR será ativado deixando o programa pronto para um novo registro.
desta maneira, não corro riscos, epero que tenha entendido
se vc incluir registro na sequencia 1, 2, 3, 4, 5, e depois resolver excluir o registro 5 por exemplo este não será criado novamente ou seja o campo numeração automática vai criar o registro 6, e se vc resolver excluir este registro também, ai o próximo será o 7 ficando assim 1, 2, 3, 4, 7 isto é uma particularidade do campo numeração automática do access.
porém acredito que está faltando um pouco de lógica no seu código.
vou explicar como faço
em um formulário possuo os campos que usarei para salvar os registros no Banco de dados (textbox), ex: txnome, txtendereco, txtidade..etc
neste mesmo formulário possuo 4 command butons que ativo e desativo conforme minha necessidade (são eles NOVO, SALVAR, ALETRAR, EXCLUIR)
e Também possuo um FlexGrid
vamos aos procedimentos, primeiro incluir um registro, como procedo:
No load do form eu Ativo os Botões NOVO e SALVAR, e desativo os Botões ALTERAR e EXCLUIR.
preencho os campos com os dados necessários e clico em salvar, uso a query INSERT normalmente
ex: [Ô]INSERT INTO tabela (Nome,endereco, idade) VALUES ([ô]marcelo[ô], [ô]rua B[ô], 40)[Ô]
nesta inserção não lanço nada no flexgrid na realiade eu crio uma sub PreencheFlex para preencher o grid com os dados ja salvos na tabela
Ex:
Sub PreencheGrid()
Wtih MSFlexGrid1
.Rows = 1 [ô] exibe apenas a primeira linha do grid (cabeçalho)
Set Rs = BD_CAIXA.Execute ([Ô]SELECT * FROM tabela[Ô])
Do While Not RS.EOF
.Rows = .Rows + 1 [ô] vai incluindo linha a linha conforme a quantidade de registros
.TextMatrix(.Rows -1, 0) = RS!id
.TextMatrix(.Rows -1, 1) = RS!Nome
.TextMatrix(.Rows -1, 2) = RS!Idade
RS.MoveNext
Loop
End With
End Sub
este é um exemplo basico da sub , então após o codigo insert, eu chamo a sub PrrencheGrid, que vai atualizar a grid com todos os registros.
após o grid preenchido se eu quiser alterar algum dos registros o que eu faço no enveto click do grid, eu capturo os dados da linha selecionada, e preencho os textbox, ao mesmo tempo eu desativo o Botão SALVAR e ativo ALTERAR e EXCLUIR, o botão NOVO ficará sempre ativo poisele apenas apaga os textbox.
no botão alterar eu tenho a seguinte query
[Ô]UPDATE tabela SET nome = [ô]marcelo[ô], endereco = [ô]rua F[ô],idade = 40 WHERE id = [Ô] & txtID.Text
faço o up date na tabela e chamo
PrrencheGrid
os dados atualizados serã carregados no grid, os Botões ALTERAR e EXCLUIR são desativados e o Botão SALVAR será ativado deixando o programa pronto para um novo registro.
desta maneira, não corro riscos, epero que tenha entendido
Ta dando erro neste insert :
Erro de sintaxe
Private Sub grava_dados()
sql = [Ô]INSERT INTO contas(con_codigo,con_nome)[Ô]
sql = sql & [Ô]VALUES([Ô]
sql = sql & [Ô][ô][Ô] & Grade.TextMatrix(Grade.Row, 1) & [Ô][ô],[Ô]
sql = sql & [Ô][ô][Ô] & Grade.TextMatrix(Grade.Row, 2) & [Ô][ô],)[Ô]
BD_CAIXA.Execute (sql)
End Sub
Erro de sintaxe
Private Sub grava_dados()
sql = [Ô]INSERT INTO contas(con_codigo,con_nome)[Ô]
sql = sql & [Ô]VALUES([Ô]
sql = sql & [Ô][ô][Ô] & Grade.TextMatrix(Grade.Row, 1) & [Ô][ô],[Ô]
sql = sql & [Ô][ô][Ô] & Grade.TextMatrix(Grade.Row, 2) & [Ô][ô],)[Ô]
BD_CAIXA.Execute (sql)
End Sub
RICARDO mais uma vez o con_codigo, é automático vc não o insere
Eu mudei ele Treze desculpe não mensionei achei mais facil deixar sem auto numeração.
Achei Treze o erro de sintaxe
Agora esta funcionando o editar e incluir .
Private Sub edita_dados()
TabelaContas
TB_CONTAS.Open [Ô]SELECT * FROM contas [Ô], BD_CAIXA
For L = 1 To Grade.Rows - 1
sql = [Ô]UPDATE contas set con_nome=[ô][Ô] & Grade.TextMatrix(L, 2) & [Ô][ô][Ô] _
& [Ô] where con_codigo =[Ô] & Grade.TextMatrix(L, 1)
BD_CAIXA.Execute (sql)
Next L
FechaTabelaContas
End Sub
Private Sub grava_dados()
sql = [Ô]INSERT INTO contas(con_codigo,con_nome)[Ô]
sql = sql & [Ô]Values ([Ô]
sql = sql & Grade.TextMatrix(Grade.Row, 1) & [Ô],[ô][Ô]
sql = sql & Grade.TextMatrix(Grade.Row, 2) & [Ô][ô])[Ô]
BD_CAIXA.Execute (sql)
End Sub
Agora esta funcionando o editar e incluir .
Private Sub edita_dados()
TabelaContas
TB_CONTAS.Open [Ô]SELECT * FROM contas [Ô], BD_CAIXA
For L = 1 To Grade.Rows - 1
sql = [Ô]UPDATE contas set con_nome=[ô][Ô] & Grade.TextMatrix(L, 2) & [Ô][ô][Ô] _
& [Ô] where con_codigo =[Ô] & Grade.TextMatrix(L, 1)
BD_CAIXA.Execute (sql)
Next L
FechaTabelaContas
End Sub
Private Sub grava_dados()
sql = [Ô]INSERT INTO contas(con_codigo,con_nome)[Ô]
sql = sql & [Ô]Values ([Ô]
sql = sql & Grade.TextMatrix(Grade.Row, 1) & [Ô],[ô][Ô]
sql = sql & Grade.TextMatrix(Grade.Row, 2) & [Ô][ô])[Ô]
BD_CAIXA.Execute (sql)
End Sub
Agora vou fazer uma para executar o delete
Tópico encerrado , respostas não são mais permitidas