Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   campos repetidos (https://www.clubdelphi.com/foros/showthread.php?t=20355)

kryna 13-04-2005 16:19:57

campos repetidos
 
Hola

como hago para que cuando voy a insertar un registro..
si el codigo ya esta en la base de datos me emita un mensage "el codigo ya existe"..

Osea como hago la comparacion ente el edit y la tabla...

Neftali [Germán.Estévez] 13-04-2005 16:58:01

Creo que lo más normal sería tener en la Base de Datos un índice único/restricción en ese campo para evitar repetidos y al guardar en la Base de Datos (sea mediante Post o SQL) capturar la posible excepción resultante y devolver un error al usuario.

Lepe 13-04-2005 16:58:16

para qué base de datos? paradox, access
para que gestor ? BDE, ADO ...

Usas Edits o bien DBEdits?

kryna 13-04-2005 17:40:42

la base de datos es paradox y estoy usando dbedit.....

Lepe 13-04-2005 19:06:14

Que ni pintado este hilo , oiga ;)

Un saludo

kryna 13-04-2005 20:12:57

Hola disculpen por no explicarme bien

Lo que sucede es que cuando trato de incluir no me genera ningun error solo me inserta el registro asi tenga yo en mi tabla un registro con los mismos parametros que ese.... y eso lo quiero evitar que en mi tabla no tenga ningun registro repetido.....

Estoy trabajando con delphi 7 y tablas paradox 7 y DBEdit..

Solo quiero que cuando trato de incluir el codigo, chequee en la tabla correspondiente y si el codigo ya existe no me permita incluirlo...

Gracias de ante mano...

vtdeleon 13-04-2005 21:54:02

Saludos.

Usa el Locate:

Código Delphi [-]
if tabla1.locate('campo',edit.text,[]) then
messagebox('Dato ya existente');

Hasta luego

kryna 13-04-2005 22:59:11

Hola!

Probe con la instruccion y cuando trato de incluir un registro aunq no este agregado en la tabla me aparece el mensaje que le codigo ya exite

Código:

if Mitabla.locate('codigo',codigo.Text,[]) then
ShowMessage('EL CODIGO YA EXISTE!!')
else begin
mitabla.insert
mitabla.FieldByName(codigo).AsString := codigo.Text;
.
.
.
mitabla.Post;
mitabla.Next;
mitabla.FlushBuffers;
mitabla.Close;
 
mitabla2.insert
mitabla2.FieldByName(codigo_d).AsString := codigo_d.Text;
.
.
.
mitabla2.Post;
mitabla2.Next;
mitabla2.FlushBuffers;
mitabla2.Close;
end;

como puedo resolverlo?

vtdeleon 14-04-2005 00:06:04

Saludos.

Supongo que Codigo.text es un Dbedit.

Prueba usando un Edit.

Hasta luego

Lepe 14-04-2005 10:02:52

Ponle un índice único, y por tanto mantenido a ese campo en el database Desktop.

Desde el evento OnPost error, llamas a midberror y listo. Quizás necesites añadirle que ese campo es requerido y no pueda ser nulo.

Haciendo esto, te olvidas de ver si existe el código, y le dejas el proceso al BDE y a la función midberror.

El hecho que comentas es bastante extraño, revisa con el database desktop, que valores hay ya en la base de datos.

Al parecer el código está formado por letras, ¿mayúsculas/ minúsculas? para este engorro puedes cambiarle las propiedades al DBEdit, para que solo acepte mayúsculas o minúsculas.

Lo del Flushbuffers, es mejor que lo pongas en el evento AfterPost de la tabla, así cuando llames al método Post, automáticamente se vacian los buffers.

No entiendo por qué llamas a Next despues de hacer el Post, supongo que tendrás algo en los eventos AfterScroll de la tabla... pero no puedo adivinar más..., en principio, el Next sobra.

La tabla2 depende de alguna forma con la tabla 1?? igual te dice que el codigo ya existe por otra causa.

Creo que deberías decir qué estas haciendo, factura, albaran, clientes....

Un saludo

kryna 14-04-2005 14:30:11

Hola !!!

Como hago esto??

Cita:

Ponle un índice único, y por tanto mantenido a ese campo en el database Desktop.

Desde el evento OnPost error, llamas a midberror y listo. Quizás necesites añadirle que ese campo es requerido y no pueda ser nulo.

Haciendo esto, te olvidas de ver si existe el código, y le dejas el proceso al BDE y a la función midberror.
Ademas ya revise la base de datos y tiene registros pero los que estoy tratando de incluir no.. de echo borre los datos (solo deje uno) y al tratar de agregar otro registro me aparece el comentario..
Y si la tabla2 y la tabla1 tiene un campo en comun codigo??

Lepe 14-04-2005 16:09:52

-Abres el Database desktop, abres la tabla en cuestion
-Menú Table --> Reestructure
-En la ventana que se abre, en el unico combobox que hay, eliges Secondary Index.
- Pulsa abajo el boton Define...
- elige el campo de fechas y pasalo a la lista de la derecha, usando el boton con dibujito de flechas
- Abajo marca las casillas Unique y Maintained
- Acepta la pantalla, te pedirá el nombre que le quieres dar a es indice que estas creando, yo suelo darle un nombre asi: idxCodigoAsc, de esta forma, todos mis indices tienen la forma: 'idx' + Nombre del campo + Ascendente o descendente
- Acepta todas las pantallas y cierra el database desktop

En delphi, dale un clic a tu tabla, en el Inspector de objetos, dale un doble clic al evento OnPostError y dentro de ese evento escribe:

midbError(dataset, E)

saludos

kryna 14-04-2005 17:35:18

gracias voy ha probarlo!!


sin embargo lo hice de la siguiente manera y me funciona bien..

Código:


if  codigo <> nil then
        qry1.Close;
        qry1.ParamByName('codigo').AsInteger := StrToInt(codigo.text);
        data1.dataset := qry1;
        qry1.open;

          if qrybus.EOF then
          begin
                          // aqui inserto
          end else
ShowMessage('EL CODIGO YA EXISTE!!');

Sin embargo ahora tengo otro problemilla.... cuando modifica en vez de sobre escribirme en el registro activo lo que me hace es que me agrega otro registro a mi tabla..

yo lo hago de sta forma

Código:

MessageDlg('ESTA SEGURO Q DESEA MODIFICAR ESTE REGISTRO???', mtCONFIRMATION, [mbOk], 0)
Tb1.Edit;
Tb1.FieldByName('especialidad').AsString := edit1.text;
Tb1.FieldByName('codigo).AsString := edit2.text;
Tb1.Post;
Tb1.Next;
Tb1.FlushBuffers;
Tb1.Close;
 
Tb2.Edit;
Tb2.FieldByName('especialidad').AsString := edit1.text;
Tb2.FieldByName('descripcion').AsString := edit3.text;
Tb2.post;
Tb2.Next;
Tb2.FlushBuffers;
Tb2.Close;
 
ShowMessage('EL REGISTRO FUE MODIFICADO CON EXITO!!');
end;

Donde tengo el error


La franja horaria es GMT +2. Ahora son las 04:23:13.

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