Jump to content
Fórum Script Brasil
  • 0

Edit no lugar do Append


Vivendo&Aprendendo

Question

Olá galera!

Eu uso botões na minha aplicação que servem para qualquer cadastro, tipo eles ficam na barra abaixo do Menu e qualquer tela pode usar os mesmos botões. Eu faço isso com o código abaixo.

//FrmCheques

If ActiveMDIChild = FrmCheques Then

begin

DmDados.Log.Active := True;

DmDados.Log.Append;

DmDados.LogUsuario.value := Usu;

DmDados.LogDataHora.Value := DateToStr(Date)+' - '+TimeToStr(Time);

DmDados.LogAcessos.Value := DmDados.LogAcessos.Value + 'Cheques (Inserir); ';

DmDados.Log.Post;

DmDados.Log.Active := False;

for i := 0 to FrmCheques.ComponentCount - 1 do

if FrmCheques.Componentsis TCustomEdit then

begin

(FrmCheques.Components as TCustomEdit).Enabled := True;

FrmCheques.DBCbbCheques.Enabled := True;

FrmCheques.EdtCodigo.Enabled := False;

end;

DsBotoes.DataSet.Append;

FrmCheques.EdtDataRec.SetFocus;

end;

Neste caso ele esta dando um append na tabela de cheques.

O meu problema é o seguinte, quando eu clico em Insert para adicionar um novo registro, somente nesta tela ele esta entendendo como um Edit e só da o Append definitivo quando clico novamente no botão.

Alguém ai pode me ajudar com isso. Já revirei o código e não achei nada de anormal.

Abraços

Alexandre

Link to comment
Share on other sites

9 answers to this question

Recommended Posts

  • 0

Bom Jonas...

No evento OnClick do botão Inserir eu tenho esse código:

//FrmCheques
If ActiveMDIChild = FrmCheques Then
begin
DmDados.Log.Active := True;
DmDados.Log.Append;
DmDados.LogUsuario.value := Usu;
DmDados.LogDataHora.Value := DateToStr(Date)+' - '+TimeToStr(Time);
DmDados.LogAcessos.Value := DmDados.LogAcessos.Value + 'Cheques (Inserir); ';
DmDados.Log.Post;
DmDados.Log.Active := False;
for i := 0 to FrmCheques.ComponentCount - 1 do
if FrmCheques.Components[i]is TCustomEdit then
begin
(FrmCheques.Components[i] as TCustomEdit).Enabled := True;
FrmCheques.DBCbbCheques.Enabled := True;
FrmCheques.EdtCodigo.Enabled := False;
end;
DsBotoes.DataSet.Append;
FrmCheques.EdtDataRec.SetFocus;
end;
Os botões são utilizados os mesmos para qualquer cadastro, eu coloquei um Data Source no form principal onde fica os botões e abaixo segue a procedure para controlar eles:
//Atribui valor False
procedure TFrmPrincipal.EstadoBotoes(ed:boolean);
begin
  BtnAlterar.Enabled := ed;
  BtnSalvar.Enabled := ed;
  BtnCancelar.Enabled := ed;
  BtnInserir.Enabled := ed;
  BtnExcluir.Enabled := ed;
  BtnPrimeiro.Enabled := ed;
  BtnAnterior.Enabled := ed;
  BtnProximo.Enabled := ed;
  BtnUltimo.Enabled := ed;
  PnBtns.Visible := ed;
end;

//Atribui valor True para os BTns
procedure TFrmPrincipal.DSBotoesStateChange(Sender: TObject);
Var ed : boolean;
begin
  PnBtns.Visible := True;
  ed := DSBotoes.State in [dsEdit, dsInsert];
  BtnSalvar.Enabled := ed;
  BtnCancelar.Enabled := ed;
  BtnAlterar.Enabled := not ed;
  BtnInserir.Enabled := not ed;
  BtnExcluir.Enabled := not ed;
  BtnPrimeiro.Enabled := not ed;
  BtnAnterior.Enabled := not ed;
  BtnProximo.Enabled := not ed;
  BtnUltimo.Enabled := not ed;
end;
Esse é o código que eu uso no form de cadastro para controlar o DataSet do cadastro:
procedure TFrmCheques.FormActivate(Sender: TObject);
begin
  FrmPrincipal.DSBotoes.DataSet := DsCheques.DataSet;
end;
E esse é para desabilitar os botões quando o form for fechado:
procedure TFrmCheques.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  If DsCheques.State in [dsInsert, dsEdit] Then
    DmDados.Cheques.Cancel;
  FrmPrincipal.EstadoBotoes(false);
  Action := Cafree;
  FrmCheques := Nil;
end;

Esse erro ocorre somente em dois forms, nos outros esta tudo normal, e o mais estranho é que já verifiquei todos os códigos dos forms e estão iguais, tudo normal...

Abraços

Alexandre

Link to comment
Share on other sites

  • 0

realmente... o codigo esta correto, entretanto nos forms onde não esta funcionando normal, alguma coisa lhe passou despercebido ....

sugestão: retire do projeto os dois form com problemas, chame um form que esteja funcionando corretamente, salve este form com o nome do form com problema, faça as modificações necessarias e veja se o que acontece ... creio que isto vai resolver.

abraço

Link to comment
Share on other sites

  • 0

isso mesmo , ou então a outra sugestão é criar outro form (novo) para estes que estão com problema. porque o erro não esta no codigo, então talvez esteja com o componente form. ( as vezes acontece isto, mas ainda não descobri o porque )

abraço

Link to comment
Share on other sites

  • 0
//FrmCheques
    If ActiveMDIChild = FrmCheques Then
    begin
      DmDados.Log.Active := True;
      DmDados.Log.Append;
      DmDados.LogUsuario.value := Usu;
      DmDados.LogDataHora.Value := DateToStr(Date)+' - '+TimeToStr(Time);
      DmDados.LogAcessos.Value := DmDados.LogAcessos.Value + 'Cheques (Inserir); ';
      DmDados.Log.Post;
      DmDados.Log.Active := False;
      for i := 0 to FrmCheques.ComponentCount - 1 do
        if FrmCheques.Components[i]is TCustomEdit then
        begin
          (FrmCheques.Components[i] as TCustomEdit).Enabled := True;
          FrmCheques.DBCbbCheques.Enabled := True;
          FrmCheques.EdtCodigo.Enabled := False;
        end;
      DsBotoes.DataSet.Append;
      FrmCheques.EdtDataRec.SetFocus;
    end;
Neste caso ele esta dando um append na tabela de cheques.
procedure TFrmCheques.FormActivate(Sender: TObject);
begin
  FrmPrincipal.DSBotoes.DataSet := DsCheques.DataSet;
end;

O meu problema é o seguinte, quando eu clico em Insert para adicionar um novo registro, somente nesta tela ele esta entendendo como um Edit e só da o Append definitivo quando clico novamente no botão.
posto o código acima e seu comentário, parece-me que por algum motivo, quando você clica inicialmente no botão Insert você está colocando outro dataset em modo inserção. Explicando: pelo seu código, o dataset ref a cheques será atribuído ao FrmPrincipal.DSBotoes.DataSet apenas quando o FrmCheques processar o evento OnActivate. Também, você chama o método Append (DsBotoes.DataSet.Append) fora o if onde você testou o FrmCheques, o que quer dizer que o dataset que está ligado a FrmPrincipal.DSBotoes.DataSet não necessariamente é o esperado, caso o evento OnActivate ocorra antes deste procedimento ser executado.

O motivo de entrar em modo edição, poderia ser justamente porque o form é ativado após o processamento da procedure que o colocaria em Inserção. Ocorre que ao digitar ou editar qualquer campo automaticamente o dataset entra em modo Edição.

