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

Criando Registro Vazio Sozinho


Arlon

Pergunta

Olhem só o q tá contecendo:

Eu tenho 4 formulários: Clientes, Cliente, Lojas e Loja.

Os formulário Clientes e Lojas possuem cada um DBGrid que mostra os registros de suas respecivas tabelas, um botão para inclusão, um pra edição e um de exclusão.

Os formulários Cliente e Loja possuem os DBEdits setados para as tabelas. Quando eu clico no botão Inserir ele chama o formulário com os DBEdits, eu substitui o DBEdit Cod_Cliente e Cod_Loja(chaves primárias) por MaskEdits e faço a seguinte verificação no evento OnExit dele:

if (trim(Maskedit1.text) <> '') and (opcao = 1) then begin

cod := Maskedit1.text;

if DM.TBClientes.FindKey([cod]) then begin

Showmessage('Código de Cliente já cadastrado.');

LimpaTela;

Maskedit1.SetFocus;

end

else begin

DM.TBClientes.Insert;

MaskEdit1.Enabled := false;

end;

end;

end;

Opcao é uma variável q eu criei pra diferenciar inclusão(opcao = 1) de edição (opcao = 2) já que o formulário chamado é o mesmo nas duas opções(Loja ou Cliente)

só q quando o foco sai do maskEdit1 é criado um registro com todos os campos vazios inclusive a chave primária e quando eu clico no botão Inserir do formulário Lojas ou Clientes(o formulário que possui o DBGrid) aparece aquela msg de erro dizendo que a tabela não está em modo de edição ou inclusão, sendo que no código do botão eu já dou o comando de edição ou inserção e quando eu digito no maskedit acusa violação de chave, mesmo eu digitando um número que ainda não foi registrado. O mais estranho de tudo é que eu tenho mais dois formulários, Produtos e Produto, os dois com os mesmos códigos dos outros quatro formulários citados acima só que não apresentam nenhum tipo de erro e tb tenho um outro aplicativo q eu mesmo fiz com os mesmos códigos e tb não aparece esse erro. Alguém poderia me dar uma luz quanto a esse problema, pow erro de BD é chato pra cacete de resolver.

estou usado paradox, não sei se tem alguma coisa haver.

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

UIx cara.. intendi nada.. sad.gif quem manda ser iniciante tongue.gif

Deixa ver: é +- assim:

você aperta o editar, chama o form com os dbedits, com o foco em um Maskedit, ao sair do maskedit checa se o codigo existe, se ele existe da a mensagem e retorna pra ele, caso não, da um insert?

Se o codigo não existe e você quer criar um novo o certo não seria dar um append?

quanto a mensagem de erro dizendo que a tabela não está em modo de edição ou inclusão, isso só da comigo ao dar um post na tabela, mas não vi isso no seu codigo... Acho o seguinte... marca o codigo pra dar um stop um pouko antes disso e da uma step (F7) pra ver em que linha o erro esta sendo originado

Foi mal não poder ajudar de verdade aehhehe

Link para o comentário
Compartilhar em outros sites

  • 0

É quase isso, só errou em uma parte:

você aperta o editar, chama o form com os dbedits, com o foco em um [...] não seria dar um append?

Se eu apertar o 'Incluir' acontece o q tá acima. E pra q serve o 'append'?????.

Outra coisa, o post tá no evento do botão 'Gravar' q só desabilita se eu digitar um código q ainda não existe (eu faço verificação no evento OnChange do MaskEdit tb)

Vou dar uma dica pra você então, não sei se estou certo mas... sempre q você der um post, dá um cancel depois q é pra tabela ficar cancelada, as mensagens de erro 'Not in edit or insert mod' pararam de aparecer em um outro formulário quando eu fiz isso. Mas o mais estranho de tudo é q em outro formulário eu uso o mesmíssimo código e dá tudo certo.

