PDA

Ver la Versión Completa : Almacenar y usar consultas vistas y procedimientos en campos blob


sitrico
05-09-2007, 23:18:16
Anoche entre una resaca de vodka y la indigestión de una cena opulenta :D se me ocurrio la idea de poder almacenar en un campo blob (memo) el texto de una consulta (vista ó procedimiento) para ejecutarlo en ciertos campos "calculados". me explico (que dolor de cabeza...)

Supongamos una aplicaciíon de Nómina, la misma usará conceptos de asignaciones y deducciones que deberán ser calculados por formulas que deberá personalizar el cliente, por ejem:

La siguiente formula:

SalarioDiario = SalarioMes / 30

Se expresaria como:

SELECT SALARIOMES/30 SALARIODIA FROM TABLASALARIOS WHERE IDTRABAJADOR = :IDTRABAJADOR

Esa fórmula se podría almacenar en un campo memo y al ejecutar un procedimiento generico: (ojo el código es para referencia no se supone que funcione)

CREATE PROCEDURE APLICAR_FORMULA_MAGICA(
IdFormula integer)
as
declare variable FORMULASQL BLOB SUBTYPE 0;-- TEXTO
begin
FOR
-- primero leer la formula SQL
Select FORMULASQL FROM FORMULAS WHERE IDFORMULA = :IdFormula
Into :FORMULASQL --CAMPO MEMO
DO
BEGIN
-- Aqui se podria asignar el codigo SQL almacenado en FORMULASQL
-- a "Algo" y luego ejecutar dichas sentencias para arrojar como resultado
-- el valor de la formula???
suspend;
End
end

Claro todo desde dentro de firebird (2.0.1) con procedimientos almacenados y eso, la intención es permitir al usuario ejecutar algunos cálculos especiales que arrojen resultados dentro de otras consultas. :confused:

Ni yo entiendo bien el último parrafo. :D

En resumidas: ¿ Se puede almacenar y ejecutar codigo SQL dentro de campos memo en una base de datos firebird ?

martinzcr
06-09-2007, 08:52:46
Hola

Dentro de campos memo (blob en el caso de Firebird), puedes almacenar hasta 32 Gb de cualquier tipo de dato (texto, imagenes, archivos exe, etc).

Si la idea es almacenar un texto ( en este caso una sentencia SQL) creo que no habría problemas, mientras la extraigas desde tu programa y la ejecutes (con un IBQuery por ejemplo). Lo que no puedes hacer, hasta donde yo se, es ejecutar la consulta dentro del campo blob.

Saludos!

defcon1_es
06-09-2007, 11:44:18
CREATE PROCEDURE APLICAR_FORMULA_MAGICA(IdFormula integer)
as
declare variable FORMULASQL BLOB SUBTYPE 0;-- TEXTO
begin
-- primero leer la formula SQL
FOR Select FORMULASQL FROM FORMULAS WHERE IDFORMULA = :IdFormula
Into :FORMULASQL --CAMPO MEMO
DO BEGIN
-- Aqui se podria asignar el codigo SQL almacenado en FORMULASQL
-- a "Algo" y luego ejecutar dichas sentencias para arrojar como resultado
-- el valor de la formula???
suspend;
End
end

Claro todo desde dentro de firebird (2.0.1) con procedimientos almacenados y eso, la intención es permitir al usuario ejecutar algunos cálculos especiales que arrojen resultados dentro de otras consultas. :confused:

En resumidas: ¿ Se puede almacenar y ejecutar codigo SQL dentro de campos memo en una base de datos firebird ?

Prueba con EXECUTE STATEMENT


CREATE PROCEDURE APLICAR_FORMULA_MAGICA(IdFormula integer)
as
declare variable FORMULASQL BLOB SUBTYPE 0;-- TEXTO
-- Según el ejemplo, pero debes conocer el tipo de dato al que pertenece.
declare variable ResultadoFormula DOUBLE PRECISION;
begin
FOR Select FORMULASQL FROM FORMULAS WHERE IDFORMULA = :IdFormula
Into :FORMULASQL
DO BEGIN
EXECUTE STATEMENT :FORMULASQL
INTO :ResultadoFormula; -- si siempre devuelve 1 campo
-- Operar con ese resultado almacenado en ResultadoFormula
suspend;
End
end


Pero el problema está en qué es lo que devuelve esa FORMULA, porque solo con ejecutarla dentro del procedimiento, no creo que sirva de mucho...no se.
¿Esa FORMULA devuelve siempre 1 campo o devuelve más de 1?
¿de que tipo es el dato devuelto?
Me acabo de dar cuenta que la sentencia EXECUTE STATEMENT solo funciona con <string>,
con lo que si falla, (porque no lo he comprobado) deberias pasar de blob a string (creo).

Paoti
06-09-2007, 15:58:33
Hola, yo trabajo con un propducto de nómina, muy excelente


es un front end muy inetresante....



sabes lo que se me ocurre....

que en vez de almacecanr funciones o procedimientos almacenados, guardes código objet pascal.


este codigo sera ejecutado en tiempo de ejecucuón, por ahi peudes seguir la linea si no levas muy avanzado el proyecto.....


el motor de cálculo de la aplicación que te comento, contine su propio lenhuaje de programación para los conceptos de cálculo (sueldo, compensación, bonos, impuesto, etc) y aparte tiene algunas funciones apra poder ejecutar sentencias y procedimientos almacenados...

Paoti
06-09-2007, 15:59:45
me doy cuenta que no contesto a tu pregunta, jejejeje, suele pasar a veces


te adjnot el link

http://www.remobjects.com/page.asp?id={9A30A672-62C8-4131-BA89-EEBBE7E302E6}

sitrico
07-09-2007, 04:57:57
Gracias a todos por responder, en principio aclarar que no es un proyecto en desarrollo, sino más bien una idea para uno que estoy planificando, de hecho no es de nómina sino de cobranzas ;), pero la idea de poder automatizar algo del código dentro de la base de datos me simplificaría mucho la vida, de hecho pensando más en frio sería mas facil implementar la sujerencia de martinzcr .

También voy a probar la sujerencia de defcon1_es pero por lo que dice debo usar campos Char, lo que limitará mucho la capacidad de trabajo.

En cuanto a ¿Esa FORMULA devuelve siempre 1 campo o devuelve más de 1? La idea, es más bien una crear función, que devuelva siempre un valor (Numeric ó float).

En cuanto al código en object pascal la verdad excede bastante la idea inicial, recuerdo haber usado un componente JvInterpreter (bastante potente) pero, por ahora "exploro" las capacidades del firebird...

Acabo de ver el link de Paoti, luce muy prometedor, a ver si con algo más de tiempo los descargo y pruebo.

Gracias de nuevo.

sitrico
07-09-2007, 05:19:05
Esto Sí funciona: :eek:

CREATE PROCEDURE APLICAR_FORMULA_MAGICA (
idformula integer)
returns (
resultado numeric(15,5))
as
declare variable formulasql varchar(512);
begin
FOR Select formula FROM formulas WHERE IDFORMULA = :IdFormula
Into :FORMULASQL
DO BEGIN
EXECUTE STATEMENT :FORMULASQL
INTO :Resultado; -- si siempre devuelve 1 campo
-- Operar con ese resultado almacenado en ResultadoFormula
suspend;
End
end

La formula:

Select (Sum(monto)/2)*-1 Resultado
from montoderubros Where IdGrupoRub = 1

Calcular el 50% de descuento :D

Ahora tengo que ver que puedo hacer con eso... :cool:

Con campos BLOB no funciona.