Já quando você clica pela segunda vez, você já está com o form ativo, ou seja, o evento OnActivate ocorreu e o dataset está corretamente setado, assim, funciona.

Se você souber depurar o programa, poderá colocar um break-point na linha do Append (por ex.) e verificar qual o dataset que está ligado a FrmPrincipal.DSBotoes.DataSet antes de executá-lo (utilizar CTRL+F7 para inspecionar a propriedade FrmPrincipal.DSBotoes.DataSet.Name)

Abraços

Link to comment
Share on other sites

  • 0

Olá Micheus...

Também, você chama o método Append (DsBotoes.DataSet.Append) fora o if onde você testou o FrmCheques, o que quer dizer que o dataset que está ligado a FrmPrincipal.DSBotoes.DataSet não necessariamente é o esperado, caso o evento OnActivate ocorra antes deste procedimento ser executado.
Veja o código novamente:
//FrmCheques
    If ActiveMDIChild = FrmCheques Then
    begin
      DmDados.Log.Active := True;
      DmDados.Log.Append;
      DmDados.LogUsuario.value := Usu;
      DmDados.LogDataHora.Value := DateToStr(Date)+' - '+TimeToStr(Time);
      DmDados.LogAcessos.Value := DmDados.LogAcessos.Value + 'Cheques (Inserir); ';
      DmDados.Log.Post;
      DmDados.Log.Active := False;
      for i := 0 to FrmCheques.ComponentCount - 1 do
        if FrmCheques.Components[i]is TCustomEdit then
        begin
          (FrmCheques.Components[i] as TCustomEdit).Enabled := True;
          FrmCheques.DBCbbCheques.Enabled := True;
          FrmCheques.EdtCodigo.Enabled := False;
        end;
      DsBotoes.DataSet.Append;
      FrmCheques.EdtDataRec.SetFocus;
    end;
Bom método Append esta dentro do If que testa o Form sim, ele esta fora do If que testa os componentes do form, mas não do If que testa a ativação do form.
O motivo de entrar em modo edição, poderia ser justamente porque o form é ativado após o processamento da procedure que o colocaria em Inserção.
E sempre o comando de iserção é ocorrido depois do evento OnActivate do form cheques, pois tenho que abri-lo primeiro para depois o botão de inserir aparecer e eu utilizá-lo.
Se você souber depurar o programa, poderá colocar um break-point na linha do Append (por ex.) e verificar qual o dataset que está ligado a FrmPrincipal.DSBotoes.DataSet antes de executá-lo (utilizar CTRL+F7 para inspecionar a propriedade FrmPrincipal.DSBotoes.DataSet.Name)

Cara fiz o break point e ele não me da resultado nenhum quando paro o mouse sobre a linha de comando. E o interessante é que eu utilizo o mesmo procedimento para todos os meus forms e não ocorre esses erros nos outros.

Abraços

Alexandre

Link to comment
Share on other sites

  • 0

//FrmCheques
    If ActiveMDIChild = FrmCheques Then
    begin
      DmDados.Log.Active := True;
      DmDados.Log.Append;
      DmDados.LogUsuario.value := Usu;
      DmDados.LogDataHora.Value := DateToStr(Date)+' - '+TimeToStr(Time);
      DmDados.LogAcessos.Value := DmDados.LogAcessos.Value + 'Cheques (Inserir); ';
      DmDados.Log.Post;
      DmDados.Log.Active := False;
      for i := 0 to FrmCheques.ComponentCount - 1 do
        if FrmCheques.Components[i]is TCustomEdit then
        begin
          (FrmCheques.Components[i] as TCustomEdit).Enabled := True;
          FrmCheques.DBCbbCheques.Enabled := True;
          FrmCheques.EdtCodigo.Enabled := False;
        end;
      DsBotoes.DataSet.Append;
      FrmCheques.EdtDataRec.SetFocus;
    end;

