FoxPro/Visual FoxPro - Reporte Mensual en forma Horizontal en Vfp9

   
Vista:

Reporte Mensual en forma Horizontal en Vfp9

Publicado por Jesus (85 intervenciones) el 07/10/2013 17:47:12
Estoy Programando en Visual Foxpro 9 y mi Consulta es tengo una base de datos en donde grabo en forma normal (verticalmente) los datos de la Asistencia de Personal, Mis campos que tengo grabados hasta ahora son de la siguiente manera:

Nº - Código - Nombre - - Fecha -------- Día ---- Asistencia
1 ---- 1001 --- Juan ---- 01/07/-2013 -- Lunes ---- Asistió
2 ---- 1002 --- Carmen 01/07/2013 --- Lunes ---- Falto
3 ---- 1003 ---Luis ----- 01/07/2013 - -- Lunes ---- Asistió
4 ---- 1002 --- Carmen 02/07/2013 --- Martes ---- Asistió
5 ---- 1003 --- Luis ---- 02/07/2013 --- Martes ---- Asistió
6. ---- 1001 --- Juan --- 02/07/2013 --- Martes ---- Asistió
.
.
.
Pero me han pedido q saque un reporte en forma Horizontal mensualmente pero de los 30 o 31 días según el mes y no sé cómo hacerlo.
.
El reporte que me solicitan urgente lo quieren de esta manera:

Nº Código --- Nombre---- Lun 01-------- Mar 02-------- Mie 03----- Jue04--- ***-- Mar 31
1 - 1001-------- Juan ------- Asistió ------- Asistió ------ Asistió ------ Falto---- ***-- Asistió
2 - 1002-------- Carmen --- Falto --------- Asistió -------- Falto ------ Asistió---***-- Asistió
3 - 1003-------- Luis-------- Asistió ------- Asistió -------- Falto ------ Asistió--- ***-- Asistió
.
.

Mil Gracias por su Tiempo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Reporte Mensual en forma Horizontal en Vfp9

Publicado por Fidel (558 intervenciones) el 08/10/2013 00:06:08
Para determinar los días del mes, puedes utilizar la siguiente rutina (en lugar de cmonth() que puede dar un resultado erróneo).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
PROCEDURE Findemes(xMes,xAno)
*****************************
* Determina y devuelve el último día de un mes cualquiera (Fecha)
LOCAL Bi,lBisiesto,ldLast,nMid
 
if Vartype(xmes)="C"
	xmes=val(xmes)
endif
xmes=EVL(xmes,MONTH(DATE()))
if vartype(xano)="C"
	xano=Val(xano)
ENDIF
xano=EVL(xano,YEAR(DATE()))
 
nMid=15
ldLast=31
if xano=2000
	lBisiesto=.t.
else
	lBisiesto=iif(Mod(xAno,4)=0,iif(Mod(xano,25)=0,.f.,.t.),.f.)
ENDIF
 
DO case
	CASE xmes=2
		ldLast=IIF(lBisiesto,29,28)
	CASE INLIST(xmes,1,3,5,7,8,10,12)
		ldLast=31
	OTHERWISE
		ldLast=30
ENDCASE
 
RETURN DATE(xAno,xMes,ldLast)
ENDPROC

Para atacar el tema, lo puedes hacer a través de un array para generar un nuevo cursor.
Mira este ejemplo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
* Lee datos de un txt
* El archivo de.Txt lo generé con los datos que enviaste arriba.
 
CREATE CURSOR CUFUENTE ("orden" i,codigo n(4,0),"NOMBRE" C(40),"fecha" D,"DIA" C(15),"ASISTE" C(20))
SELECT CUFUENTE
APPEND FROM &DTEMP\DE.TXT DELIMITED
 
* Supuestos (normalmente parámetros)
nAno=2013
nMes=7
 
diaIni=DATE(nAno,nmes,1)        && función nativa
diaFin=Findemes(nmes,nano)  && función enviada arriba
ndias=DAY(diafin)
ni=1
DIMENSION gaCampos(1+ndias,4)
gaCampos[1,1]="NOMBRE"
gaCampos[1,2]="C"
gacampos[1,3]=40
gaCampos[1,4]=0
 
FOR i=1 TO nDias
	gaCampos[i+1,1]="Dia_"+LTRIM(STR(i))
	gaCampos[i+1,2]="C"
	gacampos[i+1,3]=15
	gaCampos[i+1,4]=0
NEXT
* Creamos el cursor transpositor desde el array
CREATE CURSOR curShow FROM ARRAY gacampos
SELECT curShow
INDEX on nombre TAG cursNom       && se indexa el cursor por nombre de empleado
lcExact=SET("Exact")
SET EXACT ON
 
SELECT CUFUENTE
SCAN
	lcNombre=ALLTRIM(nombre)
	ldDia=fecha
	ldNomDia=Dia
	lcAsiste=ALLTRIM(asiste)
	LcCampo="Dia_"+LTRIM(STR(DAY(fecha)))
	IF !INDEXSEEK(lcNombre,.f.,"CURSHOW","CURSNOM")
		INSERT INTO CURSHOW (NOMBRE) VALUES (lcNombre)
	ENDIF
	SELECT curshow
	INDEXSEEK(lcNombre,.t.,"CURSHOW","CURSNOM")
	replace (lcCampo) WITH CUFUENTE.asiste
ENDSCAN
SELECT curShow
BROWSE
 
SET EXACT &lcExact  && devuelve la configuración

Mejorando este código llegarás al resultado buscado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Reporte Mensual en forma Horizontal en Vfp9

Publicado por Jesus (85 intervenciones) el 09/10/2013 00:05:53
Estimado amigo he revisado tu ayuda y todo es bien pero la verdad no tengo mucha experiencia en estos procedimientos y cuando ejecuto el programita me sale este Error: EL ARCHIVO NO EXITE Y ME APUNTA AQUI EN LA LNEA : APPEND FROM &DTEMP\DE.TXT DELIMITED

si no es mucha molestia no habra una forma de q este Cursor CUFUENTE se alimente de una tabla q tengo llamada Asistencia y q tiene los mismo campos de estan en este ejemplo te digo esto por q no se como hacer esta rurina o procedimiento

Gracias nuevamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Reporte Mensual en forma Horizontal en Vfp9

Publicado por Jesus (85 intervenciones) el 09/10/2013 00:57:13
Estimado amigo gracias a tu ayuda he modificado un poco el codigo en base a mi realidad y ha quedado asi:

CLOSE DATABASES
SELECT 1
USE Ast_Alu2s

nAno=2013
nMes=9

Dcl_AstIni=DATE(nAno,nmes,1) && función nativa
Dcl_AstFin=Findemes(nmes,nano) && función enviada arriba
nDcl_Asts=DAY(Dcl_Astfin)
ni=1

DIMENSION gaCampos(1+nDcl_Asts,4)
gaCampos[1,1]="Dat_Alu"
gaCampos[1,2]="C"
gacampos[1,3]=40
gaCampos[1,4]=0

FOR i=1 TO nDcl_Asts
gaCampos[i+1,1]="Dcl_Ast_"+LTRIM(STR(i))
gaCampos[i+1,2]="C"
gacampos[i+1,3]=15
gaCampos[i+1,4]=0
NEXT

* Creamos el cursor transpositor desde el array
CREATE CURSOR curShow FROM ARRAY gacampos
SELECT curShow
INDEX on Dat_Alu TAG cursNom && se indexa el cursor por Dat_Alu de empleado
lcExact=SET("Exact")
SET EXACT ON

SELECT Ast_Alu2s
SCAN
lcDat_Alu=ALLTRIM(Dat_Alu)
ldDcl_Ast=Fec_Ast
ldNomDcl_Ast=Dcl_Ast
lcAsi_Ast=ALLTRIM(Asi_Ast)
LcCampo="Dcl_Ast_"+LTRIM(STR(DAY(Fec_Ast)))
IF !INDEXSEEK(lcDat_Alu,.f.,"CURSHOW","CURSNOM")
INSERT INTO CURSHOW (Dat_Alu) VALUES (lcDat_Alu)
ENDIF

SELECT curshow
INDEXSEEK(lcDat_Alu,.t.,"CURSHOW","CURSNOM")
replace (lcCampo) WITH Ast_Alu2s.Asi_Ast

ENDSCAN
SELECT curShow
BROWSE


Pero me gustaria q esta tabla final curshow tenga mas campos (sec_alu, cod_alu, etc) y en vez q las columnas tengan el nombre Dlc_ast_1, Dlc_ast_2, etc mas bien aparesca como nombre de columna la misma fecha ose 07/08/2013, 08/08/2013, etc.

De verdad mil disculpas por estas molestias y abusar de tus conocimientos.

Jesus
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Reporte Mensual en forma Horizontal en Vfp9

Publicado por Fidel (558 intervenciones) el 09/10/2013 14:30:08
Te digo algunas cositas:

1) Código inconveniente.
CLOSE DATABASES && esto cierra todas las bases de datos y tablas
&& usalo con precaución allí donde lo necesites
SELECT 1 && esta escritura es de FoxBase
USE Ast_Alu2s &&

USE AST_ALU2S IN 0 SHARED && prepara para uso compartido (Shared)
&& IN 0 te asegura que abrirá la tabla en la primer área disponible. De otra forma, si hay una tabla abierta en el área 1, se cerrará para abrir la nueva.

Combinando:

if !USED( "AST_ALU2S") && con esto se evita que se reabra la tabla
USE AST_ALU2S IN 0 SHARED
ENDIF
SELECT AST_ALU2S

2) Los nombres de campo de las tablas tienen algunas restricciones u otras, dependiendo si pertenecen a una base de datos (dbc) o no. Los nombres de tablas no pueden comenzar con un número y los caracteres admitidos son las letras, los números y guión bajo. Por lo tanto, un campo no puede llamarse 08/09/2013. Por otra parte en un cursor o tabla libre, los campos tienen un máximo de 10 caracteres. Por ejemplo, para un control grid, puedes crear los campos con el nombre que fuere y consignar los caption como te guste para cada header1 en cada columna.

3) Al cursor transpuesto le puedes agregar todos los campos que necesites. La estrategia es crear la matriz con más campos y luego cambiar el orden. Las tablas y cursores pueden tener hasta 254 campos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
nDias=10
ni=1
nPrevios=3
 
DIMENSION gaCampos(nPrevios+ndias,4)
 
gaCampos[ni,1]="NOMBRE"
gaCampos[ni,2]="C"
gacampos[ni,3]=40
gaCampos[ni,4]=0
 
ni=ni+1
gaCampos[ni,1]="sec_alu"
gaCampos[ni,2]="C"
gacampos[ni,3]=40
gaCampos[ni,4]=0
 
ni=ni+1
gaCampos[ni,1]="Cod_alu"
gaCampos[ni,2]="I"
gacampos[ni,3]=0
gaCampos[ni,4]=0
 
FOR i=1 TO nDias
	gaCampos[i+ni,1]="Dia_"+LTRIM(STR(i))
	gaCampos[i+ni,2]="C"
	gacampos[i+ni,3]=15
	gaCampos[i+ni,4]=0
NEXT
 
CREATE CURSOR pepe FROM ARRAY gaCampos
SELECT pepe
BROWSE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Reporte Mensual en forma Horizontal en Vfp9

Publicado por juan (47 intervenciones) el 09/10/2013 17:24:33
Jesus, trata de contactar con Jose Luis Guillen, el me paso un video y algo de codigo que trabaja con un capta huella y funciona perfectamente; no consegui el video en casa, pero en la red deberia estar, o trata de contactar con el.

Ah, se me olvidaba comentar, el video y el codigo que me paso es de su propia autoria. En el video lo veras a el explicando los paso a paso, alli veras su correo, contacta con el, te lo recomiendo, es 100 x 100 colaborador.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Reporte Mensual en forma Horizontal en Vfp9

Publicado por Jesus (85 intervenciones) el 09/10/2013 20:16:03
como me contacto con Jose Luis Guillen mi querido amigo Juan o me podrias pasar su correo de antemano mil gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Reporte Mensual en forma Horizontal en Vfp9

Publicado por Jesus (85 intervenciones) el 14/10/2013 20:15:09
Estimado Fidel una nueva consulta q cambios hago para q solamente q visualicen los campos con registro de asistencias por q también me jala los domimgos.

De antemano mil gracias nuevamente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Reporte Mensual en forma Horizontal en Vfp9

Publicado por Fidel (558 intervenciones) el 17/10/2013 01:24:15
Para detectar qué dia de la semana es, se utiliza la función Dow()

En la rutina, tienes que hacer una modificación en el momento de generar el cursor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
* Supuestos
nano=YEAR(DATE())
nmes=MONTH(DATE())
 
 
diaIni=DATE(nAno,nmes,1)        && función nativa
diaFin=Findemes(nmes,nano)  && función enviada arriba
ndias=DAY(diafin)
ni=1
DIMENSION gaCampos(1,4)
gaCampos[1,1]="NOMBRE"
gaCampos[1,2]="C"
gacampos[1,3]=40
gaCampos[1,4]=0
 
FOR i=1 TO nDias
	dDia=DATE(nAno,nmes,i)
	IF DOW(ddia,2)#7      && Dow(dia,2) la semana comienza el lunes y el domingo es 7.
		ni=ni+1
		DIMENSION gaCampos(ni,4)
		gaCampos[ni,1]="Dia_"+LTRIM(STR(i))
		gaCampos[ni,2]="C"
		gacampos[ni,3]=15
		gaCampos[ni,4]=0
	ENDIF
 
NEXT
* Creamos el cursor transpositor desde el array
CREATE CURSOR curShow FROM ARRAY gacampos
Con este código el cursor no tendrá dias domingo por definición.
De otra forma, habría que hacer un cómputo con los días en que alguien asistió a trabajar.
Por ejemplo en un array de una sola columna, pones todos los días con asistencia y luego, al generar el cursor, averiguas si el día en cuestión está en el array.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
* CursorFuente es el cursor que obtenés con el recorte de fechas
* suponiendo que definimos dia1 y dia2 como las fechas marco:
 
* SELECT * FROM AST_ALU2S ;
*            WHERE FECHA BETWEEN dia1 AND dia2 ;
*            INTO CURSOR CursorFuente
*
 
* Paso 1: Genero un array con fechas de asistencia
LOCAL ARRAY gaDias(1)
nd=0
SELECT cursorfuente
SCAN
	IF ASCAN(gaDias,fecha)=0
		nd=nd+1
		DIMENSION gaDias(nd)
		gaDias[nd]=Fecha
	ENDIF
ENDSCAN
 
* Paso 2: genero la estructura del cursor transpuesto.
 
* nAno y nMes, son parámetros en una rutina
nano=YEAR(DATE())
nmes=MONTH(DATE())
 
 
diaIni=DATE(nAno,nmes,1)        && función nativa
diaFin=Findemes(nmes,nano)  && función enviada arriba
ndias=DAY(diafin)
ni=1
DIMENSION gaCampos(1,4)
gaCampos[1,1]="NOMBRE"
gaCampos[1,2]="C"
gacampos[1,3]=40
gaCampos[1,4]=0
 
FOR i=1 TO nDias
	dDia=DATE(nAno,nmes,i)
	IF ASCAN(gadias,dDia)#0
		ni=ni+1
		DIMENSION gaCampos(ni,4)
		gaCampos[ni,1]="Dia_"+LTRIM(STR(i))
		gaCampos[ni,2]="C"
		gacampos[ni,3]=15
		gaCampos[ni,4]=0
	ENDIF
NEXT
* Paso 3: Creamos el cursor transpositor desde el array
CREATE CURSOR curShow FROM ARRAY gacampos
Este método tiene la ventaja de que además de no considerar los domingos, tampoco tomaría días feriados o asueto.

No sé cómo es realmente la estructura de la tabla. El campo Asistencia debería ser "L" (boolean) y con ello sería más fácil detectar algunas cuestiones. Asistió=.T., Faltó=.F.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Reporte Mensual en forma Horizontal en Vfp9

Publicado por Jesus (85 intervenciones) el 20/10/2013 17:25:18
Mil Gracias Fidel Por tu Apoyo y Ejemplos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar