Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   ¿Pueden tener disparadores (triggers) las vistas “Union”? (https://www.clubdelphi.com/foros/showthread.php?t=31831)

Al González 19-05-2006 02:49:36

¿Pueden tener disparadores (triggers) las vistas “Union”?
 
¡Hola a todos!

Trabajo en el desarrollo de una aplicación Delphi 7 de 2.5 capas*. La base de datos es Firebird 1.5. Ayer aprendí que no sólo las tablas pueden tener disparadores, también las vistas. De hecho, para que una vista sea de lectura y escritura (y pueda ser utilizada como si fuera una tabla) es necesario que tenga disparadores Before que realicen la acción correspondiente a la inserción, modificación o eliminación de registros.

Bien, hoy, después de haber creado un disparador Before Insert para una de las vistas del proyecto, probé su funcionamiento agregando un registro a ésta (desde IBExpert). La operación falló, arrojando el siguiente mensaje de error compuesto:

The cursor identified in the update or delete statement is not positioned on a row.
no current record for fetch operation.
attempted update of read-only column.


Después de buscar soluciones a esto en la Red y hacer varias modificaciones a la vista y su disparador, descubrí que el error anterior ocurre, aparentemente, por tratarse de una vista que une dos tablas verticalmente (Select con Union). Cuando no utilizo Union, la operación se ejecuta sin problemas.

¿Será que no es posible emplear vistas Union para lectura y escritura en Firebird 1.5? Gracias por toda la ayuda que puedan proporcionarme. El código de la vista es el siguiente (aclarando que no fui yo el autor original):

Código SQL [-]
CREATE VIEW VWTARIFAS(
    ID,
    FIJA,
    IDTARIFASTIPOS,
    GRUPO,
    TIPO,
    FECHAINICIAL,
    FECHAFINAL,
    LIMITEINFERIOR,
    LIMITESUPERIOR,
    IMPORTE,
    IMPORTEEXCEDENTE)
AS
Select /*TF.ID*/Gen_id (GeneradorGeneral, 1),
    'Si', TF.IDTarifasTipos, TG.Nombre, TT.Nombre, TF.FechaInicial,
    TF.FechaFinal, CAST(NULL AS INTEGER), CAST(NULL AS INTEGER),
    TF.Importe, CAST(NULL AS NUMERIC (15, 4))
  From TarifasFijas TF, TarifasTipos TT, TarifasGrupos TG
  Where (TF.IdTarifasTipos = TT.ID) And (TT.IdTarifasGrupos = TG.Id)

 UNION

  Select /*TC.ID*/Gen_id (GeneradorGeneral, 1),
   'No', TC.IDTarifasTipos, TG.Nombre, TT.Nombre, TC.FechaInicial,
   TC.FechaFinal, TC.LimiteInferior, TC.LimiteSuperior,
   TC.Importe, TC.ImporteExcedente
  From TarifasConsumo TC, TarifasTipos TT, TarifasGrupos TG
  Where (TC.IdTarifasTipos = TT.ID) And (TT.IdTarifasGrupos = TG.Id)
;

Un abrazo unido.

Al González. :)

* Utilizo el término «2.5 capas» para referirme a una aplicación de dos capas (cliente-servidor) que ha sido estructurada de tal manera que facilitará la conversión a tres capas cuando surja esa necesidad. El código que deberá ir en el servidor de aplicaciones ya está aislado e identificado en su mayor parte.

Al González 19-05-2006 22:29:26

Aún sin solución
 
¡Hola a todos!

No he podido resolver este problema todavía. Intentaré creando una vista de la vista (por cierto, sin el Güindous Vista que yo también recomiendo no instalar sino hasta el 2008 ;)). Los mantendré informados y estaré muy atento a cualquier sugerencia.

Un abrazo disparado.

Al González. :)


La franja horaria es GMT +2. Ahora son las 12:39:48.

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