PDA

Ver la Versión Completa : unica ejecucion multiples recordsets


Calo
31-03-2005, 20:53:26
gente, ante todo queria saludarlos...hace varios meses que estoy recorriendo el foro y aprendi mucho de uds. Hoy aproveche para registrarme y plantearles la siguiente duda

Estoy con un sistema en delphi y access 2000

Cuando quiero realizar un Instert como el siguiente me devuelve el siguiente cordigo de error:

El proveedor actual no admite que una unica ejecucion devuelva multiples recordsets.

Entiendo perfectamente...ahora no se me ocurre nada para solucionarlo.

Aca tengo el codigo

datamodule1.QRYHistFact.SQL.Clear;
datamodule1.QRYHistFact.SQL.Add('INSERT INTO factura ( id_pedido, id_producto, precio_A, precio_B, precio_C ) ');
datamodule1.QRYHistFact.SQL.Add('SELECT ProductoPedido.id_pedido, ProductoPedido.id_producto, productos.precio_A, productos.precio_B, productos.precio_C ');
datamodule1.QRYHistFact.SQL.Add('FROM ProductoPedido INNER JOIN productos ON ProductoPedido.id_producto = productos.id_producto ');
datamodule1.QRYHistFact.SQL.Add('WHERE ProductoPedido.id_pedido='+ inttostr(dbgrid1.SelectedField.Value));
frmprincipal.InitConsulta(datamodule1.QRYHistFact);


El initconsulta lo unico que hace es poner en prepared el query, lo abre, locierra y lo ejecuta.

Esta consulta devuelve un listado de productos, que se van a guardar en una tabla factura con con dos claves, el codigo del producto y el codigo del pedido.

Nada mas...espero que alguien me salve de esta!

Salu2
Calo

kenkatana
31-03-2005, 21:34:46
El problema esta en q tienes 2 sentencias SQL: La primera un INSERT y luego un SELECT, simplemente ejecuta el INSERT primero, luego carga la instruccion SELECT y vuelve a ejecutarlo :)

jachguate
31-03-2005, 22:22:15
A mi me parece una sentencia perfectamente válida.... eso si, no se si Access la soportará.

Para aclarar a kenkatana que parece que se nos ha perdido en el camino, la sentencia inserta en la tabla factura todas las filas que son resultado del Select que le sigue, lo que está basado en el estándar SQL.

Luego, para ejecutar una sentencia de este tipo, que no devuelve un cursor, regularmente no se "abre" el query, sino se ejecuta.

En la jerga del BDE, no se hace query1.Open, sino query1.ExecSQL (si no mal recuerdo).

Si usas otros componentes de acceso, como ADO, pues habrá de ver de que componente específico se trata para ver cual es el método a seguir, aunque lo usual sería utilizar un TADOCommand.

Saludos.

;)

Calo
31-03-2005, 22:22:53
Estas seguro? Mira que esa misma instruccion bajo access funciona perfectamente, ademas no quedaria completa ejecutando solamente el insert.
Lo unico que hace es decir, insertar en esta tabla y en los siguientes campos los datos que tengo en otro lado. Instruccion simple y bien armada de sql. :(

pcicom
01-04-2005, 01:23:12
Al parecer todo esta bien, solo por una pequeñisima cosa..

la instruccion para hacer INSERTS es la siguiente

INSERT INTO tabla (CAMPO1, CAMPO2......CAMPOn)
VALUES ( VALOR1,VALOR2.... VALORn);

intenta esto..


INSERT INTO tabla (CAMPO1, CAMPO2......CAMPOn)
VALUES (
SELECT -- FROM tabla2 INNER JOIN tabla3 ON tabla2.campo=tabla3.campo) WHERE xCondicion
); <- cIERRA pARENTESIS..

Calo
01-04-2005, 15:26:36
Eso daría error de sintaxis a mi parecer, igualmente lo probe y nada, porque los values se utilizan para insetar valores directamente sobre cada campo y no ser extraidos de un select.



Salu2
Calo

Calo
01-04-2005, 16:14:07
Si usas otros componentes de acceso, como ADO, pues habrá de ver de que componente específico se trata para ver cual es el método a seguir, aunque lo usual sería utilizar un TADOCommand.

Saludos.

;)
Perfecto!!!! Con un adocommand y la especificacion de cmdtext. Le paso la instruccion sql y funciona perfecto.

Mil gracias! Te debo una! :)

Salu2
Calo

jachguate
01-04-2005, 16:23:10
intenta esto..
INSERT INTO tabla (CAMPO1, CAMPO2......CAMPOn)
VALUES (
SELECT -- FROM tabla2 INNER JOIN tabla3 ON tabla2.campo=tabla3.campo) WHERE xCondicion
); <- cIERRA pARENTESIS..

:o :o :o ooooorale!!!!

¿que motor te soporta esta sintaxis...?
:confused: