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)
-   -   ¿Vistas temporales? (https://www.clubdelphi.com/foros/showthread.php?t=57324)

afxe 11-06-2008 19:08:44

¿Vistas temporales?
 
Hola. Estoy haciendo una consulta anidada de una tabla contra una vista, pero la vista puede cambiar, dependiendo de las condiciones de consulta, por lo cual opte por crear la vista en modo ejecución.
El caso es que si uso RECREATE VIEW me da que la vista está en uso si hay alguien más conectado a la base de datos o repito el listado, motivo por el cual tampoco puedo hacerle un DROP VIEW. ¿Hay alguna manera de crear una vista temporal para la transacción en curso, que se elimine cuando se cierre la transacción y que no sea visible para el resto de los usuarios?

rastafarey 11-06-2008 19:32:36

resp
 
Primero te digo una cosa. Estas mal ya que ninguna bd bien diseñada jamas deberia cambiar su estructura dependiendo de ninguna condicion. A menos que se este restructurando la data.

Asi que soluciona lo de tu diseño y estes haciendo chapucero para arreglar alguna situacion.

RolphyReyes 11-06-2008 19:43:40

Saludos.

Como te menciona rastafarey verifica tu estructura porque eso de estar creando vistas en Run-Time no es eficiente.

Una idea puede que hagas la vista "completa" con los campos que mostraras y los condicionantes, te creas un StoredProcedure y a este le pasas las condiciones para que el mismo ponga los filtros solicitados.

Si no te funciona en FB 2.1 tienes las GTT que puedes también sacarles provecho.

Hasta luego.

afxe 12-06-2008 14:05:31

Vaya!!! Lo que daría yo porque mis alumnos hubieran hablado así!!! ... ¡¡¡ y parecía que la ingeniería del software no tenía futuro cuando aparecieron los lenguajes RAD !!!!

Teneis razón, no es efectivo crear vistas en modo ejecución, ni mucho menos usar el RECREATE VIEW, aunque te lo permitiera el motor podrías llevarte sorpresas cuando se ejecutaran informes concurrentes, por eso necesito las vistas temporales activas en la transacción, como las de Oracle, (aunque se podría hacer algo con cursores).

Iva a intentar explicar el problema del informe que tengo que sacar, un balance departamental con posibilidad de cuentas analíticas (por porcentajes de su saldo), pero no puras, sino sólo la que tenga movimientos sin departamento asignado. Pero sería un poco laborioso (el problema se presenta cuando se hace agrupación de departamentos por secciones) y sólo necesitaba saber si existían vistas temporales, pues me facilitaría mucho la Select anidada que tengo que sacar, si no, tengo que irme a procedures y cursores.

Gracias por vuestra intervención, revisaré la estructura de datos ya que efectivamente, parece no haber nada de tablas temporales hasta la versión 2.1.

afxe 12-06-2008 14:28:41

Pues sí que estoy tonto...
 
Pues eso... necesitaba una vista que tenía que crearse en tiempo de ejecución para hacer un LEFT JOIN con la tabla de movimientos, y no cai que puede hacer el LEFT JOIN directamente contra una SELECT, por lo tanto, no hay que crear la vista antes, sino usar la SELECT de la vista directamente en el LEFT JOIN.... Os pongo el chorizo por si a alguien le es de utilidad:

Código:


    select m.cuenta,
          SUBSTRING(M.CLAVE_DEPARTAMENTO FROM 1 FOR 3) as CLAVE_DEPARTAMENTO,
          a.DPTO,
          a.porcent,
          sum(m.DEBE) as DEBE,
          Sum(m.HABER) as HABER
    from asientos m left join
            (select CUENTA,
                    SUBSTRING(CLAVE_DEPARTAMENTO FROM 1 FOR 3) as DPTO,
                    SUM(PORCENTAJE) AS PORCENT
                    FROM analitica GROUP BY 1, 2) a
          on m.cuenta = a.cuenta and m.clave_departamento is null
    where m.ejercicio = 2008
      AND (A.DPTO <> '' OR M.CLAVE_DEPARTAMENTO <> '')
      AND M.COD_EMPRESA = 1
    group by 1, 2, 3, 4

En la cláusula WHERE de la SELECT del LEFT JOIN puedo meter las opciones de búsqueda que deseo, así como variar la longitud de la CLAVE de departamento en tiempo de ejecución.

Gracias de nuevo por vuestra ayuda.

celades1 12-06-2008 18:50:14

Hola

yo la left join la haria contra un procedimiento utilizando
execute statement construyendolo en funcion de los parametros que paso al procedimiento.

O bien todo tu codigo dentro de un unico procedimiento igual que lo explicado antes y luego select del procemiento.

No le veo el problema

Saludos


La franja horaria es GMT +2. Ahora son las 12:56:51.

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