Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Problema con insercion, edicion y delete en catalogo y Trigger (https://www.clubdelphi.com/foros/showthread.php?t=67074)

LuNaTk 26-03-2010 20:54:43

Problema con insercion, edicion y delete en catalogo y Trigger
 
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:

Código Delphi [-]
CDSC_Nivel.Insert;
Código Delphi [-]
CDSC_Nivel.Delete;
Código Delphi [-]
CDSC_Estado.Edit;
Código Delphi [-]
CDSC_Estado.Post;

Y en los eventos del ClientDataSet :

Código Delphi [-]
procedure TFC_Estado.CDSC_EstadoAfterDelete(DataSet: TDataSet);
begin
     CDSC_Estado.ApplyUpdates(0);
end;

Código Delphi [-]
procedure TFC_Estado.CDSC_EstadoAfterPost(DataSet: TDataSet);
begin
     CDSC_Estado.ApplyUpdates(0);
     CDSC_Estado.Refresh;
end;

Código Delphi [-]
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.
Código:


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.

Código:

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.


La franja horaria es GMT +2. Ahora son las 16:28:24.

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