PDA

Ver la Versión Completa : Error commandtext does not return result set


socger
07-02-2014, 14:29:05
Las líneas que abajo pongo funcionan bién en sql server 2000, pero cuando les tiro con un adoquery me da el error commandtext does not return result set


DECLARE @mi_tabla TABLE ( NumeroRegistro int, NumeroVehiculo nchar(5), NumeroMatricula varchar(15), RFID_Salida datetime, RFID_Entrada datetime, Serv_Ano_Creacion smallint, Serv_Codigo int, Serv_Linea int, Serv_Conductor char(5) )
INSERT INTO @mi_tabla
SELECT a.NumeroRegistro, a.NumeroVehiculo, a.NumeroMatricula,
(
SELECT TOP 1 z.CUANDO
FROM Murcia.dbo.tbl_RFID_Movimientos as z
WHERE z.ANTENA LIKE '%Ant0%'
AND z.id_Vehiculo = a.NumeroRegistro
AND z.CUANDO >= '07/02/2014 0:00:00'
AND z.CUANDO <= '07/02/2014 23:59:59'
ORDER BY z.id_Vehiculo ASC, z.CUANDO DESC
) AS RFID_Salida,
(
SELECT TOP 1 z.CUANDO
FROM Murcia.dbo.tbl_RFID_Movimientos as z
WHERE z.ANTENA LIKE '%Ant1%'
AND z.id_Vehiculo = a.NumeroRegistro
AND z.CUANDO >= '07/02/2014 0:00:00'
AND z.CUANDO <= '07/02/2014 23:59:59'
ORDER BY z.id_Vehiculo ASC, z.CUANDO DESC
) AS RFID_Entrada,
(
SELECT TOP 1 Ano_Creacion FROM [Murcia].[dbo].[tbl_Servicios_Montaje]
WHERE [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Inicio] <= '07/02/2014 14:17:51' AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Final] >= '07/02/2014 14:17:51'
AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Vehiculo] = a.NumeroVehiculo
AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Baja] IS NULL
ORDER BY [Murcia].[dbo].[tbl_Servicios_Montaje].[Vehiculo], [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Inicio], [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Final]
) as Serv_Ano_Creacion,
(
SELECT TOP 1 Codigo FROM [Murcia].[dbo].[tbl_Servicios_Montaje]
WHERE [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Inicio] <= '07/02/2014 14:17:51' AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Final] >= '07/02/2014 14:17:51'
AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Vehiculo] = a.NumeroVehiculo
AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Baja] IS NULL
ORDER BY [Murcia].[dbo].[tbl_Servicios_Montaje].[Vehiculo], [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Inicio], [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Final]
) as Serv_Codigo,
(
SELECT TOP 1 Linea FROM [Murcia].[dbo].[tbl_Servicios_Montaje]
WHERE [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Inicio] <= '07/02/2014 14:17:51' AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Final] >= '07/02/2014 14:17:51'
AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Vehiculo] = a.NumeroVehiculo
AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Baja] IS NULL
ORDER BY [Murcia].[dbo].[tbl_Servicios_Montaje].[Vehiculo], [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Inicio], [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Final]
) as Serv_Linea,
(
SELECT TOP 1 Conductor FROM [Murcia].[dbo].[tbl_Servicios_Montaje]
WHERE [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Inicio] <= '07/02/2014 14:17:51' AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Final] >= '07/02/2014 14:17:51'
AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Vehiculo] = a.NumeroVehiculo
AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Baja] IS NULL
ORDER BY [Murcia].[dbo].[tbl_Servicios_Montaje].[Vehiculo], [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Inicio], [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Final]
) as Serv_Conductor
FROM [SocGer].[dbo].[tbl_Vehiculos] as a
WHERE a.[Fecha_Baja] IS NULL
AND a.[Empresa_Colaboradora] IS NULL
ORDER BY a.NumeroVehiculo ASC
SELECT s.Descripcion, x.* FROM @mi_tabla as x LEFT JOIN [Murcia].[dbo].[tbl_Servicios] as s ON x.Serv_Ano_Creacion = s.Ano_Creacion AND x.Serv_Codigo = s.Codigo WHERE x.RFID_Entrada > x.RFID_Salida OR x.RFID_Entrada = x.RFID_Salida OR ( x.RFID_Entrada IS NULL AND x.RFID_Salida IS NULL )
ORDER BY x.NumeroVehiculo ASC


El código en Delphi es sencillo


ado_Qry_Vehiculos_en_Base.Sql.Clear;
ado_Qry_Vehiculos_en_Base.Sql.Add( ... una copia exacta de las líneas de arriba sql server ...);

// Abro el adoConection ... que lo hace bien
ado_Con_Vehiculos_en_Base.Connected := True;

ado_Qry_Vehiculos_en_Base.ExecSQL;

// Cuando ejecuto esta sentencia siguiente me da el error que comento
ado_Qry_Vehiculos_en_Base.Active := True;


Al pasar hacer el open del adoQuery me genera el error commandtext does not return result set

Así que si alguien supiera decirme en que estoy fallando se lo agradecería eternamente.

Saludos

TOPX
07-02-2014, 14:45:57
Llamando al método ExecSql, el DataSet ejecuta el INSERT en cuestión; así que, sin mayor información, le cuento que sobra el hecho de modificar posteriormente el valor de la propiedad Active.
-

socger
07-02-2014, 17:59:13
Verás que lo que hago es crear una variable temporal de tipo table en la que hago un insert de una select bastante larga y luego al final vuelvo a hacer una select pero de la variable / table temporal

Por eso hago una ado_query.execsql y luego un ado_query.active := True
para traerme los registros de la tabla temporal recién creada en una variable de tipo table.

Pero justo al hacer el open de la tabla me da el error.

Por lo que agradecería que alguien me lo pudiera solucionar el problema.

Saludos.

socger
07-02-2014, 18:29:39
Perdón esto es lo que le faltaba al post anterior para ver la aclaración de la SQL

***************************************************************************
** El bloque siguiente crea la variable/tabla temporal
***************************************************************************
DECLARE @mi_tabla TABLE ( NumeroRegistro int, NumeroVehiculo nchar(5), NumeroMatricula varchar(15), RFID_Salida datetime, RFID_Entrada datetime, Serv_Ano_Creacion smallint, Serv_Codigo int, Serv_Linea int, Serv_Conductor char(5) )

***************************************************************************
** Todo el bloque siguiente inserta registros usando la estructura insert + select
***************************************************************************
INSERT INTO @mi_tabla

SELECT a.NumeroRegistro, a.NumeroVehiculo, a.NumeroMatricula,
(SELECT TOP 1 z.CUANDO
FROM Murcia.dbo.tbl_RFID_Movimientos as z
WHERE z.ANTENA LIKE '%Ant0%'
AND z.id_Vehiculo = a.NumeroRegistro
AND z.CUANDO >= '07/02/2014 0:00:00'
AND z.CUANDO <= '07/02/2014 23:59:59'
ORDER BY z.id_Vehiculo ASC, z.CUANDO DESC
) AS RFID_Salida,

(SELECT TOP 1 z.CUANDO
FROM Murcia.dbo.tbl_RFID_Movimientos as z
WHERE z.ANTENA LIKE '%Ant1%'
AND z.id_Vehiculo = a.NumeroRegistro
AND z.CUANDO >= '07/02/2014 0:00:00'
AND z.CUANDO <= '07/02/2014 23:59:59'
ORDER BY z.id_Vehiculo ASC, z.CUANDO DESC
) AS RFID_Entrada,

(SELECT TOP 1 Ano_Creacion
FROM [Murcia].[dbo].[tbl_Servicios_Montaje]
WHERE [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Inicio] <= '07/02/2014 14:17:51' AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Final] >= '07/02/2014 14:17:51'
AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Vehiculo] = a.NumeroVehiculo
AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Baja] IS NULL
ORDER BY [Murcia].[dbo].[tbl_Servicios_Montaje].[Vehiculo], [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Inicio], [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Final]
) as Serv_Ano_Creacion,

(SELECT TOP 1 Codigo
FROM [Murcia].[dbo].[tbl_Servicios_Montaje]
WHERE [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Inicio] <= '07/02/2014 14:17:51' AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Final] >= '07/02/2014 14:17:51'
AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Vehiculo] = a.NumeroVehiculo
AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Baja] IS NULL
ORDER BY [Murcia].[dbo].[tbl_Servicios_Montaje].[Vehiculo], [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Inicio], [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Final]
) as Serv_Codigo,

(SELECT TOP 1 Linea
FROM [Murcia].[dbo].[tbl_Servicios_Montaje]
WHERE [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Inicio] <= '07/02/2014 14:17:51' AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Final] >= '07/02/2014 14:17:51'
AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Vehiculo] = a.NumeroVehiculo
AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Baja] IS NULL
ORDER BY [Murcia].[dbo].[tbl_Servicios_Montaje].[Vehiculo], [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Inicio], [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Final]
) as Serv_Linea,

(SELECT TOP 1 Conductor
FROM [Murcia].[dbo].[tbl_Servicios_Montaje]
WHERE [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Inicio] <= '07/02/2014 14:17:51' AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Final] >= '07/02/2014 14:17:51'
AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Vehiculo] = a.NumeroVehiculo
AND [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Baja] IS NULL
ORDER BY [Murcia].[dbo].[tbl_Servicios_Montaje].[Vehiculo], [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Inicio], [Murcia].[dbo].[tbl_Servicios_Montaje].[Fecha_Hora_Final]
) as Serv_Conductor

FROM [SocGer].[dbo].[tbl_Vehiculos] as a
WHERE a.[Fecha_Baja] IS NULL
AND a.[Empresa_Colaboradora] IS NULL
ORDER BY a.NumeroVehiculo ASC

***************************************************************************
** El bloque ANTERIOR creaba los registros de la variable/tabla temporal
** Las líneas siguientes lo que hacen es traerme esos registros de esa
** variable/tabla temporal pero trayendo también registros de otra tabla
** mediante el uso de LEFT JOIN
***************************************************************************
SELECT s.Descripcion,
x.*
FROM @mi_tabla as x
LEFT JOIN [Murcia].[dbo].[tbl_Servicios] as s
ON x.Serv_Ano_Creacion = s.Ano_Creacion
AND x.Serv_Codigo = s.Codigo
WHERE x.RFID_Entrada > x.RFID_Salida
OR x.RFID_Entrada = x.RFID_Salida
OR ( x.RFID_Entrada IS NULL AND x.RFID_Salida IS NULL )
ORDER BY x.NumeroVehiculo ASC

fjcg02
07-02-2014, 21:38:21
Hola,
supongo que te sobra el execsql.

yo hago esto en un caso exactamente igaul y funciona de maravilla. En definitiva, creo una variable tipo tabla, hago un insert, recorro la tabla on un cursor y hago varios cálculos, ...

La llamada al botón de ejecutar es así.

procedure TForm1.EjecutarConsulta;
begin
ADOQuery1.Close;
ADOConnection1.Connected:= False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:= DBMemo1.Text;
DataSource1.DataSet:=ADOQuery1;
ADOConnection1.Connected:= True;
ADOQuery1.Open;
end;

El texto de la consulta lo tengo en un campo de una tabla (DBMemo1).

Saludos

olbeup
07-02-2014, 22:52:58
Hola SocGer,

Como dicen los compañeros, quita el ExecSQL.

No hace falta que abras el AdoConnection, ya se encarga el AdoQuery de hacerlo y, cuando cierres el AdoQuery, solo cierra el AdoConnection el cual cierra automáticamente el AdoQuery.

...
begin
with ado_Qry_Vehiculos_en_Base do
begin
SQL.Clear;
SQL.Add( ... una copia exacta de las líneas de arriba sql server ...);
Open;
end;
// Hacer lo que sea con los datos que te devuelve.
...
...
...
// Cerrar el AdoConnection
ado_Con_Vehiculos_en_Base.Close;
end;

Un saludo.

socger
08-02-2014, 07:31:55
A ver, esto ya lo probé por investigar en internet y ver en que fallaba.

Incluso con el .open y sin el execsql sigue persistiendo el problema.

A ver si fuera esto... Tengo SQL Server 2000 y Delphi 5 .... Esto es por si acaso alguien sabe de un tema de incompatibilidad.

Por cierto gracias a todos, chicos. Y muchas gracias por estar atentos... sobre todo a salv

Si encontráis el fallo me lo comentáis, de momento voy a crear una función que me devuelva lo que me interesa, que es otro aporte que he encontrado en internet como sugerencia.

Saludos