REGISTRO DUPLO
E ai pessoal, beleza? To precisando de uma ajudinha. Eu to criando uma aplicação aqui (Delphi XE6 + Firebird 2.5 + IBExpert), mas estou tendo um problema. Na parte de cadastro de usuários, eu tenho os botões NOVO, EDITAR, GRAVAR, APAGAR e CANCELAR. Todos foram programados por código (sem TDBNavigator, ou ActionManager). Porém, o botão NOVO está com um problema. Quando clico nele, ele limpa os campos pra eu poder inserir novos dados, depois clico no botão GRAVAR pra poder salvar. Até aqui beleza. Mas, se logo em seguida eu clicar no botão novo outra vez, ele insere o registro novo e mais um em branco.
A imagem abaixo mostra o que quero dizer.
[img]http://arquivo.devmedia.com.br/forum/imagem/391816-20141208-094841.png[/img]
Gostaria de saber se alguém pode me ajudar com isso. Se for necessário mais detalhes, comentem !
Abraços, e obrigado pela atenção !
A imagem abaixo mostra o que quero dizer.
[img]http://arquivo.devmedia.com.br/forum/imagem/391816-20141208-094841.png[/img]
Gostaria de saber se alguém pode me ajudar com isso. Se for necessário mais detalhes, comentem !
Abraços, e obrigado pela atenção !
Heitor Batista
Curtidas 0
Respostas
Hugo
08/12/2014
Amigo, vc pode postar o código referente aos botões "novo" e "gravar" ?
GOSTEI 0
Heitor Batista
08/12/2014
Claro !
Botão "NOVO":
Botão "GRAVAR":
Botão "NOVO":
procedure TF_usuarios.btn_novoClick(Sender: TObject); begin LimpaTela; DBEdit1.SetFocus; dm.TB_usuarios.Append; btn_gravar.Enabled := True; btn_editar.Enabled := False; btn_novo.Enabled := False; end;
Botão "GRAVAR":
procedure TF_usuarios.btn_gravarClick(Sender: TObject);
begin
if (dm.TB_usuarios.State = dsInsert) then
begin
dm.fb_usuarios.Close;
dm.fb_usuarios.SQL.Clear;
dm.fb_usuarios.SQL.Add('INSERT INTO USUARIOS (' +
'USER_NOME, ' +
'USER_NOME_COMPLETO, ' +
'USER_SENHA) VALUES (' +
':NOME, ' +
':NOME_COMPLETO, ' +
':SENHA)');
dm.fb_usuarios.ParamByName('NOME').Value := DBEdit1.Text;
dm.fb_usuarios.ParamByName('NOME_COMPLETO').Value := DBEdit2.Text;
dm.fb_usuarios.ParamByName('SENHA').Value := DBEdit3.Text;
dm.fb_usuarios.ExecSQL;
end
else
begin
dm.fb_usuarios.Close;
dm.fb_usuarios.SQL.Clear;
dm.fb_usuarios.SQL.Add('UPDATE USUARIOS SET ' +
'USER_NOME = :NOME, ' +
'USER_NOME_COMPLETO = :NOME_COMPLETO, ' +
'USER_SENHA = :SENHA ' +
'WHERE USER_ID = :ID');
dm.fb_usuarios.ParamByName('NOME').Value := DBEdit1.Text;
dm.fb_usuarios.ParamByName('NOME_COMPLETO').Value := DBEdit2.Text;
dm.fb_usuarios.ParamByName('SENHA').Value := DBEdit3.Text;
dm.fb_usuarios.ParamByName('ID').Value := DBEdit4.Text;
dm.fb_usuarios.ExecSQL;
end;
btn_editar.Enabled := True;
btn_novo.Enabled := True;
btn_gravar.Enabled := False;
end;GOSTEI 0
Heitor Batista
08/12/2014
--> "dm", é o Data Module
--> "fb_usuarios", é a Query
--> "TB_usuarios", é a Table
--> "fb_usuarios", é a Query
--> "TB_usuarios", é a Table
GOSTEI 0
Hugo
08/12/2014
Bom vou tentar te explicar o que está acontecendo... e te ajudar a resolver seu problema...
No seu botão "Novo", vc está usando um "dm.TB_usuarios.Append", porém no seu botão "Gravar" vc está fazendo o "insert" ou "update" na query...
Assim quando vc clica no botão "Novo" pela segunda vez, a sua "Table" ainda está em modo de inserção e ao dar o segundo "append", sua table automaticamente irá dar um "post", gerando assim o registro em branco...
Não sei se consegui explicar direito...
Para resolver, vc pode fazer de duas formas...
No seu botão "Novo", onde vc está usando o "Append", vc pode criar uma variável do tipo "TDataSetState" e atribuir o valor "dsInsert" e no seu botão "Gravar" testar o valor da variável...
Porém uma solução melhor (absurdamente melhor, na minha opinião rsrsrs), seria usar diretamente a "Table" para as operações...
Seus dbEdits provavelmente estão ligados à um "datasource" que provavelmente está ligado à sua "table"... se este for o cenário vc simplesmente daria um "post" na "table", no seu botão "Gravar", assim...
Acho que é mais ou menos por ai...
qualquer coisa manda ai...
No seu botão "Novo", vc está usando um "dm.TB_usuarios.Append", porém no seu botão "Gravar" vc está fazendo o "insert" ou "update" na query...
Assim quando vc clica no botão "Novo" pela segunda vez, a sua "Table" ainda está em modo de inserção e ao dar o segundo "append", sua table automaticamente irá dar um "post", gerando assim o registro em branco...
Não sei se consegui explicar direito...
Para resolver, vc pode fazer de duas formas...
No seu botão "Novo", onde vc está usando o "Append", vc pode criar uma variável do tipo "TDataSetState" e atribuir o valor "dsInsert" e no seu botão "Gravar" testar o valor da variável...
Porém uma solução melhor (absurdamente melhor, na minha opinião rsrsrs), seria usar diretamente a "Table" para as operações...
Seus dbEdits provavelmente estão ligados à um "datasource" que provavelmente está ligado à sua "table"... se este for o cenário vc simplesmente daria um "post" na "table", no seu botão "Gravar", assim...
dm.TB_usuarios.Post;
Acho que é mais ou menos por ai...
qualquer coisa manda ai...
GOSTEI 0
Heitor Batista
08/12/2014
Hugo, eu fiz desse jeito que você disse, usando o dm.TB_usuarios.Post .... porém, agora está dando outro erro. Eu substitui toda aquela parte da SQL de INSERT, por "dm.TB_usuarios.Post;"
[img]http://arquivo.devmedia.com.br/forum/imagem/391816-20141208-134151.png[/img]
Mas você quis dizer que no botão "Gravar", e só colocar " dm.TB_usuarios.Post; " apenas?
[img]http://arquivo.devmedia.com.br/forum/imagem/391816-20141208-134151.png[/img]
Mas você quis dizer que no botão "Gravar", e só colocar " dm.TB_usuarios.Post; " apenas?
GOSTEI 0
Hugo
08/12/2014
Isso... No botão "Novo" mantenha da forma como estava...
E no botão "Gravar" substitua todo seu código pelo que te passei...
no botão "Novo"
e no botão "Gravar"
E no botão "Gravar" substitua todo seu código pelo que te passei...
no botão "Novo"
procedure TF_usuarios.btn_novoClick(Sender: TObject); begin LimpaTela; DBEdit1.SetFocus; dm.TB_usuarios.Append; btn_gravar.Enabled := True; btn_editar.Enabled := False; btn_novo.Enabled := False; end;
e no botão "Gravar"
procedure TF_usuarios.btn_gravarClick(Sender: TObject); begin dm.TB_usuarios.Post; end;
GOSTEI 0
Heitor Batista
08/12/2014
Cara, troquei umas 30 linhas de código por uma só hehehe ... Já o fiz Hugo, mas aquela janela de erro ainda continua. A imagem ta no meu comentário ali em cima.
GOSTEI 0
Hugo
08/12/2014
hehehehe eu tinha visto... o que não entendi é que msm vc dando um "append", a mensagem diz que o dataset não está em modo de inserção... fiz um teste rápido aqui com uma situação semelhante aqui e funcionou normalmente...
faz um favor se possível, poste o código da unit toda... talvez tenha alguma coisa no meio do caminho que está cancelando a inserção...
faz um favor se possível, poste o código da unit toda... talvez tenha alguma coisa no meio do caminho que está cancelando a inserção...
GOSTEI 0
Heitor Batista
08/12/2014
Blz, Hugo ! Desde já agradeço pela sua ajuda !
Espero que não esteja muito confuso meu código :s
uses U_dm, U_funcoes;
procedure TF_usuarios.LimpaTela;
var I : integer;
begin
for I := 0 to F_usuarios.ComponentCount - 1 do
begin
if F_usuarios.Components[I] is TDBEdit then
(F_usuarios.Components[I] as TDBEdit).Clear;
end;
end;
procedure TF_usuarios.btn_editarUsuarioClick(Sender: TObject);
begin
dm.TB_usuarios.Locate('USER_ID', dm.fb_usuariosUSER_ID.Value,[]);
page_usuarios.ActivePage := tab_cadastrar;
end;
procedure TF_usuarios.FormClose(Sender: TObject; var Action: TCloseAction);
begin
dm.TB_usuarios.Close;
end;
procedure TF_usuarios.FormCreate(Sender: TObject);
begin
dm.TB_usuarios.Open;
page_usuarios.ActivePage := tab_consultar;
btn_gravar.Enabled := False;
end;
procedure TF_usuarios.btn_apagarClick(Sender: TObject);
begin
if MessageDlg('Confirmar exlcusão?', mtConfirmation,
[mbYes, mbNo] ,0)= mrYes then
dm.TB_usuarios.Delete
else
Abort;
end;
procedure TF_usuarios.btn_editarClick(Sender: TObject);
begin
btn_gravar.Enabled := True;
DBEdit1.SetFocus;
btn_editar.Enabled := False;
btn_novo.Enabled := False;
end;
procedure TF_usuarios.btn_gravarClick(Sender: TObject);
begin
if (dm.TB_usuarios.State = dsInsert) then
dm.TB_usuarios.Post;
btn_editar.Enabled := True;
btn_novo.Enabled := True;
btn_gravar.Enabled := False;
end;
procedure TF_usuarios.btn_novoClick(Sender: TObject);
begin
LimpaTela;
DBEdit1.SetFocus;
dm.TB_usuarios.Append;
btn_gravar.Enabled := True;
btn_editar.Enabled := False;
btn_novo.Enabled := False;
end;
procedure TF_usuarios.txt_buscaKeyPress(Sender: TObject; var Key: Char);
begin
// Fazendo a busca
if Key = #13 then
begin
with dm.fb_usuarios do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM USUARIOS ');
// Verifica se busca por nome ou barra
case rg_buscar.ItemIndex of
0 : SQL.Add('where USER_NOME_COMPLETO like :nome order by USER_ID');
1 : SQL.Add('where USER_ID like :nome order by USER_ID');
end;
ParamByName('nome').Value := txt_busca.Text + '%';
Open;
if RecordCount = 0 then
ShowMessage('Usuário não encontrado!');
end;
end;
end;
end.Espero que não esteja muito confuso meu código :s
GOSTEI 0
Heitor Batista
08/12/2014
Hugo, conseguir descobrir o que estava errado !
Não explicar o porque, mas no botão "NOVO", eu joguei o "DBEdit1.SetFocus;" por último... ai parou de dar o erro. Agora está funcionando certo !
Não explicar o porque, mas no botão "NOVO", eu joguei o "DBEdit1.SetFocus;" por último... ai parou de dar o erro. Agora está funcionando certo !
GOSTEI 0
Hugo
08/12/2014
opa tranquilo, estamos ai pra ajudar, apesar de não ser um cara que tem a habilidade da explicação rsrsrs...
rsrs, aparentemente seu botão "Novo" está certo, porem no botão "Editar" vc teria que ter "dm.TB_usuarios.Edit;", da forma como está lá vc está dando um "post" na tabela sem que a mesma esteja em estado de inserção ou edição...
e dai no botão gravar essa comparação seria assim
acho que é isso... veja ai...
rsrs, aparentemente seu botão "Novo" está certo, porem no botão "Editar" vc teria que ter "dm.TB_usuarios.Edit;", da forma como está lá vc está dando um "post" na tabela sem que a mesma esteja em estado de inserção ou edição...
e dai no botão gravar essa comparação
if (dm.TB_usuarios.State = dsInsert) then
if (dm.TB_usuarios.State in [dsInsert, dsEdit]) then
acho que é isso... veja ai...
GOSTEI 0
Hugo
08/12/2014
blz então, que bom que vc conseguiu... só não entendi pq o "setFocus" influenciou rsrsrs
precisando estamos ai...
precisando estamos ai...
GOSTEI 0
Heitor Batista
08/12/2014
Eu também não tendi, mas... rsrs Eu também configurei o botão "Editar" do jeito que você disse... Assim pelo menos sigo um padrão.
Muito obrigado pela ajuda, mais uma vez ! :)
Muito obrigado pela ajuda, mais uma vez ! :)
GOSTEI 0