Ir para conteúdo
Fórum Script Brasil
  • 0

Edit no lugar do Append


Vivendo&Aprendendo

Pergunta

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 para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...