Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas para controlar la duplicidad de registros (https://www.clubdelphi.com/foros/showthread.php?t=80207)

loquillo3 09-09-2012 20:03:20

Problemas para controlar la duplicidad de registros
 
Saludos, he creado este hilo debido a que tengo un pequeño inconveniente para controlar la duplicidad de registros dentro de una misma tabla y a la misma vez en tablas diferentes, he utilizado el siguiente codigo en dos pasos:

PASO 1:

Código SQL [-]
Select * from tbeneficiario2
where cedula2 =: pcedula

Nota: tbeneficiario2 es el nombre de la tabla, Cedula2 es el nombre del campo en la tabla. Pcedula es el parametro que se evaluara con Cedula2.


PASO 2:
Tomando en cuenta que el codigo se encuentra en el evento OnExit del DbEdit (que en este caso es dbCedula2). El Query enn este caso es (qCedula2), ek nombre del DataModulo es DataModule1, el nombre de la tabla es TBeneficiario2, el dbedit1 es el nombre del dbedit que ira el foco una vez haya cancelado la insercion.
Código Delphi [-]
with DataModule1.qCedula2 do
begin
close;
ParamByName(´pCedula´).value:=dbCedula2.text;
Open;
if not IsEmpty then
begin
ShowMessage(´Esta Cedula Existe´);
Datamodule1.tBeneficiario2.cancel;
end
else
Begin
dbedit1.SetFocus;
end;
end;


pero con este codigo no he tenido resultado alguno.

De antemano les agradeceria cualquier sugerencia

ecfisa 09-09-2012 20:57:50

Hola loquillo3.

Si no te interpreté mal, esto tendría que funcionarte:
Código Delphi [-]
procedure TForm1.DBCedula2Exit(Sender: TObject);
begin
  with DataModule1.qCedula2 do
  try
    Close;
    ParamByName('PCEDULA').AsString := DBCedula2.Text;
    Open;
    if not isEmpty then
    begin
      MessageBox(Self.Handle, 'Cédula existente', '', MB_ICONERROR + MB_OK);
      DBEdit1.SetFocus;
      Abort
    end
  finally
    Close
  end;
end;

Saludos.

loquillo3 09-09-2012 21:03:53

Cita:

Empezado por ecfisa (Mensaje 442502)
Hola loquillo3.

Si no te interpreté mal, esto tendría que funcionarte:
Código Delphi [-]
procedure TForm1.DBCedula2Exit(Sender: TObject);
begin
  with DataModule1.qCedula2 do
  try
    Close;
    ParamByName('PCEDULA').AsString := DBCedula2.Text;
    Open;
    if not isEmpty then
    begin
      MessageBox(Self.Handle, 'Cédula existente', '', MB_ICONERROR + MB_OK);
      DBEdit1.SetFocus;
      Abort
    end
  finally
    Close
  end;
end;

Saludos.



ecfisa, unos de los errores me lo da en el ParamByName en cierto modo no me reconoce ese comando, pero intentare con el que me has dado

ecfisa 09-09-2012 21:13:42

Cita:

Empezado por loquillo3 (Mensaje 442504)
ecfisa, unos de los errores me lo da en el ParamByName en cierto modo no me reconoce ese comando, pero intentare con el que me has dado

Hola.

No habías mencionado un problema en la sentencia SQL. Pero si la copiaste textualmente, el error está en que no debe existir espacio entre los dos puntos y el nombre del parámetro:
Código SQL [-]
SELECT * 
FROM TBENEFICIARIO2
WHERE CEDULA2 = :PCEDULA

Saludos.

loquillo3 09-09-2012 21:24:03

Cita:

Empezado por ecfisa (Mensaje 442505)
Hola.

No habías mencionado un problema en la sentencia SQL. Pero si la copiaste textualmente, el error está en que no debe existir espacio entre los dos puntos y el nombre del parámetro.
Saludos.

El espacio lo puse ya que me presentaba una carita

ecfisa 09-09-2012 21:46:22

Cita:

Empezado por loquillo3 (Mensaje 442507)
El espacio lo puse ya que me presentaba una carita

Entiendo.

Bueno entonces quedamos a la espera del resultado de tu prueba...

Saludos.:)

loquillo3 09-09-2012 22:05:02

bien, en el dia de mañana les informare, ya que donde me encuentro no es en mi mi casa ni mi area de trabajo

loquillo3 10-09-2012 18:53:35

he probado con el codigo que me has dado y con otros, y en la mayoria me sale el siguiente error:

Código:

adoquery1: parameter 'pficha_cpu'not found

Código Delphi [-]
adoquery1.sql.text := ' select ficha_cpu from tcpu where ficha_cpu =:laficha';   adoquery1.parameters.ParamByName('laficha ').value := dbedit1.text;
adoquery1.Open;
if not adoquery1.IsEmpty then
begin    ShowMessage('el dni ya existe');
sysutils.Abort;
end;


Código Delphi [-]
with Adoquery1 do
try 
Close;
ParamByName('pficha_cpu').AsString := Dbedit1.Text;
Open;
if not isEmpty then
begin
MessageBox(Self.Handle, 'Cédula existente', '', MB_ICONERROR + MB_OK);
DBEdit1.SetFocus;
Abort;
end
finally
Close;
end;
end;