Vivendo&Aprendendo, sobre o código acima, após uma olhada mais apurada, vai uma dica e uma correção.

Dica:

Já que aparentemente o campo LogDataHora é do tipo string, troque a linha (4 funções):

DmDados.LogDataHora.Value := DateToStr(Date)+' - '+TimeToStr(Time);

por (2 funções):

DmDados.LogDataHora.Value := FormatDateTime('dd/mm/yyyy - hh:nn', Now);

Correção:

Observe que no for, que você busca por componentes TCustomEdit, ao encontrá-los (no if), além de habilitá-los, você está desnecessariamente manipulando os componentes DBCbbCheques e EdtCodigo que deveriam ser manipulados fora do loop (uma única vez).

Quanto ao problema, há alguma possibilidade de você estar executando algum tipo de verificação no evento OnEnter do componente EdtDataRec, ou no evento OnExit do componente que está no início da lista (tab stop) do seu form (e que não é evidentemente o referido edit) mas que ao perder o foco para EdtDataRec poderia estar interferindo no estado do seu dataset?

Abraços

Link to comment
Share on other sites

  • 0

Olá Micheus, muito obrigado pela sua dica e ai vai mais um relatório do mesmo problema:

No form de cheques, que eu perguntei acima ele parou de dar o problema sozinho não fiz absolutamente nada. E ele dá o erro também no form de entradas, segue abaixo os códigos e procedimentos deste form.

No OnClick do botão inserir no form principal:

//FrmEntradas
    If ActiveMDIChild = FrmEntradas Then
    begin
      DmDados.Entradas.Close;
      DmDados.Entradas.SQL.Clear;
      DmDados.Entradas.SQL.Add('Select * From Entradas');
      DmDados.Entradas.SQL.Add('Order By Codigo');
      DmDados.Entradas.Open;
      DmDados.Log.Active := True;
      DmDados.Log.Append;
      DmDados.LogUsuario.value := Usu;
      DmDados.LogDataHora.Value := DateToStr(Date)+' - '+TimeToStr(Time);
      DmDados.LogAcessos.Value := DmDados.LogAcessos.Value + 'Entradas (Inserir); ';
      DmDados.Log.Post;
      DmDados.Log.Active := False;
      for i := 0 to FrmEntradas.ComponentCount - 1 do
        if FrmEntradas.Components[i] is TCustomEdit then
        begin
          (FrmEntradas.Components[i] as TCustomEdit).Enabled := True;
          FrmEntradas.EdtCodigo.Enabled := False;
          FrmEntradas.EdtDataEntrada.Enabled := False;
          FrmEntradas.EdtDescricao.Enabled := False;
          FrmEntradas.EdtEstoque.Enabled := False;
          FrmEntradas.EdtValorTotal.Enabled := False;
        end;
      DSBotoes.DataSet.Append;
      FrmEntradas.EdtDataEntrada.Text := DateToStr(Date);
      FrmEntradas.EdtLocaliza.SetFocus;
    end;
A respeito da manipulação dos campos, para elas ficarem fora do loop estou alterando... No OnEnter do campo que recebe o foco ao clicar no Inserir (código acima):
procedure TFrmEntradas.EdtLocalizaEnter(Sender: TObject);
begin
  If (DmDados.Entradas.State in [dsInsert, dsEdit]) Then
  begin
    FrmPrincipal.DSBotoes.DataSet.Post;
    DmDados.Log.Active := True;
    DmDados.Log.Append;
    DmDados.LogUsuario.value := Usu;
    DmDados.LogDataHora.Value := DateToStr(Date)+' - '+TimeToStr(Time);
    DmDados.LogAcessos.Value := DmDados.LogAcessos.Value + 'Entradas (Salvar); ';
    DmDados.LogMovimento.Value := 'Código: '+EdtCodigo.Text;
    DmDados.Log.Post;
    DmDados.Log.Active := False;
  end;
  If not (ADOItensEntradas.State in [dsInsert, dsEdit]) Then
  begin
    ADOItensEntradas.Append;
    Cod := StrToInt(EdtCodigo.Text);
    ADOItensEntradasCodigoEntrada.Value := DmDados.EntradasCodigo.Value;
  end;
