Fórum Verificando se o registro já existe #373831

20/08/2009

0

Amigos,

Utilizando SqlDataSet, DataSetProvider eClientDataSet, qual a melhor forma de verificar no momento da inclusão ou alteração se o registro já existe?

Estou utilizando mais um SqlDataSet no Form com o select e no momento de gravar veririfico SqlDataSet.IsEmpty.

Está correto?
Obrigado


Lenasi

Lenasi

Responder

Posts

20/08/2009

Osocram

Amigo...
Não entendi bem a sua dúvida.
Alteração - obrigatoriamente o resigistro tem q existir.
Inclusão - So vai existir o registro que vc esta incluindo se repetir a PK, geralmente se usa um Generator, AutoInc ou um Tabela Auxiliar. Para ter esse controle.

Agora fica algumas duvidas como vc esta incluindo isso?
É usando componente DBWare (dbedit e tal) ou vc esta gerando um script de insert?

Amigos, Utilizando SqlDataSet, DataSetProvider eClientDataSet, qual a melhor forma de verificar no momento da inclusão ou alteração se o registro já existe? Estou utilizando mais um SqlDataSet no Form com o select e no momento de gravar veririfico SqlDataSet.IsEmpty. Está correto? Obrigado



Responder

Gostei + 0

20/08/2009

Lenasi

Bem amigo,

esqueci desse detalhe.
No banco utilizo o PK, isso já quer dizer que não pode repetir ok?

Como faço a verificação via código?


Responder

Gostei + 0

20/08/2009

Osocram

O melhor é vc dar um exemplo de como vc usa ae.

Por exemplo Tabela de produto
id_produto (pk)
ds_produto

como é q vc gera o codigo do id_produto?
Ou é o usuário que digita?

Bem amigo, esqueci desse detalhe. No banco utilizo o PK, isso já quer dizer que não pode repetir ok? Como faço a verificação via código?



Responder

Gostei + 0

20/08/2009

Discorpio

Bom dia a todos.

A razão do nosso amigo é muito simples, ele quer evitar a duplicidade de registro no banco.

É tão simples que é rápido e rasteiro.

A melhor forma de se fazer isso é criar uma função booleana que retorne True, se o registro existir e False, se não existir.

Mas o por que de se criar a função :?:

Isto se faz necessário, porque voce tem que fazer a pesquisa antes de acionar o método Insert ou Append do componente TSQLDataSet, visto que ao se fazer a pesquisa, a tabela não pode estar aberta em modo de inserção porque haverá um scroll na tabela (movimentação de registros).

Vamos a função:

  function TForm1.SearchRecord(AField): boolean;
  var Box, Sql: string;
  begin
     Result := False;
     Box := InputBox(´Pesquisando ´+AField,´Digite um valor para ´+AField);
     if Box  = ´´ then
         ShowMessage(´Campo em branco ou operação cancelada´);
     else 
         with SQLDataSet1 do begin
            Sql := ´Select * From tabela Where ´ + AField;
            Sql := Sql + ´ = :Param´;
            Close;
            CommandText := Sql; 
            ParamByName(´Param´).Value := Box;
            Open;
            if Eof then
               ShowMessage(´Registro não encontrado´);
            else 
               Result := True;
         end;
end;


No botão Inserir, voce pode invocar a função dessa forma.

 procedure TForm1.btnIncluirClick(Sender: TObject);
 begin
     if not SearchRecord(´NomedoCliente´) then
        ClientDataSet1.Append;
 end;


Não se esqueça de declarar a função no bloco Público ou Private da classe do Form, assim:

public
    { Public declarations }
    function SearchRecord(AField): Boolean;  
end;


Lembrando também que com o DBExpress, voce deve fazer pesquisa com os componentes Unidirecionais tais como TSQLDataSet e TSQLQuery.
É recomendável até que voce coloque no um TSQLQuery somente para fazer isso (Pesquisa) e substitua o TSQLDataSet por ele na função.

Enquanto que as inserções, deleções e atualizações deverão ser sempre feitas pelo TClientDataSet.


Responder

Gostei + 0

20/08/2009

Discorpio

Olá, sou eu de novo.

Esqueci de incluir uma mensagem de registro encontrado na função:

function TForm1.SearchRecord(AField): boolean; 
  var Box, Sql: string; 
  begin 
     Result := False; 
     Box := InputBox(´Pesquisando ´+AField,´Digite um valor para ´+AField); 
     if Box  = ´´ then 
         ShowMessage(´Campo em branco ou operação cancelada´); 
     else 
         with SQLDataSet1 do begin 
            Sql := ´Select * From tabela Where ´ + AField; 
            Sql := Sql + ´ = :Param´; 
            Close; 
            CommandText := Sql; 
            ParamByName(´Param´).Value := Box; 
            Open; 
            if Eof then 
               ShowMessage(´Registro não encontrado, pode inserir´); 
            else begin
               ShowMessage(´Esse registro já existe´);
               Result := True; 
         end; 
