FoxPro/Visual FoxPro - Contar movimientos y agregar registro en tabla

 
Vista:

Contar movimientos y agregar registro en tabla

Publicado por Daniel M (1 intervención) el 31/08/2013 05:05:50
Este código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT A2.* FROM A2 WHERE A2.fec_mov <= {^2013/06/30} into CURSOR A2DM
 
  select A1
  scan
  ID_FIL12 = A1.id_lisfil
  CONTAD1 = 0
   select A2DM
	 scan
	 if A2DM.id_lisfil = ID_FIL12
     CONTAD1 = CONTAD1 + (can_mov * tip_mov)
   endif
  endscan
    select A2
    append blank
    replace id_lisfil with A1.id_lisfil, id_lisveh with 484, id_placta with 52, fec_mov with {^2013/07/01}
    replace can_mov with CONTAD1, est_mov with 0, tip_mov with 0, cnt_mov with .T., pre_mov with A1.pre_fil
 endscan
 
select A2
=tableupdate(.T.)

pretende tomar los artículos de la tabla A1, buscar todos los movimientos de cada artículo en la tabla A2, contar entradas (tip_mov: +1) y salidas (tip_mov: -1) y luego generar un registro para cada artículo en la tabla A2 con el stock al día 30/06/2013. Luego tomando estos registros de A2, generar un reporte tipo balance contable.
Problema: no realiza correctamente el conteo ya que algunos registros se generan con errores en el campo can_mov.
Desde ya muchas gracias.
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
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Contar movimientos y agregar registro en tabla

Publicado por Fidel (558 intervenciones) el 31/08/2013 17:22:49
No es aconsejable anidar SCAN.
Propongo algunas modificaciones al código que tal vez te sirvan. (no alcanzo a comprender tu necesidad, pero algunas cosas se deducen del código).
Básicamente:
a) Crear el cursor como READWRITE
b) Generar un índice para el cursor
c) Trabajar con el índice del cursor combinado Indeseek con Do While en lugar del segundo SCAN
d) Reemplazar APPEND BLANK c/ replace por INSERT INTO que es mucho más eficiente.
e) Usar la función Date() en lugar de una transformación.
f) Debes comprobar si el cursor tiene datos (_tally). Para el caso no afecta, pero es una cuestión de buenas costumbres.

Tus nombres de tablas y cursores me resultan poco descriptivos. Esto de A1, A2 a mi me producen confusiones. Je!

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
LOCAL LcExact, dFechaCalc, dFechaInit
lcExact=SET("Exact")
dFechaCalc=DATE(2013,6,30)
dFechaInit=dFEchaCalc + 1
SELECT A2.* FROM A2 WHERE A2.fec_mov <= m.dFechaCalc ;
	into CURSOR A2DM readwrite
IF _tally=0
	MESSAGEBOX("No hay coincidencias")
	SELECT A2DM
	USE
	RETURN
ENDIF
SET EXACT ON
 
SELECT A2DM
INDEX ON ID_LISFIL TAG IA2DM
SET ORDER TO IA2DM
 
select A1
scan
	ID_FIL12 = A1.id_lisfil
	CONTAD1 = 0
	IF INDEXSEEK(m.ID_FIL12,.F.,"A2DM","IA2DM")
		select A2DM
		INDEXSEEK(m.id_fil12,.t.,"A2DM","IA2DM")
		DO WHILE ID_LISFIL = m.ID_FIL12
	 		CONTAD1 = m.CONTAD1 + (can_mov * tip_mov)
	 		SKIP
	 		IF EOF()
	 			EXIT
	 		ENDIF
	 	ENDDO
	ENDIF
	INSERT INTO a2 (id_lisfil,id_lisveh,id_placta,fec_mov,;
		can_mov,est_mov,tip_mov,cnt_mov,pre_mov) ;
		values (A1.id_lisfil,484,52,m.dFechaInit,;
		m.CONTAD1,0,0,.t.,A1.pre_fil)
 
endscan
SET EXACT &lcExact
 
select A2
=tableupdate(.T.)
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