Código Delphi [-]
with Adoquery1 do
try
Close;
adoquery1.parameters.ParamByName('pficha_cpu').AsString := Dbedit1.Text;
Open;
if not isEmpty then
begin
MessageBox(Self.Handle, 'Cédula existente', '', MB_ICONERROR + MB_OK);
DBEdit1.SetFocus;
Abort;
end
finally
Close;
end;
end;



Código Delphi [-]
With tcpu do
begin
if Locate('ficha_cpu', DBEDIT1.TEXT,[]) then
Begin
application.MessageBox('Este ficha ya fué registrada',' ');
End
else
Begin
Dbedit1.setfocus;
Abort;
end
else
tcpu.Post;
end

camiz 10-09-2012 19:40:47

loquillo3 hecha un vistaso este hilo, no soy experto pero yo tenia un problema parecido al tuyo queria que no se guarden repetidos, echale un vistaso al ultimo mensaje a ver si te sirve de algo.

http://www.clubdelphi.com/foros/showthread.php?t=78546

quizas no sea el codigo mas adecuado pero funciona.

loquillo3 10-09-2012 20:50:29

Cita:

Empezado por camiz (Mensaje 442650)
loquillo3 hecha un vistaso este hilo, no soy experto pero yo tenia un problema parecido al tuyo queria que no se guarden repetidos, echale un vistaso al ultimo mensaje a ver si te sirve de algo.

http://www.clubdelphi.com/foros/showthread.php?t=78546

quizas no sea el codigo mas adecuado pero funciona.



ya habia visto ese hilo y utilize tu codigo:

Código Delphi [-]
procedure TfrmAltaRepuestos.btn_arguardarClick(Sender: TObject); //buscamos y comparamos el codigo del TDBEdit    
if (frmConeccion.Repuesto_vista_02.Locate('CODIGO', txt_arcodigo_repuesto.Text, [])) and (frmConeccion.Repuesto_vista_02CODIGO.Text = txt_arcodigo_repuesto.Text) then
begin
Application.MessageBox('Este código ya existe, debe crear otro para este artìculo.', 'Mensaje', MB_ICONSTOP or MB_OK);   txt_arcodigo_repuesto.SetFocus;
Abort;
end
else
begin
frmConeccion.Repuesto_save2.Post;
end


me puedes explicar en esta parte del codigo

Código:

if (frmConeccion.Repuesto_vista_02.Locate('CODIGO', txt_arcodigo_repuesto.Text, [])) and (frmConeccion.Repuesto_vista_02CODIGO.Text = txt_arcodigo_repuesto.Text) then

camiz 11-09-2012 00:45:13

a ver en mi caso yo utilizo 2 Query, uno para dar de alta los registros (TQury1) y el otro exclusivamente para hacer este tipo de operaciones (TQuery2)
no se como has creado tu base de datos y cual campo es el que quieres comparar. un ejemplo
supongamos mi base es esta Y Pcedula es un campo donde vas a introducir un codigo unico que no se va ha repitir.

Código SQL [-]
CREATE TABLE tbeneficiario2
(
  ID_tbeneficiario2 Integer NOT NULL,
  FECHA Date,
  HORA Time,
  PCEDULA Varchar(15) NOT NULL,
  OTRO_1 Varchar(50),
  OTRO_2 Varchar(50), 
  OTRO_3 Varchar(20),
  PRIMARY KEY (ID_tbeneficiario2)
);



el DBEdit que va ha ir conectado a 'PCedula', es de nombre TEdit1.

Código Delphi [-]
procedure Tform1.Button1Click(Sender: TObject);
//buscamos y comparamos el codigo del TDBEdit
   if (TQuery2.Locate('CODIGO', TEdit1.Text, [])) and (TQuery2PCEDULA.Text = TEdit1.Text) then
    begin
   Application.MessageBox('Este código ya existe, debe crear otro para esta cedula.', 'Mensaje', MB_ICONSTOP or MB_OK);
  txt_arcodigo_repuesto.SetFocus;
  Abort;
   end
      else
   begin
TQuery1.Post;
end



Ten en cuenta que TQuery1 (es el que vamos a dar de alta) y Query2 (es el que vamos a mostrar o cargar los registros ya creados) a mi experiencia
es necesario que utises 2 TQuery para que no te de errores.
el codigo lo que hace es, ubicar en la tabla al registro que contenga los mismos caracteres del edit si es asi lo compara si son iguales
muestra el mensaje y cancela la creacion del registro y si no existe uno igual simplemente crea el registro.
ojo: el TQuery2 tiene que estar activo al momento que vas a ejecutar el codigo, porque es en este en el que vas a buscar y comparar.
Código Delphi [-]
TQuery2.Active := True;
espero averte explicado bien.

loquillo3 11-09-2012 15:36:38

1 Archivos Adjunto(s)
te anexo el formulario porque aun me sigue dando proble

camiz 13-09-2012 04:24:10

he subido al FTP del Club, un ejemplo utilizando TQuery el archivo se llama Controlar_Duplicados.zip
chequealo y adaptalo a tu aplicacion, Suerte.


La franja horaria es GMT +2. Ahora son las 09:00:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi