.
Lo que hago yo es procesarlo después, ya en el fox. Al ejecutar una consulta como la propones lo que pasa es que se suman registros. Tantos registros como coincidencias.
.
Como regla se trata siempre de evitar la adición de columnas, o sea, expandir una tabla para la derecha. Por ejemplo hacer: cliente, mes1, mes2, mes3... estaría mal. Salvo que esas columnas fueran fijas. Por ejemplo últimos 12 periodos. Como podría ser: cliente, 201401, 201402.. 201412..
En este ultimo caso siempre son doce campos los de tu tabla. Esos campos son siempre 12 pero no quiere decir que sean fijos. Por ejemplo podrías armarte las variables de cada periodo. Algo así:
.
mPeriodo01='201311'
mPeriodo02='201312'
mPeriodo03='201401'
.
De esta manera tienes los valores que mostrás en cada campo. Después te quedaría solamente hacer la consulta y cambiarle el texto al header de la columna del grid para que el usuario sepa cual es.
.
Para ejecutar la consulta con esta variante podrías hacer algo así:
.
select cct0020.ccta, sum(if(ccta002.periodo=?mPeriodo01,ccta002.imp,0)) columna01, sum(if(ccta02.periodo=?mPeriodo02,ccta002.imp,0)cct0020) columna02
from cct0020
group by cct0020.ccta
.
Te lo explico:
Ccta002.periodo=? MPeriodo01 compara que el periodo sea el que contiene la variable mPeriodo01 (en este caso 201311)
.
Al ponerlo adentro de un if (fíjate que en fox es iif y en sql if) lo que pasa es que si el valor de respuesta es verdadero devuelve el importe, sino cero.
.
if(ccta02.periodo=?mPeriodo02,ccta002.imp,0) y esta función la ponemos dentro de un sum() para que vaya sumando.
.
Para lo otro, es decir para filtrar por determinados centros de costo lo que yo hago es tener una tabla en sql con ese filtro, relacionarla y filtrar. Eso seria lo optimo. También podría ser un literal que lo vayas armando.
.
Si tienes una tabla para filtrar en la base de datos sería algo así:
.
Suponte que tienes una tabla en la base de datos que es para filtrado con esta estructura.
.
Ccta, usuario, seleccionado
.
Después en tu programa tienes un usuario: por ejemplo mUsuario=1
.
Cuando marcas o desmarcas alguno de los centros de costos en el valid del control que marca (puede ser en el checkBox) enviarías a sql lo siguiente
mUsuario=1 &&(el valor que corresponda)
mCta=93133301
mSeleccionado=.t. &&(seleccionado)
update filtro set seleccionado=?mValor where usuario=?mUsuario and cta=?mCta
.
Después en tu consulta faltaría agregarle el left joind y la codicion.
.
left join filtro on ccta0020.ccta=filtro.cta
.
y en el where faltaria agregarle
.
and filtro.seleccionado and filtro.usuario=?mUsuario
Espero haberte podido ayudar. Tu consulta es algo que se hace en modo experto por lo cual es un poco difícil de explicar. Te recomiendo que practiques con el sql, hagas consultas desde el sql y veas los resultados, después, cuando es lo que esperas recién copies tu consulta y la pases a fox adentro de un text to..
Muchas gracias. Estamos en contacto
Christian, Keystone