end; 



Responder

Gostei + 0

20/08/2009

Lenasi

É isso mesmo que precisava.... Vou testar depois respondo se deu certo...
Obrigado a todos por enquanto....


Responder

Gostei + 0

20/08/2009

Lenasi

Bom dia a todos. Lembrando também que com o DBExpress, voce deve fazer pesquisa com os componentes Unidirecionais tais como TSQLDataSet e TSQLQuery. É recomendável até que voce coloque no um TSQLQuery somente para fazer isso (Pesquisa) e substitua o TSQLDataSet por ele na função.


Ok, posso utilizar então o TSQLQuery com toda segurança?

Quando utilizaria então o TSQLDataSet?

Ao adicionar o Componente TSQLQuery, não preciso mexer nas Propriedades SQL e PARAMS, exceto o Name é claro???


Obrigado.


Responder

Gostei + 0

20/08/2009

Lenasi

Amigo, no seu exemplo é para um campo apenas, ok?

No meu caso, preciso verificar se 4 tipos de informações já estão cadastradas....


Responder

Gostei + 0

20/08/2009

Discorpio

Ok, posso utilizar então o TSQLQuery com toda segurança? Quando utilizaria então o TSQLDataSet? Ao adicionar o Componente TSQLQuery, não preciso mexer nas Propriedades SQL e PARAMS, exceto o Name é claro??? Obrigado.


É exatamente isso, o TSQLQuery, voce que que usar as linhas de comando´, assim:

   ...
   SQLQuery1.SQL.Clear;
   SQLQuery1.SQL.Add(´Select * From.........´);
   .....


Quanto o ParamByName ele pode continuar da mesma forma, pois ele existe de dois modos, assim:

   SQLQuery1.ParamByName(...)
   SQLQuery1.Params.ParamByName(....)



Responder

Gostei + 0

20/08/2009

Discorpio

Amigo, no seu exemplo é para um campo apenas, ok? No meu caso, preciso verificar se 4 tipos de informações já estão cadastradas....


Voce quer dizer pesquisar 04 campos ao mesmo tempo, é isso :?:


Responder

Gostei + 0

20/08/2009

Lenasi

[quote:f246e6e2ad=´lenasi´] Voce quer dizer pesquisar 04 campos ao mesmo tempo, é isso :?:


Isso amigo...
Até consegui de uma outra forma que tinha como exemplo:
Veja:

if Ds.DataSet.State = dsInsert then
SqModeloPesquisa.Close;
    SqModeloPesquisa.ParamByName(´PNMO_DESCRICAO´).AsString := DbEdDecricaoModelo.Text;
    SqModeloPesquisa.ParamByName(´PNMO_LINHA´).AsString     := DBRadioModLinha.Value;
    SqModeloPesquisa.ParamByName(´PNMO_APLICACAO´).AsString := DBRadioModAplica.Value;
    SqModeloPesquisa.ParamByName(´PNFB_ID´).AsString        := DbEdFabricaID.Text;
    SqModeloPesquisa.Open;
    IF not SqModeloPesquisa.IsEmpty Then
      Begin
        MessageDlg(´Registro já cadastrado !!!´,mtError,[mbok],0);
        SQModeloPesquisa.Close;
        Abort;
      End;
    SQModeloPesquisa.Close;

  inherited;


Mas estou tentando fazer o seguinte:
Isto funciona tanto na inclusão quanto na exclusão, e na verdade na Exclusão não poderia, ok?

Utilizei o comando (if Ds.DataSet.State = dsInsert then), mesmo quando estou no editando ele entra nesta função, e claro, dá que já existe!!!

O que pode ser neste caso?


Responder

Gostei + 0

20/08/2009

Lenasi

[quote=´Discorpio´][quote:8f47eaf3c1=´lenasi´] Mas estou tentando fazer o seguinte: Isto funciona tanto na inclusão quanto na exclusão, e na verdade na Exclusão não poderia, ok?


RETIFICANDO: ALTERAÇÃO AO INVÉS DE EXCLUSÃO!!!


Responder

Gostei + 0

20/08/2009

Lenasi

Resolvido :

