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 11-06-2008
afxe afxe is offline
Miembro
 
Registrado: jul 2004
Ubicación: Malaga-España
Posts: 273
Poder: 20
afxe Va por buen camino
¿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?
Responder Con Cita
  #2  
Antiguo 11-06-2008
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
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.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #3  
Antiguo 11-06-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.

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.
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #4  
Antiguo 12-06-2008
afxe afxe is offline
Miembro
 
Registrado: jul 2004
Ubicación: Malaga-España
Posts: 273
Poder: 20
afxe Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 12-06-2008
afxe afxe is offline
Miembro
 
Registrado: jul 2004
Ubicación: Malaga-España
Posts: 273
Poder: 20
afxe Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 12-06-2008
celades1 celades1 is offline
Miembro
 
Registrado: ago 2005
Posts: 116
Poder: 19
celades1 Va por buen camino
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
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
Tablas Temporales look SQL 2 15-03-2008 16:53:16
Tablas Temporales Milperrimo Firebird e Interbase 7 25-10-2007 05:01:25
Eventos temporales en Firebird santiago14 Firebird e Interbase 3 28-03-2007 23:49:42
constantes temporales Crandel Varios 11 17-01-2007 00:53:02
Creación de temporales feruiz Firebird e Interbase 2 28-04-2004 10:35:20


La franja horaria es GMT +2. Ahora son las 19:14:06.


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