end;
No OnExit do campo que recebe o foco ao clicar no Inserir...
procedure TFrmEntradas.EdtLocalizaExit(Sender: TObject);
begin
  If PnProdutos.Top <> 0 Then
  begin
    If (EdtLocaliza.Text <> '') Then
    begin
      If not ADOProdutos.Locate('Codigo',EdtLocaliza.Text,[loCaseInsensitive,loPartialKey]) Then
      begin
        Application.MessageBox('Produto não cadastrado!','Atenção',mb_IconExclamation +mb_ok);
        EdtLocaliza.Clear;
        EdtLocaliza.SetFocus;
      end;
    end
    else
    If (Tecla <> VK_F2) Then
    begin
      Application.MessageBox('Favor preencha o campo Cód. do Produto!','Atenção',mb_IconExclamation +mb_ok);
      EdtLocaliza.SetFocus;
    end
    else
    begin
      DmDados.Entradas.Post;
    end;
  end;
end;
E pra finalizar no OnKeyDown do mesmo edit (que recebe o foco ao clicar no Inserir)...
//F9 abre o panel de produtos
procedure TFrmEntradas.EdtCodProdutoKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
Var ValorTotal : Real;
  Cont, Fim, i : Integer;
begin
  If Key = VK_F9 Then
  begin
    PnProdutos.Top := 0;
    EdtBuscaProdutos.SetFocus;
  end;
  If Key = VK_F2 then
  begin
    Tecla := Word(ORD(Key));
    If Application.MessageBox('Deseja realmente FINALIZAR A VENDA?','Alerta',mb_IconEXCLAMATION +MB_YESNO)=6 then
    begin
      If (DmDados.Saidas.State in [dsInsert, dsEdit]) Then
        DmDados.Saidas.Cancel;
      If (ADOItensEntradas.State in [dsInsert, dsEdit]) Then
        ADOItensEntradas.Cancel;
      //calcula o valor total da Saida e os registros
      Cont := 0;
      ValorTotal := 0;
      Fim := 0;
      ADOItensEntradas.First;
      Fim := ADOItensEntradas.RecordCount;
      With ADOItensEntradas Do
      begin
        While Cont < Fim Do
        begin
          If ADOItensEntradasCodigoEntrada.Value = StrToInt(EdtCodigo.Text) Then
            ValorTotal := ValorTotal + ADOItensEntradasValorTotalProduto.Value;
          Cont := Cont + 1;
          ADOItensEntradas.Next;
        end;
      end;
      DmDados.Entradas.Refresh;
      DmDados.Entradas.Locate('Codigo', Cod,[LoCaseInsensitive]);
      DmDados.Entradas.Edit;
      DmDados.Entradas.FieldByName('TotalItens').AsInteger := Fim;
      DmDados.Entradas.FieldByName('ValorTotalNf').AsCurrency := ValorTotal;
      //A tabela de saidas esta sendo salva no botão finalizar
      DmDados.Produtos.Close;
      DmDados.Produtos.Open;
      //desabilita os campos após ser salvo
      for i := 0 to FrmEntradas.ComponentCount - 1 do
      begin
        if FrmEntradas.Components[i] is TCustomEdit then
        begin
          (FrmEntradas.Components[i] as TCustomEdit).Enabled := False;
        end;
      end;
      DmDados.ItensEntradas.Close;
      DmDados.ItensEntradas.Open;
    end;
  end;
end;

Como pode ver são três procedimentos acionados no mesmo componente (Edit), será que pode ser isso, qual dica você pode me dar...

Abraços

Alexandre

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.5k
×
×
  • Create New...