Tipo, eu já "resolvi" esses problemas q tavam dando refazendo-os de uma outra forma, fiz o seguinte: coloquei o campo 'Código' como autoincremeto nas duas tabelas (Clientes e Lojas) e coloquei o campo 'Nome' como chave primária. O cliente não pode ficar esperando eu resolver o problema, né!! depois com mais calma eu descubro os motivos desse erro, mas até q a solução q eu dei ficou legal né??

Duas perguntas:

Pra q serve o append?

e como colocar o valor do campo autoincremento em um dbEdit? eu estou usando o evento onshow do formulário e o seguinte código: DBEdit2.Text := FloatToStr(DM.TBClientesCod_Cliente.Value); mas nã tá dando certo, ele diz q o campo não pode ser modificado.

Link para o comentário
Compartilhar em outros sites

  • 0

E pra q serve o 'append'?????.

O Append serve para inserir um novo registro na tabela.. o uso ideal do append é assim oh

dentro de um botao coloca-se

//para iniciar um novo registro

table1.append

//setar o foco do campo

dbedit1.setfocus

agora o campo autoincremento ate onde eu sei não pode ser editado... ok talvez seja por isso que esta dando o erro, tente colocar o campo como campo numerico ok

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Aí Bolo eu li o seu tópico "Nível caindo" ontem e concordo com tudo q foi dito por você e pelos outros membros do fórum, pow peço desculpas ao pessoal aqui do fórum se estou fazendo exatamente o q você estava pedindo pra evitar, mas é q existem certas dúvidas q agente vira a net de cabeça pra baixo e não consegue achar exatamente o q agente quer, por isso é q esse meu tópico q até agora só em 4 respostas tá tão grande, é q eu estou começando com delphi agora e no curso q eu fiz foi dado apenas um sistema q use banco de dados e no final ele tava cheio de bug, mas azer o q né, nenhum curso e nenhum professor são perfeitos.

Resumindo o q eu estou fazendo, já q o corposemalma não entendeu direito (e creio q não tenha sido o único) vou explicar mais uma vezinha...

Tenho 2 forms Clientes e Cliente, o form Clientes possui:

-um toolBar com 4 botões - inserir, alterar, excluir e sair -;

-um dbgrid e um dbnavigator setado para a tabela Clientes

e o form Cliente é o q possui os bdedits, o form de registro propriamente dito, com dois botões - OK e cancelar -.

OnClick do botão Inserir do form Clientes:

DM.TBClientes.Insert;

FrmCliente.Incluir; // esse frmcliente.Incluir é uma procedure q eu criei com akela parada de Ctrl + Shift + c

FrmCliente.Incluir:

opcao := 1;// (opcao = 1, insere / opcao = 2, edita)

ShowModal;

FrmCliente.FormShow:

if opcao = 1 then begin

DM.TBClientes.Append; <--- devo colocar o append só aqui??

LimpaTela;

MaskEdit1.setfocus;

end;

if opcao = 2 then begin <---- edição do registro

MaskEdit1.Text := DM.TBClientesCliente.Value;

MaskEdit1.Enabled := false;

DBEdit3.SetFocus;

DBEdit3.SetFocus;

DBEdit4.SetFocus;

DBEdit5.SetFocus;

DBEdit5.SetFocus;

DBEdit6.SetFocus;

DBEdit8.SetFocus;

DBEdit9.SetFocus;

DBEdit3.SetFocus;

BtnOk.Enabled := true;

end;

OnExit do MaskEdit (campo 'Nome', chave primária. A verificação abaixo é pra não haver violação de chave)

var cod : string;

Begin

if (trim(MaskEdit1.text) <> '') and (opcao = 1)then begin

cod := MaskEdit1.text;

if DM.TBClientes.FindKey([cod]) then begin

Showmessage('Cliente já cadastrado.');

LimpaTela;

MaskEdit1.SetFocus;

end

else begin

no aplicativo q eu fiz no curso aqui tinha um DM.TBClientes.Insert, nesse agora eu não coloquei e tb não apresentou nenhum problema, porque q o professor colocou-o aki eu não sei.

DBEdit3.SetFocus;

end;

end;

end;

- O programa tá rodando direito, mas eu devo colocar algum outro append??