Ficou assim:

  if TClientDataSet(Ds.DataSet).State = dsInsert then
    Begin
      SqModeloPesquisa.Close;
      SqModeloPesquisa.ParamByName(´PNMO_DESCRICAO´).AsString := DbEdDecricaoModelo.Text;
      SqModeloPesquisa.ParamByName(´PNMO_LINHA´).AsString     := DBRadioModLinha.Value;
      SqModeloPesquisa.ParamByName(´PNMO_APLICACAO´).AsString := DBRadioModAplica.Value;
      SqModeloPesquisa.ParamByName(´PNFB_ID´).AsString        := DbEdFabricaID.Text;
      SqModeloPesquisa.Open;
      IF not SqModeloPesquisa.IsEmpty Then
        Begin
          MessageDlg(´Registro já cadastrado !!!´,mtError,[mbok],0);
          SQModeloPesquisa.Close;
          Abort;
        End;
      SQModeloPesquisa.Close;
    End;


Obrigadão à todos valeu mesmo !!!


Responder

Gostei + 0

20/08/2009

Discorpio

Boa tarde a todos.

Lenasi

Voce está esquecendo de um pequeno detalhe, lembra do que eu disse lá atrás no meu post :?:

......visto que ao se fazer a pesquisa, a tabela não pode estar aberta em modo de inserção porque haverá um scroll na tabela (movimentação de registros).


Sob hipótese nenhuma, voce deve invocar os métodos Append e Insert antes de fazer a pesquisa do registro.

Mas por que :?:

Por uma razão muito, simples, quando voce aciona Append ou Insert, o TClientDataSet, abre a tabela no DataSet Local, criando uma estrutura de registro em branco dentro da mesma, esperando que o usuário envie os registros para lá através do método Post. Ai eu te pergunto: O que vai acontecer se voce acionar uma pesquisa com SQL por exemplo :?: E aquela estrutura de linha de registro em branco, como ele ficou :?: Simplesmente ela não ficou, a linha em branco foi discartada, apesar de voce talvez, eu disse talvez de conseguir fazer a pesquisa, mas o Append ou Insert, como ficou :?:

Fazendo isso voce pode até corromper o índice do meio ou de final de tabela.

Como assim do meio ou do final ? Ai que entra as diferenças entre Append e Insert. O Insert abre uma linha em branco de onde estiver posicionado o ponteiro de registro, se estiver posicionado no ponteiro de número 25, por exemplo, ele abre a linha em branco posiconando o número 25 para baixo, passando esse ser o número 26. Já o Append acrescenta a linha em branco no final da tabela.

Por isso é fiz aquela função para que a mesma realize a pesquisa antes do Append ou Insert, se o registro for encontrado, eles não são acionados


Responder

Gostei + 0

20/08/2009

Lenasi

Boa tarde a todos. Lenasi Voce está esquecendo de um pequeno detalhe, lembra do que eu disse lá atrás no meu post :?: [quote:55d2510e4c=´discorpio´] ......visto que ao se fazer a pesquisa, a tabela não pode estar aberta em modo de inserção porque haverá um scroll na tabela (movimentação de registros).


Sob hipótese nenhuma, voce deve invocar os métodos Append e Insert antes de fazer a pesquisa do registro.

Mas por que :?:

Por uma razão muito, simples, quando voce aciona Append ou Insert, o TClientDataSet, abre a tabela no DataSet Local, criando uma estrutura de registro em branco dentro da mesma, esperando que o usuário envie os registros para lá através do método Post. Ai eu te pergunto: O que vai acontecer se voce acionar uma pesquisa com SQL por exemplo :?: E aquela estrutura de linha de registro em branco, como ele ficou :?: Simplesmente ela não ficou, a linha em branco foi discartada, apesar de voce talvez, eu disse talvez de conseguir fazer a pesquisa, mas o Append ou Insert, como ficou :?:

Fazendo isso voce pode até corromper o índice do meio ou de final de tabela.

Como assim do meio ou do final ? Ai que entra as diferenças entre Append e Insert. O Insert abre uma linha em branco de onde estiver posicionado o ponteiro de registro, se estiver posicionado no ponteiro de número 25, por exemplo, ele abre a linha em branco posiconando o número 25 para baixo, passando esse ser o número 26. Já o Append acrescenta a linha em branco no final da tabela.

Por isso é fiz aquela função para que a mesma realize a pesquisa antes do Append ou Insert, se o registro for encontrado, eles não são acionados[/quote:55d2510e4c]

Caro amigo,
estou meio confuso....
Deixa tentar entender:

O que eu fiz, foi dar um select(dentro do TSQLQuery) para buscar registros já cadastrados, e não uma pesquisa (ou é a mesma coisa?), enfim, o comando que passei, só executo quando vou gravar....

Mas me diz uma coisa: Como vou saber se já existe uma cadastrado ou não, se não houver primeiro uma tentativa de inclusão ou alteraração????


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar