Dunhasss 0 Denunciar post Postado Maio 31, 2008 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
Discorpio 1 Denunciar post Postado Maio 31, 2008 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
Dunhasss 0 Denunciar post Postado Maio 31, 2008 VLW!!! funcionou certin!!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif abraços.... Compartilhar este post Link para o post Compartilhar em outros sites