Fórum REGISTRO DUPLO #503695

08/12/2014

0

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 !
Heitor Batista

Heitor Batista

Responder

Posts

08/12/2014

Hugo

Amigo, vc pode postar o código referente aos botões "novo" e "gravar" ?
Responder

Gostei + 0

08/12/2014

Heitor Batista

Claro !

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;
Responder

Gostei + 0

08/12/2014

Heitor Batista

--> "dm", é o Data Module
--> "fb_usuarios", é a Query
--> "TB_usuarios", é a Table
Responder

Gostei + 0

08/12/2014

Hugo

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...

dm.TB_usuarios.Post;



Acho que é mais ou menos por ai...

qualquer coisa manda ai...
Responder

Gostei + 0

08/12/2014

Heitor Batista

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?
Responder

Gostei + 0

08/12/2014

Heitor Batista

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.
Responder

Gostei + 0

08/12/2014

Hugo

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...
Responder

Gostei + 0

08/12/2014

Heitor Batista

Blz, Hugo ! Desde já agradeço pela sua ajuda !

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
Responder

Gostei + 0

08/12/2014

Heitor Batista

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 !
Responder

Gostei + 0

08/12/2014

Hugo

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
 if (dm.TB_usuarios.State = dsInsert) then
seria assim
 if (dm.TB_usuarios.State in [dsInsert, dsEdit]) then


acho que é isso... veja ai...
Responder

Gostei + 0

08/12/2014

Hugo

blz então, que bom que vc conseguiu... só não entendi pq o "setFocus" influenciou rsrsrs

precisando estamos ai...
Responder

Gostei + 0

08/12/2014

Heitor Batista

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 ! :)
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar