Fórum Verificando se o registro já existe #373831
20/08/2009
0
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
Curtir tópico
+ 0Posts
20/08/2009
Osocram
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?
Gostei + 0
20/08/2009
Lenasi
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?
Gostei + 0
20/08/2009
Osocram
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?
Gostei + 0
20/08/2009
Discorpio
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.
Gostei + 0
20/08/2009
Discorpio
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;
Gostei + 0
20/08/2009
Lenasi
Obrigado a todos por enquanto....
Gostei + 0
20/08/2009
Lenasi
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.
Gostei + 0
20/08/2009
Lenasi
No meu caso, preciso verificar se 4 tipos de informações já estão cadastradas....
Gostei + 0
20/08/2009
Discorpio
É 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(....)
Gostei + 0
20/08/2009
Discorpio
Voce quer dizer pesquisar 04 campos ao mesmo tempo, é isso :?:
Gostei + 0
20/08/2009
Lenasi
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?
Gostei + 0
20/08/2009
Lenasi
RETIFICANDO: ALTERAÇÃO AO INVÉS DE EXCLUSÃO!!!
Gostei + 0
20/08/2009
Lenasi
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 !!!
Gostei + 0
20/08/2009
Discorpio
Lenasi
Voce está esquecendo de um pequeno detalhe, lembra do que eu disse lá atrás no meu post :?:
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
Gostei + 0
20/08/2009
Lenasi
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????
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)