PDA

Ver la Versión Completa : Problema con insercion, edicion y delete en catalogo y Trigger


LuNaTk
26-03-2010, 20:54:43
Hola:

Les planteo mi problema, estoy manejando un catalogo para el cual he definido triggers de insercion, edicion y delete, el problema es que al hacer cualquiera de estas modificaciones en el catalogo delphi me manda el siguiente error:

'Informacion de columna de clave insuficiente o incorrecta'
'Demasiadas filas afectadas por la actualizacion'

El catalogo sin trigger funciona adecuadamente, manejo una llave primaria del tipo identity, el problema a mi punto de vista es que al existir el trigger que modifica, edita y elimina varios registros de otra tabla, delphi detecta que hay mas de una sola modificacion lanzando ese error.

Estoy usando arquitectura 3 capas; Mi cliente se conecta a un DataSetProvider ligado a un respectivo DataSet.

Entre las opciones del DSP, esta habilitado la opcion de permitir actualizaciones en cascada, al igual que deletes en cascada.

Una manita porfavor, que me falta configurar???

Caral
27-03-2010, 17:44:05
Hola
Habria que ver las sentencias sql que usas para hacer estos cambios.
Si no se hacen especificas por el campo determinado el error esta en que no puede encontrar el dato correcto.
Esto suele pasar por varios motivos.
sql no adecuado.
no hay un campo determinado
No se usa where (donde) en el sql.
No se recorre la tabla.
Bueno esas son las razones que me acuerdo.
Saludos

LuNaTk
29-03-2010, 19:08:18
Hola caral, te cuento que el detalle esta en los triggers, ya que si los quito, el catalogo opera adecuadamente.

EL funcionamiento del catalogo es en base a las instrucciones Dataset.edit, Dataset.insert, Dataset.post, Dataset.delete. Sin los triggers el catalogo opera correctamente, pero al añadirle los triggers al catalogo me arroja el error que mencione anteriormente.

La forma en la que ahora lo he hecho funcionar es mediante un query, donde determino las modificaciones mediante codigo sql: 'insert into...', 'update ...', 'delete from...' de esta manera no tengo ningun tipo de error y el funcionamiento con los triggers es como yo lo necesito.

La pregunta es... no se pueden manejar triggers directamente en una tabla cuando se delega al Dataset la operacion de insercion, edicion, y eliminacion de registros????

Caral
30-03-2010, 01:12:45
Hola
La verdad, No lo se, no se manejar a los gatitos.
Esperemos a alguien que sepa.
Contesto para poner el hilo arriba y que alguien mas te ayude.
Saludos

Casimiro Notevi
30-03-2010, 01:35:15
Y qué tal si pones el código? :)

LuNaTk
30-03-2010, 03:07:05
Los eventos los tengo programados en botones:

CDSC_Nivel.Insert;
CDSC_Nivel.Delete;
CDSC_Estado.Edit;
CDSC_Estado.Post;

Y en los eventos del ClientDataSet :

procedure TFC_Estado.CDSC_EstadoAfterDelete(DataSet: TDataSet);
begin
CDSC_Estado.ApplyUpdates(0);
end;

procedure TFC_Estado.CDSC_EstadoAfterPost(DataSet: TDataSet);
begin
CDSC_Estado.ApplyUpdates(0);
CDSC_Estado.Refresh;
end;

procedure TFC_Estado.CDSC_EstadoReconcileError(DataSet: TCustomClientDataSet;
E: EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction);
begin
case UpdateKind of
ukModify:
begin
//ShowMessage(E.message);
Application.MessageBox('Error al Modificar el Registro','Error', MB_ICONERROR);
Action := raCancel;
end;
ukInsert:
begin
//ShowMessage(E.message);
Application.MessageBox('Error al Guardar el Registro','Error', MB_ICONERROR);
Action := raCancel;
end;
ukDelete:
begin
//ShowMessage(E.message);
Application.MessageBox('Error al Eliminar el Registro','Error', MB_ICONERROR);
Action := raCancel;
end;
end;
end;

El problema no creo que sea esta parte, ya que sin el trigger en la tabla, funciona adecuadamente. Pero al agregar el trigger, me devuelve el error y no me actualiza la tabla.

Este es el código de los triggers

Un trigger de insercion que lo unico que hace es agregar registros a otra tabla.

alter trigger tg_i_permiso_nivel
on
c_nivel
after insert
as
--Al insertar un nuevo nivel de usuario se inserta la lista de formas en el proyecto delphi
--Por default todos los permisos estan desactivados y habra que ir activandolos uno a uno.
insert into nivel_permiso
select (select niv_id from inserted),
cfo_id,
cat_id,
0,
0,
0,
0,
0
from c_forma
insert into cat_permiso
select (select niv_id from inserted),
cat_id,
0
from c_categoria


Y un trigger mas que elimina los registros insertados por el trigger anterior al eliminar el registro de la tabla.

create trigger tg_d_categoria_forma
on c_nivel
INSTEAD OF delete
as
if not exists(select niv_id from control where niv_id=(select niv_id from deleted))
begin
delete from cat_permiso where niv_id=(select niv_id from deleted)
delete from nivel_permiso where niv_id=(select niv_id from deleted)
delete from c_nivel where niv_id=(select niv_id from deleted)
end
else
raiserror('No se puede eliminar el nivel de usuario porque esta actualmente asignado',16,1)

LuNaTk
25-04-2010, 04:22:43
Ya lo resolvi.

Puse la pripiedad ResolveToDataset a false en el DataSetProvider.

Tan fácil como eso.

Lamento la pérdida de tiempo.