Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Dunhasss

[Resolvido] erro no delphi.....

Recommended Posts

estou fazendo um programa e quando vou inserir um cliente que ja existe ele da error "violation foreign key integ_4"

eu queria saber se ten alguma maneira de fazer um teste para que esse error nao aconteça!!!

 

eu ja tentei colocar isso

 

if (DBEdit1.text <> IBClienteEmpresa.AsString) then begin

IBCliente.Post;

DM.IBTransaction1.CommitRetaining;

IBCliente.Open;

end

else begin

messagedlg('Nome da Empresa ja Existente',mtInformation,[mbOK],0);

DBEdit1.SetFocus;

end;

mas fazendo isso ele so cai no else.....

 

se puderem me ajudar eu abgradeço de coração!!!

 

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite Dunhasss.

 

Para fazer pesquisa ou qualquer tipo de filtro na tabela, esta jamais poderá estar em modo de inserção ou edição. Isto porque o registro que voce está inserindo ou editando encontra-se em aberto e no momento que voce realiza uma pesquisa, a tabela entra em modo de movimentação de registro, de maneira tal que o registro que voce estava editando ou iserindo se perde. Há casos que isto provoca erros inreparáveis na tabela.

 

Portanto tenha sempre o cuidado de antes de inserir qualquer registro, faça primeiro a verificação se ele já não existe, mas como eu vou fazer isto ? Eu criei uma função booleana que faz a verificação da existencia do registro, retornando False caso o registro exista e True caso contrário, eis a função:

 

function TForm1.CheckRecord(AField, APrompt, AMask: string): boolean;
 var Box: String;
 begin
	 if Query1.RecordCount < 1 then // Caso não haja registros na tabela, não há o que verificar
		Result := True
	 else begin
		Box := InputBox('Pesquisa do campo ' + AField, APrompt, AMask);
		if (Box = '') or (Box = ' ') then begin // Digitação vazia na caixa de texto do inputbox
			 MessageBox(Self.Handle, 'Campo em branco ou operação cancelada', 'Pesquisa cancelada',
				  MB_OK + MB_ICONWARNING);
			 Result := False;
		end else begin
			 Query1.First;
			 if Query1.Locate(AField, Box, [loCaseInsensitive]) then begin
				MessageBox(Self.Handle, PChar('Registro já cadastrado'), 'Cadastro cancelado', MB_OK + MB_ICONWARNING);
				Result := False;
			 end else
				Result := True;
		end;
	 end;
end;

Esta função tem que ser declarada no bloco private da classe assim:

 

type
	  TForm1 = class(TForm)
	  private
		  function CheckRecord(AField, APrompt, AMask: string): boolean;
	  public

	  end;

No momento em que voce for clicar no botão de inserção ou edição do registro, chame esta função primeiro assim:

 

if CheckRecord('Empresa', 'Digite o nome da Empresa', '') then 
	  IBCliente.Append;

	  // ou no caso do Edit
	  IBCliente.Edit;

Dai por diante, quando voce clica no botão inserir, ali mesmo ele já faz a verificação se o registro já existe, se existir ele aborta a operação de edição ou inserção, se não, ele coloca a tabela no modo chamado (edição ou inserção), evitando-se assim que voce cometa os dois erros, o de duplicação de chave primária e o de ativar primeiro a inserção ou edição para depois fazer pesquisa na tabela.

 

Um abraço

 

Jorge da Silva Abreu

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.