![]() |
para no dejar duplicar registros en InterBase
Hola a todos,
Con interbase7 y delphi 6. Tengo una ventana en mi aplicación que me sirve para agregar registros a una tabla. Esta tabla de interbase, tiene dos campos que son NO NULL y que juntos, son mi manera de direfenciar los registros de esa tabla. Tengo un TDBNavigator para insertar, editar y gestionar en general esta tabla tbMaterial1. El caso es que necesito poner una condición para que, si intenta alguien insertar un registro que ya esté, me muestre un mensaje de error, y no me deje guardar, me cancele la inserción. El código que tengo es el siguiente: procedure TFrmChangeMaterial.DBNavigator1BeforeAction(Sender: TObject; Button: TNavigateBtn); begin If (FrmMainCenta.TbMaterial1.State = dsEdit) Or (FrmMainCenta.TbMaterial1.State = dsInsert) Then Begin //si ya hay un material en la tabla material con los datos que estamos insertando nuevo IF FrmMainCenta.TbMaterial.Locate ('ISBN;Copia', VarArrayOf([FrmMainCenta.TbMaterial1ISBN.AsVariant, FrmMainCenta.TbMaterial1Copia.AsVariant]), [locaseInsensitive]) THEN BEGIN //If (FrmMainCenta.TbMaterial1.State = dsEdit) Or (FrmMainCenta.TbMaterial1.State = dsInsert) Then Begin //mostramos mensaje aviso showmessage ('¡¡CUIDADO!! El ISBN y COPIA insertados están asignados a otro material de la biblioteca. Su Operación no se puede llevar a cabo'); FrmMainCenta.IBTransCenta.Rollback; END; End; end; Donde TbMaterial1 y Tbmaterial funcionan como tablas independientes. Me funciona, aparentemente todo bien hasta que muestra el mensaje, pero si después del mensaje pongo : FrmMainCenta.IBTransCenta.Rollback; me dice que la tabla tbMaterial1 no esta en "edit o insert mode" Si pongo DBNavigator1.BtnClick(nbCancel); directamente no hace nada, me da el mismo error que cuando no le pongo código para controlar esto.:confused: ¿puede ayudarme alguien? gracias Virginia |
Hola,
¿y por qué no dejar que el servidor envíe el error de clave duplicada (si esos dos campos te sirven para diferenciar los registros de la tabla deben, o deberían ser clave principal de la misma), capturando la excepción en la aplicación Delphi?. Creo que es mucho más sencillo y más rápido que tener un segundo DataSet para lanzar un Locate que busque una posible clave duplicada. Saludos. |
¿y como lo hago? porque, si dejo que salga el error este de, "duplicando registro", se me queda la aplicación colgadilla.:(
gracias por todo Virginia |
Hola,
con try ... except. Ejemplo ... Código:
try |
hola Kinobi
una duda. las exception declaradas en la Base de datos se puede utilizar en el Ejemplo. que pones. un ejemplo declaro una exception en la base de datos llamada ART_NO_CODIGO con un texto 'NO HA INDICADO EL CODIGO DEL ARTICULO' y despues creo un Trigger tipo Before Insert en la tabla de Articulos llamada.ARTICULOS_BI0 begin if (new.codigo = "") then exception art_no_codigo; end la exception art_no_codigo se puede usar en try ... except. try MiDataset.Post; except on E:EIBError do begin if E.IBError.Code =art_no_codigo then ... ShowMessage('Clave duplicada ...'); ... end; Else Raise; end; |
Hola,
Cita:
Por cierto, el código que puse anteriormente tiene un error. El código correcto es ... Código:
try Código:
try |
La franja horaria es GMT +2. Ahora son las 12:55:39. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi