ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Problema com insert e não descobri o porque? **Resolvido**

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mar 08, 2010 8:49 pm    Assunto: Problema com insert e não descobri o porque? **Resolvido** Responder com Citação

Pessoal, não consigo detectar o motivo que ao aplicar o append do dataset ele não abre um novo insert na tabela, somente consigo abrir um insert se eu apertar novamente no btn_insert

O código é simples
Código:
procedure Tfrmcadordserv.btninsertClick(Sender: TObject);
begin
   tabsheet2.TabVisible := true;
   tabsheet2.Show;
   //inclui
   ordemserv.Append;
   buscaid;  //procedure para identificar a ID do cliente
   edtgen.text := varid; //joga o ID para uma variavel global
  //este comando UpdateRecord é muito importante na lista para pegar a ID da tabela mestre
     // deve ficar depois que cria a variavel do ID
   ordemserv.UpdateRecord; // este comando serve para atualizar a tabela pai
                            // assim posso incluir dados na tabela filho com
                            // a referencia da tabela pai.
   dslocal.dataset.FieldByName('emissao').asstring := datetostr(now);
   dslocal.dataset.FieldByName('horaemissao').asstring := timetostr(Time);
   dslocal.dataset.FieldByName('despacho').asstring := '';//datetostr(now);
   dslocal.dataset.FieldByName('horadespacho').asstring := ''; //timetostr(Time);
   pendente.ItemIndex := 0;
   cbclientes.Enabled := True;
   cbclientes.SetFocus; //entra em foco
   //mostra os componentes em atividades
   cbcentrocusto.visible := true;
   dbcentrocusto.visible := false;
   //limpa os captions dos labels
   lblcliente.Caption  := '';
   lblendereco.Caption := '';
   lbltelefone.Caption := '';
   lblbairro.Caption   := '';
   lblcidade.Caption   := '';
   lbluf.Caption       := '';
   aberto.Enabled      := true;
   fechado.Enabled     := true;
   aberto.Checked      := true;
   //Todo: se for utilizar um Radiogroup usar o codigo abaixo
   //TRadioButton(RadioGroup1.Controls[1]). Enabled := False;
   //Para mudar a coluna do radiogroup lado a lado mudar a propriedade columns = 2
end;

Ja debuguei e vi que entra na linha do append, mais não sei o pq ele ignora esta linha pois não entra em insert logo na primeira vez que executo o comando, somente na segunda vez.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree


Editado pela última vez por adriano_servitec em Seg Mar 08, 2010 10:06 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rafmattos
Colaborador
Colaborador


Registrado: Quinta-Feira, 11 de Fevereiro de 2010
Mensagens: 3416
Localização: Campo Grande/MS

MensagemEnviada: Seg Mar 08, 2010 9:02 pm    Assunto: Responder com Citação

o que esse buscaid, será q ele nao ta tirando sua tabela do mode de insert

ou

da uma olhada tb se nao tem nada no BeforeInsert do componente de dados
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mar 08, 2010 9:14 pm    Assunto: Responder com Citação

rafmattos escreveu:
o que esse buscaid, será q ele nao ta tirando sua tabela do mode de insert

ou

da uma olhada tb se nao tem nada no BeforeInsert do componente de dados
Ola amigo, esta procedure é apenas para buscar o generators

Código:
procedure Tfrmcadordserv.buscaid;
begin
  with qrylocal do
  begin
    Sql.Clear;
    Sql.Add('SELECT * FROM SP_NEWCOD(''ORDEMSERV'')');
    Open;
  end;
  varid := inttostr(qrylocal.FieldByName('CODIGO').AsInteger);
end;


Também não estou usando nada no evento entes do insert do dataset.

Percebi que o problema esta ao entrar no foco do dbedit, e não é somente no foco deste dbedit
Código:
cbclientes.SetFocus; //entra em foco

É em qualquer foco dos componentes dbedits ligados a este dataset
Todos eles fugam em um groupbox, mais não tem enhum evento que trata neste groupbox, e também nenhum evento no dataset ligado a estes dbedits nem nos eventos do datasource. Não sei o que esta havendo amigo.

Obrigado...
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Seg Mar 08, 2010 9:15 pm    Assunto: Responder com Citação

buscaid; //procedure para identificar a ID do cliente
edtgen.text := varid; //joga o ID para uma variavel global


não seria melhor

o buscaID ser uma function q ja retornava o valor?

em vez de colocar numa global "problemática" e "insegura"
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Seg Mar 08, 2010 9:16 pm    Assunto: Responder com Citação

usaria assim:


//buscaid; //procedure para identificar a ID do cliente
edtgen.text := buscaid;

apesar q o correto mesmo era


OrdemServCampo.Value := buscaid;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Seg Mar 08, 2010 9:19 pm    Assunto: Responder com Citação

Código:
function Tfrmcadordserv.buscaid : Integer;
begin
  with qrylocal do
  begin
    Sql.Clear;
    Sql.Add('SELECT * FROM SP_NEWCOD(''ORDEMSERV'')');
    Open;
  end;
  Result := qrylocal.FieldByName('CODIGO').AsInteger;
end;



fala sério!!!!

variavel global é pro pessoal q não sabe pra serve o Result, Return, "returning values", etc.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mar 08, 2010 9:31 pm    Assunto: Responder com Citação

Ola amigo, ta bom eu alterei aqui, mais não é este o problema ainda.

Se eu entrar em foco em qualquer dbedit ligado a este dataset ele sai do append como se desse um cancel na tabela, e não achei nenhum evento que esteja tratando disso.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Seg Mar 08, 2010 9:35 pm    Assunto: Responder com Citação

ordemserv.Append;
...
...
ordemserv.UpdateRecord;//achei estranho


se tirar essa linha?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mar 08, 2010 9:40 pm    Assunto: Responder com Citação

gilsonnrodrigues escreveu:
ordemserv.Append;
...
...
ordemserv.UpdateRecord;//achei estranho


se tirar essa linha?
Gilson, se eu tirar o UpdateRecord não consigo levar a ID da tabela mestre na tabela detalhe.

Vou explicar o que estou fazendo

Tenho um form de ordem de serviço, aonde ao clicar no botão insert deve montar o cabeçalho, ai devo escolher um cliente, assim que escolher passo para a grid aonde tem os serviços que fica em uma tabela detalhe, mais como ainda não gravei esta ordem e amarro a IDOrdem com a tabela detalhe somente com o uso do UpdateRecord é que posso fazer isso sem precisar gravar a tabela mestre primeiro para depois começar a usar a tabela detalhe.

Mesmo assim comentei a linha que vc referiu, e nada, apesar de eu ja usar desta maneira a muito tempo.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Seg Mar 08, 2010 9:45 pm    Assunto: Responder com Citação

vai "debugando".

coloque showmessage mostrando o estado e veja onde muda
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mar 08, 2010 9:52 pm    Assunto: Responder com Citação

gilsonnrodrigues escreveu:
vai "debugando".

coloque showmessage mostrando o estado e veja onde muda
Pior que nem se em que linha debugar, pois no codigo acima ja fiz o teste colocando em um bloco assim

Código:
tabsheet2.TabVisible := true;
   tabsheet2.Show;
   //inclui
   ordemserv.Append;
if ordemserv.state in [dsinsert] then
begin
   ordemservIDORDEM.AsInteger := buscaid;  //procedure para identificar a ID do cliente
//   edtgen.text := varid; //joga o ID para uma variavel global
    //este comando UpdateRecord é muito importante na lista para pegar a ID da tabela mestre
       // deve ficar depois que cria a variavel do ID
   ordemserv.UpdateRecord; // este comando serve para atualizar a tabela pai
                              // assim posso incluir dados na tabela filho com
                              // a referencia da tabela pai.
   dslocal.dataset.FieldByName('emissao').asstring := datetostr(now);
   dslocal.dataset.FieldByName('horaemissao').asstring := timetostr(Time);
   dslocal.dataset.FieldByName('despacho').asstring := '';//datetostr(now);
   dslocal.dataset.FieldByName('horadespacho').asstring := ''; //timetostr(Time);
   pendente.ItemIndex := 0;
   cbclientes.Enabled := True;
// cbclientes.SetFocus; //entra em foco
   //mostra os componentes em atividades
   cbcentrocusto.visible := true;
   dbcentrocusto.visible := false;
   //limpa os captions dos labels
   lblcliente.Caption  := '';
   lblendereco.Caption := '';
   lbltelefone.Caption := '';
   lblbairro.Caption   := '';
   lblcidade.Caption   := '';
   lbluf.Caption       := '';
   aberto.Enabled      := true;
   fechado.Enabled     := true;
   aberto.Checked      := true;
   //Todo: se for utilizar um Radiogroup usar o codigo abaixo
   //TRadioButton(RadioGroup1.Controls[1]). Enabled := False;
   //Para mudar a coluna do radiogroup lado a lado mudar a propriedade columns = 2}
