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)
-   -   Error en INSERT masivo (https://www.clubdelphi.com/foros/showthread.php?t=98031)

Angel.Matilla 09-05-2026 10:23:57

Error en INSERT masivo
 
Buenos días. Estoy tratando de ejecutar un INSERT masivo en una tabla. La definición de la tabla es esta:
Código SQL [-]
CREATE TABLE Cierre (Fecha DATE NOT NULL, GruFac INTEGER NOT NULL, Bruto FLOAT, Iva FLOAT)
ALTER TABLE Cierre ADD CONSTRAINT PK_Cierre PRIMARY KEY (Fecha, GruFac)
y el INSERT que quiero ejecutar es este:
Código SQL [-]
INSERT INTO Cierre (Fecha, 
                    GruFac, 
                    Bruto, 
                    Iva) 
VALUES ((SELECT A.Fecha, 
                C.Facturacion, 
                SUM(A.Cantidad * A.Bruto - A.ImpDto), 
                SUM((A.Cantidad * A.Bruto - A.ImpDto) * A.TipoIva / 100)
           FROM DetFactura A, Articulo B, Familia C
          WHERE A.TipoDoc||'$'||A.NumFactura IN ('1$1','1$2','2$1','2$2')
            AND A.Codigo = B.Codigo AND B.Familia = C.Codigo
          GROUP BY Fecha, Facturacion))
El resultado del SELECT que hay en el query es este:

Cuando intento ejecutarlo en SQL Manager, para probarlo, me da este error:
Cita:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid command.
Count of column list and variable list do not match.
y hasta donde veo hay el mismo número de columnas que de variables. No soy capaz de ver que estoy haciendo mal.

Casimiro Noteví 09-05-2026 23:22:14

No se puede usar un SELECT que devuelve múltiples columnas dentro de un VALUES. En Firebird, VALUES (SELECT ...) solo funciona si el SELECT devuelve una sola fila y una sola columna.
Tu SELECT devuelve 4 columnas, y además múltiples filas. La sintaxis correcta es usar INSERT ... SELECT directamente, sin VALUES.


Elimina VALUES y los paréntesis exteriores, dejando solo INSERT INTO ... SELECT .... Así Firebird insertará todas las filas que devuelva tu consulta.

duilioisola 11-05-2026 07:50:27

Debería quedar así:

Código SQL [-]
insert into cierre (
    fecha,
    grufac,
    bruto,
    iva)
select
    a.fecha,
    c.facturacion,
    sum(a.cantidad * a.bruto - a.impdto),
    sum((a.cantidad * a.bruto - a.impdto) * a.tipoiva / 100)
from detfactura a, articulo b, familia c
where
a.tipodoc || '$' || a.numfactura in ('1$1', '1$2', '2$1', '2$2') and
a.codigo = b.codigo and
b.familia = c.codigo
group by a.fecha, c.facturacion

Además, utiliza el alias para todos los campos.

group by a.fecha, c.facturacion

Angel.Matilla 11-05-2026 09:56:48

Gracias a los dos. No me había dado cuenta de ese detalle. :(


La franja horaria es GMT +2. Ahora son las 02:11:42.

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