Anónimo
Informes
Hola experto necesito crear un informe de esta manera en mi tabla de aportes tengo código del cliente, fecha de aporte y el monto de aportación mensualmente.
Necesito obtener la cantidad de aportes por mes de cada cliente como este ejemplo.
Código-----Enero---Febrero----Marzo----Abril---etc
0001---------20----------50---------40--------10
0002---------50----------15---------20--------10
0003---------40----------30---------100------30
Necesito obtener la cantidad de aportes por mes de cada cliente como este ejemplo.
Código-----Enero---Febrero----Marzo----Abril---etc
0001---------20----------50---------40--------10
0002---------50----------15---------20--------10
0003---------40----------30---------100------30
1 respuesta
Respuesta de Cesar Enrique Yamunaque Baca
1
1
1) Crea un arreglo de 12 posiciones Local laArray[12] para acumular los montos
2) Ordena la tabla de aportes por código del cliente y fecha
3) El mes de la fecha del aporte te sirve como indice del array
laArray[MONTH(fecha)]=laArray[MONTH(fecha)]+monto
4) Cuando cambia el cliente imprimes el arreglo
2) Ordena la tabla de aportes por código del cliente y fecha
3) El mes de la fecha del aporte te sirve como indice del array
laArray[MONTH(fecha)]=laArray[MONTH(fecha)]+monto
4) Cuando cambia el cliente imprimes el arreglo
Hola gracias por responder pero no se como crear un array, pero trate de hacerlo por medio de sentencias selec de estas dos manera
El primer selec muestra la informacion que necesito pero de forma vertical y el codigo del cliente varias veces no deberia hacer eso, y el segundo selec muestra de forma horizontal pero cuenta los meses y necesito que se coloque los montos por meses
selec aportes.codigo, nombres, monto, MONTH(fecha)as Mes;
from datos!aportes, datos!cliente;
where cliente.codigo = aportes.cliente ;
into cursor meses1
brow
SELECT codigo, nombre, monto ;
sum(iif(MES=1,1,0)) as Enero,;
sum(iif(MES=2,1,0)) as Febrero,;
sum(iif(MES=3,1,0)) as Marzo,;
sum(iif(MES=4,1,0)) as Abril,;
sum(iif(MES=5,1,0)) as Mayo,;
sum(iif(MES=6,1,0)) as Junio,;
sum(iif(MES=7,1,0)) as Julio,;
sum(iif(MES=8,1,0)) as Agosto,;
sum(iif(MES=9,1,0)) as Setiembre,;
sum(iif(MES=10,1,0)) as Octubre,;
sum(iif(MES=11,1,0)) as Noviembre,;
sum(iif(MES=12,1,0)) as Diciembre ;
FROM meses1 group by codigo into cursor temp1
BROW
El primer selec muestra la informacion que necesito pero de forma vertical y el codigo del cliente varias veces no deberia hacer eso, y el segundo selec muestra de forma horizontal pero cuenta los meses y necesito que se coloque los montos por meses
selec aportes.codigo, nombres, monto, MONTH(fecha)as Mes;
from datos!aportes, datos!cliente;
where cliente.codigo = aportes.cliente ;
into cursor meses1
brow
SELECT codigo, nombre, monto ;
sum(iif(MES=1,1,0)) as Enero,;
sum(iif(MES=2,1,0)) as Febrero,;
sum(iif(MES=3,1,0)) as Marzo,;
sum(iif(MES=4,1,0)) as Abril,;
sum(iif(MES=5,1,0)) as Mayo,;
sum(iif(MES=6,1,0)) as Junio,;
sum(iif(MES=7,1,0)) as Julio,;
sum(iif(MES=8,1,0)) as Agosto,;
sum(iif(MES=9,1,0)) as Setiembre,;
sum(iif(MES=10,1,0)) as Octubre,;
sum(iif(MES=11,1,0)) as Noviembre,;
sum(iif(MES=12,1,0)) as Diciembre ;
FROM meses1 group by codigo into cursor temp1
BROW
estas por ahí, prueba con el siguiente código
DIMENSION SumaValor[12,1]
DIMENSION Meses[12,1]
meses[1,1]="enero"
meses[2,1]="Febrero"
meses[3,1]="Marzo"
meses[4,1]="Abril"
meses[5,1]="Mayo"
meses[6,1]="Junio"
meses[7,1]="Julio"
meses[8,1]="Agosto"
meses[9,1]="Setiembre"
meses[10,1]="Octubre"
meses[11,1]="Noviembre"
meses[12,1]="Diciembre"
CREATE cursor totales (CodCli c(10))
FOR x=1 TO 12
STORE 0 TO SumaValor[12,1]
campo=meses[x,1]
ALTER TABLE totales;
ADD COLUMN &campo N(10,2)
ENDFOR
INDEX ON codcli TAG codigo ADDITIVE
SELECT("tablaAportes")
SCAN
IF !SEEK(mi_codigo,"SumaValor","codigo")
APPEND BLANK IN sumaValor
REPLACE codcli WITH mi_codigo;
IN SumaValor
ENDIF
x=MONTH(fecha)
campo=meses[x,1]
REPLACE &campo WITH &campo+tablaAportes.valor;
IN SumaValor
ENDSCAN
Lo que hace es crear un cursor con los campos numéricos de enero a diciembre, luego lees el archivo de aportes, para este caso ya no interesa el orden, ya que busca en el archivo de sumas por cada registro de la tabla de aportes
la otra opción es ordenar el archivo de pagos por cliente y grabar el archivo de sumas cuando cambia el cliente
SELECT("tablaAportes")
mi_codcli=tablaAportes.codcli
SCAN
IF tablaAportes.codcli#mi_codcli
=write_suma()
ENDIF
x=MONTH(fecha)
campo=meses[x,1]
sumaValor[x,1]=sumaValor[x,1]+tablAportes.valor
ENDSCAN
FUNCTION write_suma
IF !SEEK(mi_codigo,"SumaValor","codigo")
APPEND BLANK IN sumaValor
REPLACE codcli WITH mi_codigo;
IN SumaValor
ENDIF
FOR x=1 TO 12
campo=meses[x,1]
REPLACE &campo WITH sumaValor[x,1];
IN SumaValor
STORE 0 TO SumaValor[x,1]
ENDFOR
Endfunc
DIMENSION SumaValor[12,1]
DIMENSION Meses[12,1]
meses[1,1]="enero"
meses[2,1]="Febrero"
meses[3,1]="Marzo"
meses[4,1]="Abril"
meses[5,1]="Mayo"
meses[6,1]="Junio"
meses[7,1]="Julio"
meses[8,1]="Agosto"
meses[9,1]="Setiembre"
meses[10,1]="Octubre"
meses[11,1]="Noviembre"
meses[12,1]="Diciembre"
CREATE cursor totales (CodCli c(10))
FOR x=1 TO 12
STORE 0 TO SumaValor[12,1]
campo=meses[x,1]
ALTER TABLE totales;
ADD COLUMN &campo N(10,2)
ENDFOR
INDEX ON codcli TAG codigo ADDITIVE
SELECT("tablaAportes")
SCAN
IF !SEEK(mi_codigo,"SumaValor","codigo")
APPEND BLANK IN sumaValor
REPLACE codcli WITH mi_codigo;
IN SumaValor
ENDIF
x=MONTH(fecha)
campo=meses[x,1]
REPLACE &campo WITH &campo+tablaAportes.valor;
IN SumaValor
ENDSCAN
Lo que hace es crear un cursor con los campos numéricos de enero a diciembre, luego lees el archivo de aportes, para este caso ya no interesa el orden, ya que busca en el archivo de sumas por cada registro de la tabla de aportes
la otra opción es ordenar el archivo de pagos por cliente y grabar el archivo de sumas cuando cambia el cliente
SELECT("tablaAportes")
mi_codcli=tablaAportes.codcli
SCAN
IF tablaAportes.codcli#mi_codcli
=write_suma()
ENDIF
x=MONTH(fecha)
campo=meses[x,1]
sumaValor[x,1]=sumaValor[x,1]+tablAportes.valor
ENDSCAN
FUNCTION write_suma
IF !SEEK(mi_codigo,"SumaValor","codigo")
APPEND BLANK IN sumaValor
REPLACE codcli WITH mi_codigo;
IN SumaValor
ENDIF
FOR x=1 TO 12
campo=meses[x,1]
REPLACE &campo WITH sumaValor[x,1];
IN SumaValor
STORE 0 TO SumaValor[x,1]
ENDFOR
Endfunc
Hola gracias amigo por el procedimiento pero me muestra una linea de error que dice ' no se encuentra el alias', la palabra mi_codigo lo reemplace por el campo de la tabla aporte que es cod_cli, aquí esta la linea donde muestra error, ademas el procedimiento lo pegue en un prg y cambie los selec por use.
IF !SEEK(cod_cli,"SumaValor","codigo")
IF !SEEK(cod_cli,"SumaValor","codigo")
La instrucción USE se usa para abrir o cerrar archivos, entonces si cambiaste SELECT(TablaAportes") por USE("tablaAportes") lo que estas haciendo es cerrar el archivo y al momento de ejecutar el seek() el programa no encuentra la variable por que es una variable del archivo cerrado en este caso TablaAportes.
Para que el prg funcione, reemplaza "TablaAportes" por el nombre de tu tabla de aportes, y mi_codigo por la variable correspondiente al código del cliente y regresa los Select a su estado original, ya que con ellos te posicionas en el archivo para leerlo.
Espero haberme dejado entender, me avisas com va el programa
saludos
Para que el prg funcione, reemplaza "TablaAportes" por el nombre de tu tabla de aportes, y mi_codigo por la variable correspondiente al código del cliente y regresa los Select a su estado original, ya que con ellos te posicionas en el archivo para leerlo.
Espero haberme dejado entender, me avisas com va el programa
saludos
Hola revise y hice los cambios que me dijiste pero me sigue saliendo erro en esta linea, justo en el IF !SEEK(so_codi,"SumaValor","codigo") muestra un mensaje que "No encuentra el alias"
SELECT("aportes")
SCAN
IF !SEEK(so_codi,"SumaValor","codigo")
APPEND BLANK IN SumaValor
REPLACE CodCli WITH so_codi;
IN SumaValor
ENDIF
x=MONTH(fecha)
campo=meses[x,1]
REPLACE &campo WITH &campo+aportes.valor;
IN SumaValor
Endscan
SELECT("aportes")
SCAN
IF !SEEK(so_codi,"SumaValor","codigo")
APPEND BLANK IN SumaValor
REPLACE CodCli WITH so_codi;
IN SumaValor
ENDIF
x=MONTH(fecha)
campo=meses[x,1]
REPLACE &campo WITH &campo+aportes.valor;
IN SumaValor
Endscan
Ya vi el error
IF !SEEK(mi_codigo,"SumaValor","codigo")
APPEND BLANK IN sumaValor
REPLACE codcli WITH mi_codigo;
IN SumaValor
ENDIF
x=MONTH(fecha)
campo=meses[x,1]
REPLACE &campo WITH &campo+tablaAportes.valor;
IN SumaValor
Endscan
Reemplaza por
IF !SEEK(mi_codigo,"Totales","codigo")
APPEND BLANK IN sumaValor
REPLACE codcli WITH mi_codigo;
IN Totales
ENDIF
x=MONTH(fecha)
campo=meses[x,1]
REPLACE &campo WITH &campo+tablaAportes.valor;
IN Totales
Endscan
Mil disculpas
IF !SEEK(mi_codigo,"SumaValor","codigo")
APPEND BLANK IN sumaValor
REPLACE codcli WITH mi_codigo;
IN SumaValor
ENDIF
x=MONTH(fecha)
campo=meses[x,1]
REPLACE &campo WITH &campo+tablaAportes.valor;
IN SumaValor
Endscan
Reemplaza por
IF !SEEK(mi_codigo,"Totales","codigo")
APPEND BLANK IN sumaValor
REPLACE codcli WITH mi_codigo;
IN Totales
ENDIF
x=MONTH(fecha)
campo=meses[x,1]
REPLACE &campo WITH &campo+tablaAportes.valor;
IN Totales
Endscan
Mil disculpas
Hola más bien disculpame a mi por estar molestándote y agradezco la paciencia que tienes gracias.
Tengo unas dificultades mira
Cambie fecha por date() hasta ahí va bien
x=MONTH(fecha)
pero el error muestra en esta linea no se encuentra la variable "valor" a que refiere
REPLACE &campo WITH &campo+Aportes.valor;
Tengo unas dificultades mira
Cambie fecha por date() hasta ahí va bien
x=MONTH(fecha)
pero el error muestra en esta linea no se encuentra la variable "valor" a que refiere
REPLACE &campo WITH &campo+Aportes.valor;
La variable valor se refiere al campo que usas en tu tabla de aportes, yo coloque valor por colocar un nombre, simplemente reemplázalo por el nombre de campo que lleva el importe que deseas sumar, el campo fecha es la fecha que trae tu archivo de aportes.
Hola amigo como estas te contare lo que voy haciendo en esta linea cambie
IF tablaAportes.codcli#mi_codcli
por
IF aportes.so_codi=mi_codcli
pero me presento un problemita en la linea
sumaValor[x,1]=sumaValor[x,1]+aportes.ap_mont
el error dice "Incompatibilbidad en el tipo de operador u operando"
SELECT("aportes")
mi_codcli=aportes.so_codi
SCAN
IF aportes.so_codi=mi_codcli
=write_suma()
ENDIF
x=MONTH(date())
campo=meses[x,1]
sumaValor[x,1]=sumaValor[x,1]+aportes.ap_mont
ENDSCAN
IF tablaAportes.codcli#mi_codcli
por
IF aportes.so_codi=mi_codcli
pero me presento un problemita en la linea
sumaValor[x,1]=sumaValor[x,1]+aportes.ap_mont
el error dice "Incompatibilbidad en el tipo de operador u operando"
SELECT("aportes")
mi_codcli=aportes.so_codi
SCAN
IF aportes.so_codi=mi_codcli
=write_suma()
ENDIF
x=MONTH(date())
campo=meses[x,1]
sumaValor[x,1]=sumaValor[x,1]+aportes.ap_mont
ENDSCAN
Generalmente VFP inicializa todas las variables como lógicas colocando por default falso así que inicaliza los componentes del array sumaValor con cero cada vez que los necesites
FOR X=1 TO 12
STORE 0 TO SumaValor[x,1]
Endfor
Sigue adelante.
FOR X=1 TO 12
STORE 0 TO SumaValor[x,1]
Endfor
Sigue adelante.
Hola gracias no salio ningún error pero una pregunta como hago para ver los resultados
- Compartir respuesta
- Anónimo
ahora mismo