end;
E vi que não é ai o problema, pois até ai abre o insert, o problema esta quando entro em foco em qualquer um dos dbedits ligados a este dataset, é como se desse um cancel e ficasse com a tabela aberta no primeiro registro da tabela.

Ai ja olhei se tem algum ponto nestes locais para dar um F5 e debugar, mais não tem nenhum evento em nenhum deles que contém codigo. Ai fico sem saber o que esta me causando isso.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mar 08, 2010 10:02 pm    Assunto: Responder com Citação

gilsonnrodrigues e rafmattos, achei aonde estava fazendo isso, era no evento onshow do tabsheet2, esqueci deste evento. Já arrumei

Estas duas procedures que retornavam ao estado do primeiro registro
Código:
//---------------------------------------------------
// Procedure para sincronizar dois dataset's no zeos
// Um dataset possui joins e outro o cabeçalho da OS
//---------------------------------------------------
procedure Tfrmcadordserv.Sincronizar_DataSet;
begin
  with ordemserv do
  begin
    close;
    sql.clear;
    sql.add (' select * from ordemserv ');
    sql.add (' where idordem = :busca  ');
    ParamByName('busca').AsInteger := DBgrid2.Fields[3].AsInteger; // Pega o valor da coluna do dbgrid
    open;
    mostracadclie;
    movimento;
  end;

end;


Código:
procedure Tfrmcadordserv.mostracadclie;
begin
//todo:verificar pq do erro
  //traz o resultado no caption cfe os campos
  lblcliente.Caption    := dbcliente.text;
  lblendereco.Caption   := dbendereco.Text;
  lbltelefone.Caption   := dbtelefone.Text;
  lblbairro.caption     := dbbairro.Text;
  lblcidade.Caption     := dbcidade.Text;
  lbluf.caption         := dbuf.Text;
  cbcentrocusto.visible := false;
  dbcentrocusto.Visible := true;
  dbcentrocusto.Top     := 150;
end;


Agora tratei o estado no evento onshow deste tabsheet
Código:
[code]if ordemserv.state in [dsedit, dsbrowse] then
  begin
     Sincronizar_DataSet;
     mostracadclie;
  end;   [/code]
Assim quando o estado estiver em modo insert ignora as duas procedures.

Realmente passei despercebido deste evento.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Seg Mar 08, 2010 10:17 pm    Assunto: Responder com Citação

é por isso q "odeio" esses eventos.

rsrs.

to bincando.

mas eles são mt bons pra vc controlar o visual.

negocio, eles fazem confusão.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mar 08, 2010 10:24 pm    Assunto: Responder com Citação

Citação:
variavel global é pro pessoal q não sabe pra serve o Result, Return, "returning values", etc.
Eu sou uma destas pessoas...Não que eu não saiba pra que serve o return da função, mais pq não sabia que variavel global é tão problemático. Na empresa que eu trabalho meu patrão odeia que eu use variavel global (mais também nunca me disse opq, apenas pede pra usar as funções da empresa), mais lá ja temos uma LIB muito boa que faz N coisas que não precisa de variaveis, mais aqui em casa como não tenho muitas funções e não sei criar muito bem novas funções, então parto para variaveis, só não sabia desta fama que elas tem.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Ter Mar 09, 2010 10:09 am    Assunto: Responder com Citação

mas não há o q saber se vc sabeusar função.


vamos lá!!!

exemplo:

Código:
procedure Soma(var1, var2 : Integer);
begin
  varGlobalSoma := Var1 + Var2;
end;


Código:
  soma(10, 15);
  mostraMensagem(intToStr(varGlobalSoma ));//mas td mundo pode alterar essa varGlobalSoma inclusive essa MostraMensagem.

agora imagine vc usar assim:

Código:
function Soma(var1, var2 : Integer) : Integer;
begin
  Result := Var1 + Var2;
end;


Código:
  mostraMensagem(intToStr(soma(10, 15)));// não fica mais bonitinho



não tem segredo não. é só desentoxixar das globais.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB