Club Delphi  
    Paypal   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 10-04-2026
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Usando variables

Hace tiempo me resolvisteis una duda que tenía sobre como usar variables en un query. Me hace falta volver a usar esa metodología.
Tengo esta tabla:

y sobre la misma ejecuto este query:
Código SQL [-]
SELECT CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'IMPDTO') AS DOUBLE PRECISION),
       RDB$SET_CONTEXT('USER_TRANSACTION', 'IMPDTO', (SELECT SUM(ImpDto) FROM Factura WHERE NumFactura IN (3,4)))
  FROM Factura WHERE NumFactura IN (3,4)
y el resultado que me da es este:

La realidad es que debería darme sólo la segunda línea. ¿Por qué me da dos filas en vez de una sola? Y es que el problema viene porque si trato de usar esa variable en el query en el que de verdad me hace falta:
Código SQL [-]
SELECT RDB$SET_CONTEXT('USER_TRANSACTION', 'IMPDTO', (SELECT SUM(ImpDto) FROM Factura WHERE NumFactura IN (3,4))),
       CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'IMPDTO') AS DOUBLE PRECISION) ImpDto, 
       SUM(Bruto) Bruto, 
       CASE WHEN SUM(Bruto - ImpDto) = SUM(Bruto) THEN 0 ELSE SUM(Bruto - ImpDto) END Base, 
       SUM(Iva) Iva, SUM(Bruto - ImpDto + Iva) Total
  FROM Factura WHERE NumFactura IN (3,4)
Me hace esto

Que, evidentemente, no es lo que busco porque no me devuelve el valor de la variable definida. Aunque, curiosamente, el CASE del query sí va por el lado adecuado. No lo entiendo.

Última edición por Angel.Matilla fecha: 10-04-2026 a las 12:22:14.
Responder Con Cita
  #2  
Antiguo 10-04-2026
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.669
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
El problema es que estás usando RDB$SET_CONTEXT dentro de un SELECT que devuelve varias filas, por lo que la función se ejecuta una vez por cada fila.
En Firebird estas funciones no son “variables globales” sino que se evalúan por fila.
Si quieres que se ejecute una sola vez, usa FROM RDB$DATABASE, o mejor aún, evita SET_CONTEXT y usa una subconsulta o CTE.

Te copio respuesta del primo chatgpt:

Responder Con Cita
  #3  
Antiguo 10-04-2026
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Muchas gracias por las sugerencias. La que pones como opción 2 es la que estaba usando, pero me hace falta reutilizar el valor.

Sin embargo al probar la tercera opción que me das me genera un error:
Cita:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
Y no veo donde poner el GROUP BY.

Última edición por Angel.Matilla fecha: 10-04-2026 a las 17:48:09.
Responder Con Cita
  #4  
Antiguo 10-04-2026
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Y la opción 1 efectivamente devuelve un única fila, pero con todos los valores a cero.
Responder Con Cita
  #5  
Antiguo 10-04-2026
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.669
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
¿Será así?
Código SQL [-]
SELECT
  SUM(ImpDto) ImpDto,
  SUM(Bruto) Bruto,
  CASE 
    WHEN SUM(Bruto - ImpDto) = SUM(Bruto) THEN 0 
    ELSE SUM(Bruto - ImpDto) 
  END Base,
  SUM(Iva) Iva,
  SUM(Bruto - ImpDto + Iva) Total
FROM Factura
WHERE NumFactura IN (3,4);
Responder Con Cita
  #6  
Antiguo 10-04-2026
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Así es como lo tenía. Tendré que ver como apaño el resultado para usarlo. No sé si no estaré dando vueltas sin sentido. Gracias.
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
Rotulos de columnas usando variables HenryAraniva MS SQL Server 3 06-09-2008 00:04:37
variables variables (manual php) salvica PHP 0 25-09-2005 16:44:52
variables Chupi API de Windows 1 24-12-2004 11:21:26
here en sql con variables rolando_s Conexión con bases de datos 3 16-12-2004 22:43:03


La franja horaria es GMT +2. Ahora son las 01:57:03.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi