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 05-09-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
Almacenar y usar consultas vistas y procedimientos en campos blob

Anoche entre una resaca de vodka y la indigestión de una cena opulenta 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:

Código SQL [-]
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)

Código SQL [-]
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.

Ni yo entiendo bien el último parrafo.

En resumidas: ¿ Se puede almacenar y ejecutar codigo SQL dentro de campos memo en una base de datos firebird ?
__________________
Sitrico
Responder Con Cita
  #2  
Antiguo 06-09-2007
Avatar de martinzcr
martinzcr martinzcr is offline
Miembro
 
Registrado: jun 2006
Ubicación: San Jose, Costa Rica
Posts: 53
Poder: 18
martinzcr Va por buen camino
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!
__________________
Martin Zalazar
Responder Con Cita
  #3  
Antiguo 06-09-2007
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
Cita:
Empezado por sitrico Ver Mensaje
Código SQL [-]
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.

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

Código SQL [-]
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).
__________________
Progress Openedge
https://abevoelker.com/progress_open...dered_harmful/


Delphi forever...

Última edición por defcon1_es fecha: 06-09-2007 a las 11:47:15.
Responder Con Cita
  #4  
Antiguo 06-09-2007
Avatar de Paoti
Paoti Paoti is offline
Miembro
 
Registrado: may 2003
Ubicación: Monterrey. N.L., México
Posts: 612
Poder: 21
Paoti Va por buen camino
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...
__________________
Estudia y anda en la calle.... que asi serás el doble de listo que los demás...

análisis de información
análisis y diseño de sistemas

Paoti Rios Reséndiz
Responder Con Cita
  #5  
Antiguo 06-09-2007
Avatar de Paoti
Paoti Paoti is offline
Miembro
 
Registrado: may 2003
Ubicación: Monterrey. N.L., México
Posts: 612
Poder: 21
Paoti Va por buen camino
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}
__________________
Estudia y anda en la calle.... que asi serás el doble de listo que los demás...

análisis de información
análisis y diseño de sistemas

Paoti Rios Reséndiz
Responder Con Cita
  #6  
Antiguo 07-09-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
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
Cita:
¿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

Última edición por sitrico fecha: 07-09-2007 a las 05:05:33.
Responder Con Cita
  #7  
Antiguo 07-09-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
Esto Sí funciona:

Código SQL [-]
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:

Código SQL [-]
Select (Sum(monto)/2)*-1 Resultado 
from montoderubros Where IdGrupoRub = 1

Calcular el 50% de descuento

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

Con campos BLOB no funciona.
__________________
Sitrico

Última edición por sitrico fecha: 07-09-2007 a las 05:29:58.
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
consultas a procedimientos almacenados.... Kenobi SQL 4 23-03-2007 20:43:46
Problemas al almacenar imagen en campo blob Manuel Gráficos 4 15-06-2006 22:52:02
donde almacenar los procedimientos y funciones olbeup MS SQL Server 2 16-04-2006 20:56:07
Consultas dinámicas en procedimientos almacenados sur-se Firebird e Interbase 1 15-11-2004 18:04:24
Consultas anidadas en procedimientos almacenados Choclito Firebird e Interbase 7 18-07-2004 22:06:33


La franja horaria es GMT +2. Ahora son las 06:29:38.


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