¡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 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 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.