Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-05-2016
ermac ermac is offline
Miembro
NULL
 
Registrado: jun 2015
Posts: 10
Poder: 0
ermac Va por buen camino
Question 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'.
Responder Con Cita
  #2  
Antiguo 01-05-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
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?
Responder Con Cita
  #3  
Antiguo 01-05-2016
ermac ermac is offline
Miembro
NULL
 
Registrado: jun 2015
Posts: 10
Poder: 0
ermac Va por buen camino
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)
Responder Con Cita
  #4  
Antiguo 01-05-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Como escribiste el metodo locate? En donde lo pusiste? Que componentes de acceso a datos estas usando?
Responder Con Cita
  #5  
Antiguo 01-05-2016
ermac ermac is offline
Miembro
NULL
 
Registrado: jun 2015
Posts: 10
Poder: 0
ermac Va por buen camino
Cita:
Empezado por AgustinOrtu Ver Mensaje
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"
Responder Con Cita
  #6  
Antiguo 02-05-2016
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 02-05-2016
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #8  
Antiguo 03-05-2016
ermac ermac is offline
Miembro
NULL
 
Registrado: jun 2015
Posts: 10
Poder: 0
ermac Va por buen camino
Cita:
Empezado por jafera Ver Mensaje
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
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Evitar cierre del formulario. Tonio Varios 3 17-09-2005 00:47:39
Evitar que se cierre conexion Ftp D@byt Internet 2 07-06-2005 21:59:05
Como evitar que el usuario cierre la form! Waldo API de Windows 2 20-11-2003 19:46:47
Como presento una vez un dato repetido en Rave o Qreport lanysoft Impresión 2 12-05-2003 16:59:56
Evitar introducir caracteres en un campo numérico de un TRxdbGrid setry2 OOP 2 07-05-2003 13:07:32


La franja horaria es GMT +2. Ahora son las 20:57:36.


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
Copyright 1996-2007 Club Delphi