Problemas con TMySQLDataSource.
Publicado: Dom Oct 07, 2007 5:30 pm
Hola a todos,
Estoy teniendo problemas al utilizar TMySQLDataSource con estructuras
complejas como por ejemplo la siguiente:
WITH OBJECT oGastos1 := TSQLQuery():New( Self )
:oDataSource := AppData:oConeMySQl
:cSelect := "SELECT NOMBREGASTO, "
FOR n:= 1 TO LEN( aaNosGastos )
:cSelect += "SUM( IF( ANO = " + ALLTRIM( STR( aaNosGastos[ n
], 4, 0 ) ) + ;
", IMPORTE_GASTO, 0 ) ) AS ANO" + ALLTRIM( STR(
aaNosGastos[ n ], 4, 0 ) ) + ", "
NEXT
:cSelect += "SUM( IMPORTE_GASTO ) AS SUMAGASTO FROM ( "
:cSelect += "SELECT gastos.N_CONTRATO, gastos.N_GASTO,
YEAR(gastos.FECHA) AS Ano, " +;
"contrato.DESCRIPCION, Sum(gastos.IMPORTE) AS
IMPORTE_GASTO, contrato.NCLIENTE, " +;
"clientes.NOMBRE, conceptosgastos.DESCRIPCION AS
NOMBREGASTO " +;
"FROM gastos Inner Join contrato ON gastos.N_CONTRATO
= contrato.N_CONTRATO " +;
"Inner Join clientes ON contrato.NCLIENTE =
clientes.NCLIENTE " +;
"Inner Join conceptosgastos ON gastos.N_GASTO =
conceptosgastos.CODIGO " +;
"GROUP BY gastos.N_CONTRATO, gastos.N_GASTO, Ano,
contrato.NCLIENTE, clientes.NOMBRE " +;
"HAVING gastos.N_CONTRATO = '" + cContrato + "' "
+;
"ORDER BY contrato.NCLIENTE, gastos.N_CONTRATO,
conceptosgastos.DESCRIPCION " +;
" ) AS consulta1 GROUP BY NOMBREGASTO"
:lOpen := .T.
:Create()
END WITH
Cuando pasa por el :Create da el siguiente error:
***************************** Registro de errores
*****************************
Fecha: 07-10-2007
Hora: 17:15:16
Memoria libre: 633912
Area actual: 1
------------------------- Información del compilador
--------------------------
Versión Xailer: Xailer 1.6.6 Version 1.6
Compilador: xHarbour build 0.99.61 Intl. (SimpLex) PCode Version: 7
Compilador C/C++: Borland C++ 5.5.1
Plataforma: Windows XP Professional 5.01.2600 Service Pack 2
----------------------- Información detallada del error
-----------------------
Subsistema: MySQL
Código de error: -1
Estado: .T.
Descripción: You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right
syntax to use near '(' at line 1
Operación: TMYSQLRECORDS:QUERYALL
Argumentos: [ 1] = Tipo: C Valor: SHOW INDEX FROM (
Fichero:
Código error SO: 0
Pila de llamadas:
TMYSQLRECORDS:QUERYALL (185)
TMYSQLRECORDS:OPEN (149)
TSQLQUERY:OPEN (308)
TDATASET:CREATE (222)
TSQLQUERY:CREATE (39)
TFORM1:BUTTON1CLICK (295)
TBUTTON:ONCLICK (0)
TBUTTON:CLICK (99)
(b)XCONTROL:XCONTROL (140)
TBUTTON:COMMAND (0)
TSCROLLINGWINCONTROL:WMCOMMAND (253)
TFORM1:WMCOMMAND (885)
RUNFORM (0)
TAPPLICATION:RUN (209)
MAIN (43)
Esta sentecia traducida al castellano es la siguiente:
SELECT NOMBREGASTO,
SUM( IF( ANO = 2005, IMPORTE_GASTO, 0 ) ) AS ANO2005 ,
SUM( IF( ANO = 2006, IMPORTE_GASTO, 0 ) ) AS ANO2006 ,
SUM( IF( ANO = 2007, IMPORTE_GASTO, 0 ) ) AS ANO2007 ,
SUM( IMPORTE_GASTO ) AS SUMAGASTO
FROM (
SELECT gastos.N_CONTRATO, gastos.N_GASTO, YEAR( gastos.FECHA )
AS Ano,
contrato.DESCRIPCION, Sum(gastos.IMPORTE) AS IMPORTE_GASTO,
contrato.NCLIENTE, clientes.NOMBRE,
conceptosgastos.DESCRIPCION AS NOMBREGASTO
FROM gastos
Inner Join contrato ON gastos.N_CONTRATO = contrato.N_CONTRATO
Inner Join clientes ON contrato.NCLIENTE = clientes.NCLIENTE
Inner Join conceptosgastos ON gastos.N_GASTO =
conceptosgastos.CODIGO
GROUP BY gastos.N_CONTRATO,
gastos.N_GASTO,
Ano,
contrato.NCLIENTE,
clientes.NOMBRE
HAVING gastos.N_CONTRATO = '0686-2-2006'
ORDER BY contrato.NCLIENTE, gastos.N_CONTRATO,
conceptosgastos.DESCRIPCION
) AS consulta
GROUP BY NOMBREGASTO
¿Existe alguna forma de hacer funcionar esta Select?
Estoy teniendo problemas al utilizar TMySQLDataSource con estructuras
complejas como por ejemplo la siguiente:
WITH OBJECT oGastos1 := TSQLQuery():New( Self )
:oDataSource := AppData:oConeMySQl
:cSelect := "SELECT NOMBREGASTO, "
FOR n:= 1 TO LEN( aaNosGastos )
:cSelect += "SUM( IF( ANO = " + ALLTRIM( STR( aaNosGastos[ n
], 4, 0 ) ) + ;
", IMPORTE_GASTO, 0 ) ) AS ANO" + ALLTRIM( STR(
aaNosGastos[ n ], 4, 0 ) ) + ", "
NEXT
:cSelect += "SUM( IMPORTE_GASTO ) AS SUMAGASTO FROM ( "
:cSelect += "SELECT gastos.N_CONTRATO, gastos.N_GASTO,
YEAR(gastos.FECHA) AS Ano, " +;
"contrato.DESCRIPCION, Sum(gastos.IMPORTE) AS
IMPORTE_GASTO, contrato.NCLIENTE, " +;
"clientes.NOMBRE, conceptosgastos.DESCRIPCION AS
NOMBREGASTO " +;
"FROM gastos Inner Join contrato ON gastos.N_CONTRATO
= contrato.N_CONTRATO " +;
"Inner Join clientes ON contrato.NCLIENTE =
clientes.NCLIENTE " +;
"Inner Join conceptosgastos ON gastos.N_GASTO =
conceptosgastos.CODIGO " +;
"GROUP BY gastos.N_CONTRATO, gastos.N_GASTO, Ano,
contrato.NCLIENTE, clientes.NOMBRE " +;
"HAVING gastos.N_CONTRATO = '" + cContrato + "' "
+;
"ORDER BY contrato.NCLIENTE, gastos.N_CONTRATO,
conceptosgastos.DESCRIPCION " +;
" ) AS consulta1 GROUP BY NOMBREGASTO"
:lOpen := .T.
:Create()
END WITH
Cuando pasa por el :Create da el siguiente error:
***************************** Registro de errores
*****************************
Fecha: 07-10-2007
Hora: 17:15:16
Memoria libre: 633912
Area actual: 1
------------------------- Información del compilador
--------------------------
Versión Xailer: Xailer 1.6.6 Version 1.6
Compilador: xHarbour build 0.99.61 Intl. (SimpLex) PCode Version: 7
Compilador C/C++: Borland C++ 5.5.1
Plataforma: Windows XP Professional 5.01.2600 Service Pack 2
----------------------- Información detallada del error
-----------------------
Subsistema: MySQL
Código de error: -1
Estado: .T.
Descripción: You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right
syntax to use near '(' at line 1
Operación: TMYSQLRECORDS:QUERYALL
Argumentos: [ 1] = Tipo: C Valor: SHOW INDEX FROM (
Fichero:
Código error SO: 0
Pila de llamadas:
TMYSQLRECORDS:QUERYALL (185)
TMYSQLRECORDS:OPEN (149)
TSQLQUERY:OPEN (308)
TDATASET:CREATE (222)
TSQLQUERY:CREATE (39)
TFORM1:BUTTON1CLICK (295)
TBUTTON:ONCLICK (0)
TBUTTON:CLICK (99)
(b)XCONTROL:XCONTROL (140)
TBUTTON:COMMAND (0)
TSCROLLINGWINCONTROL:WMCOMMAND (253)
TFORM1:WMCOMMAND (885)
RUNFORM (0)
TAPPLICATION:RUN (209)
MAIN (43)
Esta sentecia traducida al castellano es la siguiente:
SELECT NOMBREGASTO,
SUM( IF( ANO = 2005, IMPORTE_GASTO, 0 ) ) AS ANO2005 ,
SUM( IF( ANO = 2006, IMPORTE_GASTO, 0 ) ) AS ANO2006 ,
SUM( IF( ANO = 2007, IMPORTE_GASTO, 0 ) ) AS ANO2007 ,
SUM( IMPORTE_GASTO ) AS SUMAGASTO
FROM (
SELECT gastos.N_CONTRATO, gastos.N_GASTO, YEAR( gastos.FECHA )
AS Ano,
contrato.DESCRIPCION, Sum(gastos.IMPORTE) AS IMPORTE_GASTO,
contrato.NCLIENTE, clientes.NOMBRE,
conceptosgastos.DESCRIPCION AS NOMBREGASTO
FROM gastos
Inner Join contrato ON gastos.N_CONTRATO = contrato.N_CONTRATO
Inner Join clientes ON contrato.NCLIENTE = clientes.NCLIENTE
Inner Join conceptosgastos ON gastos.N_GASTO =
conceptosgastos.CODIGO
GROUP BY gastos.N_CONTRATO,
gastos.N_GASTO,
Ano,
contrato.NCLIENTE,
clientes.NOMBRE
HAVING gastos.N_CONTRATO = '0686-2-2006'
ORDER BY contrato.NCLIENTE, gastos.N_CONTRATO,
conceptosgastos.DESCRIPCION
) AS consulta
GROUP BY NOMBREGASTO
¿Existe alguna forma de hacer funcionar esta Select?