Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-05-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Unhappy Modificar Campo Calculado

Saludos.

He buscado en la ayuda y en el foro pero no he encontrado ningún tema de referencia.

La tarea es poder modificar un campo calculado de una tabla ya existente (valga la redundancia) vía SQL.

Hasta luego.
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #2  
Antiguo 28-05-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

Te refieres a campos del tipo Computed en las tablas de una base de datos?

O a campos calculados en un DataSet en Delphi?


Saludos...
Responder Con Cita
  #3  
Antiguo 28-05-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Saludos.

Cierto maeyanes por la prisa no especifique todos los datos, es para la base de datos y el motor es FB 1.5.
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #4  
Antiguo 29-05-2008
JMG JMG is offline
Miembro
 
Registrado: may 2005
Posts: 10
Poder: 0
JMG Va por buen camino
Si un campo es calculado, me parece un absurdo querer modificarlo, habrá que modificar algunos de los campos que lo generran, no?

Saludos,
Responder Con Cita
  #5  
Antiguo 29-05-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Exclamation

Saludos.

Cita:
me parece un absurdo querer modificarlo
JMG creo que ese termino debes de pensarlo bastante antes de intentar responder alguna inquietud de algún miembro de la comunidad.

La razón por la cual deseo modificar ese campo es porque justamente el "calculo" que realiza es incorrecto y ya esta en producción; esto no quiere decir que sus integrantes se estén guardando de manera errónea sino el cliente solicito el cambio y ellos son los que pagan.

Hasta luego.
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #6  
Antiguo 29-05-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

En ese caso puedes hacer lo siguiente; eliminar el campo y volverlo a crear con el cálculo correcto. Al ser un campo Computed este no guarda ningún tipo de dato, solo muestra el resultado del cálculo.

Código SQL [-]
/* Eliminar y recrear el campo */
alter table MiTabla drop column CalcField;

alter table MiTabla add column CalcField computed by Field1 + Field2;


Saludos...
Responder Con Cita
  #7  
Antiguo 29-05-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Lightbulb Solución del problema

Saludos.

Gracias maeyanes pero eso funcionaria sí y solo sí no tendrías referencias para el campo, pero en mi caso tengo unas quince (15) al mismo y esta en producción ya sabes el trabajo que eso implica.

No obstante, para tratar de subsanar el fallido intento del ALTER TABLE al campo calculado decidí revisar la tabla RDB$FIELDS y en la misma encontré el campo RDB$COMPUTED_SOURCE, pensé aquí está mi salvación .

Al cambiar el valor del campo y realizar un SELECT a la tabla veo que el valor continua igual, ahí mismo dije ya me j.....

Vi un campo al lado llamado RDB$COMPUTED_BLR del siguiente tipo BLOB SUB_TYPE 2 SEGMENT SIZE 80 este me llamo la atención por la forma en que IBExpert lo visualiza (obviamente es un Blob) de diferentes maneras (Text, Hex, Picture, RTF, Web Page, BLR y Unicode Text) al ver su contenido me di cuenta de que este es el usado por Firebird para realizar la operación del COMPUTED BY (claro que al inicio pensé que era RDB$COMPUTED_SOURCE, pero al fallar el cambio).

Contenido de un campo calculado visualizándolo como BLR:
Cita:
blr_version4,
blr_multiply,
blr_field, 0, 8, 'C','A','N','T','I','D','A','D',
blr_field, 0, 6, 'P','R','E','C','I','O',
blr_eoc
Me di cuenta de que no podía cambiar el valor del campo directamente así que no me quedo más remedio que hacer lo siguiente para poder realizar la operación:

Primero creo un campo temporal con el calculo que deseo
Código SQL [-]
alter table TABLA add TMP computed by ((CAMPO1 - CAMPO2) * CAMPO3);

Segundo realizar el update del campo RDB$COMPUTED_BLR
Código SQL [-]
UPDATE RDB$FIELDS F 
SET F.RDB$COMPUTED_SOURCE = '((CAMPO1 - CAMPO2) * CAMPO3)'
,F.RDB$COMPUTED_BLR=(select F.RDB$COMPUTED_BLR
from RDB$RELATION_FIELDS FR
JOIN RDB$FIELDS F ON F.RDB$FIELD_NAME=FR.RDB$FIELD_SOURCE
where FR.rdb$relation_name='TABLA'
AND FR.RDB$FIELD_NAME='TMP')
WHERE F.RDB$FIELD_NAME=(
select FR.RDB$FIELD_SOURCE
from RDB$RELATION_FIELDS FR
where FR.rdb$relation_name='TABLA'
AND FR.RDB$FIELD_NAME='CAMPO_REAL_CALCULADO');

