Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Evitar que se cierre la aplicación al introducir un dato repetido (https://www.clubdelphi.com/foros/showthread.php?t=90241)

ermac 01-05-2016 17:52:30

Evitar que se cierre la aplicación al introducir un dato repetido
 
Buenas tardes, tengo una pregunta..
Estoy usando delphi y sql para crear una aplicación en la cual tengo dos tablas (una de instituciones y otra de alumnos), relacionadas con FK.
Con delphi estoy usando un dbnavigator para poder agregar,editar,eliminar y moverme, despues todos los datos los muestros en un dbgrid.
Ahora mi problema surge en un solo campo.. cuando quiero agregar por ejemplo un dni (en la tabla de sql aclare que es unique) en la tabla de alumnos y ese dni existe se me cierra el programa, trate de usar "dbgrid1.datasource.setdata.locate" pero no tuve resultados..
queria saber como podria hacer el control (en codigo delphi) para que cuando ingrese un dato repetido no se cierre la aplicacion y me muestre un showmessage por ejemplo que diga 'Ese dni ya existe'.

AgustinOrtu 01-05-2016 18:46:16

Es la primera vez que escucho que se cierra el programa.

Lo mas probable que tengas es una excepcion

Estas seguro de que el problema es el dni duplicado?

Como escribiste el locate que te dio problemas? De que tipo es el campo dni?

ermac 01-05-2016 19:20:44

Dni es de tipo int not null unique.. y saque el locate porque no me funcionaba, el error que me tira es el siguiente:

s2.subirimagenes.com /otros/previo/thump_9574199error.jpg

(entre com y la / hay un espacio xq no me deja subir enlaces ni imagenes el foro)

AgustinOrtu 01-05-2016 19:52:06

Como escribiste el metodo locate? En donde lo pusiste? Que componentes de acceso a datos estas usando?

ermac 01-05-2016 20:01:45

Cita:

Empezado por AgustinOrtu (Mensaje 504839)
Como escribiste el metodo locate? En donde lo pusiste? Que componentes de acceso a datos estas usando?

el metodo de locate lo borre asi que no tengo ningun control ahora.

Los componentes de datos que uso son:
Adoconnection, adotable, dbgrid y para agregar,modificar,etc uso el dbnavigator..

cree 3 botones nuevos para que quede mas claro que hace cada uno y puse el dbnavigator como invisible, y los botones son agregar, guardar, eliminar y cada boton solo tiene asignado "Dbnavigator1.BtnClick(Nbinsert);" (nbedit,nbpost y nbdelete)

lo que me faltaria saber es como tendria que ser el control y si me conviene ponerlo en el guardar para verificar que "X" dni no existe y si existe que me muestre un cartel diciendo "tal dni ya existe"

jafera 02-05-2016 10:58:17

Buenas.

Yo no utilizo SQL, utilizo Firebird e IBX, pero imagino que lo podras adaptar, yo hago la consulta dentro del DataModule lanzando una query accesoria en el OnChange del campo a comprobar.

Código Delphi [-]
procedure TF_ModulDades.CamionsMATRICULAChange(Sender: TField);
var
        Matri: string;
begin
        if F_ModulDades.CamionsMATRICULA.Value <> '' then
        begin
                Camio_Ex.Close;
                Camio_Ex.ParamByName('MATRICULA').AsString := F_Camions.DBEdit3.Text;             
                Camio_Ex.Open;
                Matri := F_Camions.DBEdit3.Text;
                if Camio_Ex.RecordCount > 0 then
                begin
                        Showmessage('Camió existent a la base');
                        Camions.Cancel;
                        F_Camions.ToolBar2.Visible := False;
                        F_Camions.ToolBar1.Visible := True;
                        F_Camions.DBEdit1.Enabled := True;
                        if Camio_Ex.ParamByName('MATRICULA').AsString = Matri then
                        begin
                                Camions.Locate('MATRICULA', Matri, []);
                        end;                    
                end;
        end;
end;

Consulta accesoria

Código SQL [-]
SELECT * FROM BOM0001
WHERE MATRICULA=:MATRICULA

Espero te ayude

Saludos

roman 02-05-2016 16:26:00

Yo diría que en términos generales hay dos maneras de lidiar con claves repetidas: prevención y atención. Prevención es la que intentaste primero y la que te expone jafera. Creo yo que si esa forma es la que deseas, es la que deberías seguir en lugar de simplemente decir "no me funcionó". Pon el código que tenías y ta podremos ayudar en ver porqué no te funciona.

De todas formas, no está de más conocer la segunda forma tratar las claves repetidas: atención. Los componentes DataSet (como el ADOTable) tienen el evento OnPostError que se lanza cuando la modificacíon o inserción de un registro produce un error en la base de datos. En ese evento tú decides qué hacer: corregir y reintentar o simplemente dar un aviso al usuario.

LineComment Saludos

ermac 03-05-2016 04:44:23

Cita:

Empezado por jafera (Mensaje 504858)
Buenas.

Yo no utilizo SQL, utilizo Firebird e IBX, pero imagino que lo podras adaptar, yo hago la consulta dentro del DataModule lanzando una query accesoria en el OnChange del campo a comprobar.

Código Delphi [-]
procedure TF_ModulDades.CamionsMATRICULAChange(Sender: TField);
var
        Matri: string;
begin
        if F_ModulDades.CamionsMATRICULA.Value <> '' then
        begin
                Camio_Ex.Close;
                Camio_Ex.ParamByName('MATRICULA').AsString := F_Camions.DBEdit3.Text;             
                Camio_Ex.Open;
                Matri := F_Camions.DBEdit3.Text;
                if Camio_Ex.RecordCount > 0 then
                begin
                        Showmessage('Camió existent a la base');
                        Camions.Cancel;
                        F_Camions.ToolBar2.Visible := False;
                        F_Camions.ToolBar1.Visible := True;
                        F_Camions.DBEdit1.Enabled := True;
                        if Camio_Ex.ParamByName('MATRICULA').AsString = Matri then
                        begin
                                Camions.Locate('MATRICULA', Matri, []);
                        end;                    
                end;
        end;
end;

Consulta accesoria

Código SQL [-]
SELECT * FROM BOM0001
WHERE MATRICULA=:MATRICULA

Espero te ayude

Saludos


Gracias con este lo pude solucionar y ya funciona


La franja horaria es GMT +2. Ahora son las 17:49:02.

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