- Apesar de ter o apend no código, é necessário o Insert no evento do botão inserir, ou só o append já basta??

- Ainda sobre o append... qual a diferença dele em relação ao insert??

Link para o comentário
Compartilhar em outros sites

  • 0

Primeiro: você ta apresentando o codigo e pedindo ajuda, é bem diferente ao que o pessoal faz que geralmente é assim:

(Preciso enviar um email pelo meu sistema, da pra mandar o códogio?) tongue.gif

Acho eu que é a seguinte:

Append = cria um novo registro no fim da tabela

Insert= cria um registro entre a linha em que o ponteiro da tabela está e a próxima(talvez copie os dados da linha do ponteiro, mas não sei)

AEEEEEEEE

Cara ACHO que já saquei teu problema!

você ta dando um append e depois procurando pelo código, acontece que quando você procura pelo código, o append (ou insert) é cancelado ou postado, ai cria o campo vazio!!!... E aquele erro de Db é quando vai setar o dado no campo a tabela não esta em edicao ou insercao de dados, ta ai o motivo daquele append que tu suspeitava que não precisa!

então fica a pergunta: O usuario realmente precisa preencher o código, não seria melhor o sistema gerar ele? Se o usuario precisa, voce vai ter que reformular esse código e arranjar uma maneira de colocar a checagem de codigo antes do append....

outra: Algumas melhorias que você pode pensar a respeito:

Tem coisas se repetindo(insert, depois append) você ta dando um insert no botao e um append no show do Form

Ao invés daquele procedimento aprenda a utilizar as propriedades TAG dos form por exemplo:

formcadastro.tag := 0

formcadastro.showmodal

formcadastro.tag := 1

formcadastro.showmodal

If tag = 0 then

begin

  tabela.append;

end

else

begin

  tabela.edit;

end;

O unico problema, é que eu sempre acho que é alguma coisa laugh.gif

Editei o tópico umas 20 vezes ate ficar assim tongue.gif

Se esse for realmente o erro, pode ficar calmo que não é de DB, mas de lógica... HAUHUAUHA

Link para o comentário
Compartilhar em outros sites

  • 0

Na boa vocês podem achar q é sacanagem, mas não é não. Quando eu postei aquela msg ali em cima com os códigos o programa tava rodando beleza pura, eu entrei na internet à tarde gastando meus preciosos pulsos, debaixo de inúmeros 'desconecta logo isso garoto' da minha mãe. Saí de casa e voltei umas 9 da noite quando eu rodei o aplicativo voltou a dar o erro q tava dando antes, na boa esse tal de Delphi tá de perseguição comigo, não é possível... agora ainda são 23:15 e estou eu aki gastando mais alguns pulsos, mas pelo menos agora minha mãe tá dormindo... estou com sono, cansado de ficar desde 11 da manhã com minha bunda na cadeira tentando resolver essas desgraças desses problemas, valeu a ajuda Bolo e Corpo, mas amanhã eu posto alguma coisa aki relatando o q eu consegui resolver desses erros, valeu a ajuda galera...

Já troquei insert por append e vice-versa nada dá certo, tá sinistro mesmo, mas o negócio é não desistir amanhã eu tento de novo...

Editado por Arlon
Link para o comentário
Compartilhar em outros sites

  • 0

Aí Bolo eu li o seu tópico "Nível caindo" ontem e concordo com tudo q foi dito por você e pelos outros membros do fórum, pow peço desculpas ao pessoal aqui do fórum se estou fazendo exatamente o q você estava pedindo pra evitar, mas é q existem certas dúvidas q agente vira a net de cabeça pra baixo e não consegue achar exatamente o q agente quer, por isso é q esse meu tópico q até agora só em 4 respostas tá tão grande, é q eu estou começando com delphi agora e no curso q eu fiz foi dado apenas um sistema q use banco de dados e no final ele tava cheio de bug, mas azer o q né, nenhum curso e nenhum professor são perfeitos.

sei como é isso Brother ..

Ai pelo que eu vi realmente é esse o problema

