Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-03-2010
Avatar de LuNaTk
LuNaTk LuNaTk is offline
Miembro
 
Registrado: jun 2007
Posts: 19
Poder: 0
LuNaTk Va por buen camino
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???
Responder Con Cita
  #2  
Antiguo 27-03-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #3  
Antiguo 29-03-2010
Avatar de LuNaTk
LuNaTk LuNaTk is offline
Miembro
 
Registrado: jun 2007
Posts: 19
Poder: 0
LuNaTk Va por buen camino
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????
Responder Con Cita
  #4  
Antiguo 30-03-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #5  
Antiguo 30-03-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Y qué tal si pones el código?
Responder Con Cita
  #6  
Antiguo 30-03-2010
Avatar de LuNaTk
LuNaTk LuNaTk is offline
Miembro
 
Registrado: jun 2007
Posts: 19
Poder: 0
LuNaTk Va por buen camino
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)

Última edición por LuNaTk fecha: 30-03-2010 a las 03:14:29. Razón: Mal formato
Responder Con Cita
  #7  
Antiguo 25-04-2010
Avatar de LuNaTk
LuNaTk LuNaTk is offline
Miembro
 
Registrado: jun 2007
Posts: 19
Poder: 0
LuNaTk Va por buen camino
Ya lo resolvi.

Puse la pripiedad ResolveToDataset a false en el DataSetProvider.

Tan fácil como eso.

Lamento la pérdida de tiempo.
Responder Con Cita
Respuesta



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
Trigger Before Delete, cancelar borrado dardo SQL 3 20-06-2008 11:35:00
Trigger Before (Insert,update,delete)? estebanx MS SQL Server 2 25-05-2006 15:58:19
problema con edicion de imagenes 7pilas Gráficos 3 15-04-2006 00:41:54
problema de edicion en una Form thrys Conexión con bases de datos 1 08-09-2005 01:52:28
Como puedo cambiar la propiedad de edicion y no edicion a un StringGrid1 ctronx Varios 2 25-06-2004 23:10:19


La franja horaria es GMT +2. Ahora son las 06:16:00.


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