Sí se fijan actualice el campo RDB$COMPUTED_SOURCE solo para mantener la referencia de que estoy calculando.

Y por último
Código SQL [-]
alter table TABLA DROP tmp;

Espero que les pueda servir en algún momento.

Hasta luego.
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #8  
Antiguo 29-05-2008
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
Cita:
La razón por la cual deseo modificar ese campo es porque justamente el "calculo" que realiza es incorrecto
Un campo calculado en Firebird nunca realiza un calculo incorrecto, lo q realiza es la formula q esta declarada al crearlo con computed by, y eso siempre de manera correcta, puedes dar un ejemplo?
__________________
¿Microsoft? No, gracias..
Responder Con Cita
  #9  
Antiguo 29-05-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Smile

Saludos.

Gracias Delfino pero cuando me refiero a que realiza mal el calculo es que la formula que tenía ya no funciona para el cliente, además de que estaba aclarando una respuesta que he habían dado.

Hasta luego.
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #10  
Antiguo 30-05-2008
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
Cita:
realiza mal el calculo es que la formula que tenía ya no funciona para el cliente
En este caso lo q se tiene q cambiar es la formula
__________________
¿Microsoft? No, gracias..
Responder Con Cita
  #11  
Antiguo 15-01-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Ingeniosa solución Rolphy, como para crear un SP utilitario llamado SPUpdateComputedField.

Nada más aclarar la diferencia entre un campo calculado (campo de memoria a nivel del programa) y uno computado (campo en la base de datos cuyo valor es el resultado de una instrucción SQL preestablecida).

Saludos.

Al.
Responder Con Cita
  #12  
Antiguo 16-01-2009
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Smile

Cita:
Empezado por Al González Ver Mensaje
Ingeniosa solución Rolphy, como para crear un SP utilitario llamado SPUpdateComputedField.

Nada más aclarar la diferencia entre un campo calculado (campo de memoria a nivel del programa) y uno computado (campo en la base de datos cuyo valor es el resultado de una instrucción SQL preestablecida).

Saludos.

Al.
Estupenda idea y así ponerlo en el repertorio hasta que llegue la versión 2.5 y se pueda migrar.

Por cierto, gracias por la aclaración.
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #13  
Antiguo 16-01-2009
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Nadie ha acotado que en este caso, el nuevo cálculo del citado campo solo será válido para los registros que se introduzcan posteriormente ya que tooooooodosss los registros que ya estaban en la base de datos ahora mostraron un resultado incorrecto.

Ejemplo de este efecto:

El famoso IVA (en México del 15% sobre el subtotal de la factura). Si ponemos para más facil un campo calculado llamado IVA que sea igual a SUBTOTAL*0.15 funciona bien, y asi podemos capturar nuestras facturas sin mayor problema, peeeero....un buen día dicho impuesto cambia y ahora es de 16% (ni lo mande Dios). Como somos muy duchos vamos y cambiamos el campo calculado para que ahora haga SUBTOTAL*0.16 y ohhhhhh ya no cuadra nada de lo que teniamos previamente almacenado!!!!! ya que el nuevo cálculo es con 0.16 y lo que teniamos se dió por hecho que era por 0.15.

Ojo: No utilicen campos calculados en valores que NO DEBEN VARIAR CON EL TIEMPO, es decir, valores que una vez capturados ya no se pueden modificar. En mi ejemplo el IVA de una factura es precisamente el que se cobró al momento de su elaboración y ningún otro. Es decir, no utilicen campos calculados si alguno de los valores involucrados es una "constante" al momento de hacer la operación. De esta forma, si podemos hacer un campo calculado para que nos saque el importe de una partida (CANTIDAD * PRECIO UNITARIO) ya que ambos datos ya no cambiarán una vez hecha la factura, es decir, tanto CANTIDAD como PRECIO UNITARIO son dos campos que se guardan en la tabla y ya no se veran afectados externamente.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
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
Campo Calculado!!! Ledian_Fdez OOP 1 03-10-2007 22:10:01
Pasar un campo calculado a un campo del mismo DbGrid maravert Conexión con bases de datos 3 12-05-2006 00:31:30
Campo calculado sercornejov MySQL 3 09-08-2005 02:54:35
Campo de bd calculado davidgaldo MS SQL Server 3 20-05-2005 15:50:22


La franja horaria es GMT +2. Ahora son las 18:22:50.


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