você esta adicionando um dado vazio e editando um dado existente,

você perguntou a diferença entre o

Append -> Comando da linguagem Pascal que serve para adicionar um registro no banco de dados

Insert -> Comando SQL que serve para inserir um registro no banco de dados

Eu recomendo a voce usar somente o Append quando seus bancos de dados forem paradox, ok

Abraços e depois de mudar a logica chama nois ai.. !!!

Link para o comentário
Compartilhar em outros sites

  • 0

O nosso amigo desalmado falou o seguinte:

Cara ACHO que já saquei teu problema! 
você ta dando um append e depois procurando pelo código, acontece que quando você procura pelo código, o append (ou insert) é cancelado ou postado, ai cria o campo vazio!!!... E aquele erro de Db é quando vai setar o dado no campo a tabela não esta em edicao ou insercao de dados, ta ai o motivo daquele append que tu suspeitava que não precisa!

daí o q q eu fiz... no código do botão inserir eu usei um .Insert, só q eu faço duas verificações e como ele falou essa parada aí em cima eu pensei: então eu devo cancelar o registro e fazer a verificação, certo.

Então, nos eventos ON Change e Exit do maskedit antes de começar a rotina de verificação eu cancelei a tabela e no final do procedimento eu dei um append. Bem até agora tudo bem, mas peço ao amigo Bolo q não feche o tópico, pois como ontem à tarde tava dando certo e à noite (do nada, sem eu ter mexido no código) começou a dar errado, sei lá o q me pode acontecer dessa vez, pode deixar q se após alguns testes eu verificar q está mesmo tudo certo eu peço pra fecharem o tópico, valeu...

Link para o comentário
Compartilhar em outros sites

  • 0

Pra não abrir outro tópico eu vou utilizar esse aki mesmo...

acho q depois de todas aquelas complicações essa é mais fácil de resolver, mas eu não estou conseguindo... o formulário de edição é o mesmo de inserção, por isso eu uso a variável 'opcao', mas o Corposemalma já me deu uma dica, disse pra usar o tag do formulário e eu nem sabia q o tag servia pra isso, mas... vivendo e aprendendo.

Evento OnShow do form:

   if opcao = 1 then begin <-- inserção
      LimpaTela;
      MaskEdit1.setfocus;
      BtnOK.enabled := false;
   end;
   if opcao = 2 then begin <-- edição
      MaskEdit1.Text := DM.TBClientesCliente.Value;
      MaskEdit1.Enabled := false;
      DM.TBClientes.Cancel;
      DM.TBClientes.Edit;
      DBEdit3.SetFocus;

o problema é seguinte: se, por exemplo, eu tiver 5 clientes cadastrados e editar o segundo registro, o ponteiro da tabela vai pro último registro, daí eu clico no botão 'cancelar' q possui apenas uma linha de código: 'DM.TBClientes.Cancel;' e se eu clicar no registro novamente e clicar no botão Editar aí sim eu consigo editar os seus dados. Não sei se seria o caso, mas existe alguma maneira de eu colocar o ponteiro da tabela exatamente naquele registro q eu quero editar?? Se você reparar lá no evento OnShow, antes de eu dar o comando de editar eu cancelo a tabela, a mesma coisa q o botão cancelar faz, estranho né!!??

Ah, mais uma coisinha: tem um outro formulário, o de Pedidos, e nele eu coloquei alguns campos com preenchimento automático, através de buscas SQL, pox exemplo:

Tem um DBEdit e ao lado dele um DBText, no evento OnExit do DBEdit eu coloquei uma busca q ele me retorna no DBText o nome do produto correspondente ao código q eu digitei no DBEdit, até aí tudo certo, só q quando eu gravo na tabela só aparece nela o que eu digitei no DBEdit o q eu digitei no DBText não grava, eu já setei as propriedades DataSet E DataField do DBText mas tá acontecendo isso, é normal ou tenho q usar: DM.TBPedidosDescricao.Value := DBText1.Caption ??

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,3k
×
×
  • Criar Novo...