FoxPro/Visual FoxPro - Append sin tener que hacer un use y un close despues

 
Vista:

Append sin tener que hacer un use y un close despues

Publicado por es_binario (757 intervenciones) el 13/01/2012 21:14:23
Que tal amigos del foro, tengo una actualizacion de precios de una base de datos de foxbase me imagino que es de un programa hecho en fox 2.6 que da el proveedor a mi cliente, el caso es que tengo una rutina que hace la actualizacion de precios a partir de esta tabla que es un dbf, acabo de hacer una rutina mucho mas rapida a una anterior que ya antes habia posteado aqui, esta rutina evita un for next que barra la tabla para actualizar la mia propia.

El caso es que esta rutina para evitar problemas se actualiza y debe cerrar el programa y despues volverlo a abrir para que no haya problemas de tablas abiertas, espero me entiendan, pongo aqui parte del codigo para que sea mas claro lo que ocurre al cerrarlo

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
LOCAL rut as Character
LOCAL nvo_prec as Number
 
rut = "C:\nds6int\Bases\ARTICULO.DBF"
 
WAIT "Espere por favor..." WINDOW TIMEOUT 2
 
TRY
	CLOSE ALL
	*// intenta usar nadro
		OPEN DATABASE "C:\Farmaciai2\datos\datos.dbc"
		USE &rut ALIAS nadro  IN 0
 
	*// actualizar precios
	UPDATE articulos SET articulos.p_anterior = 0
	UPDATE articulos SET articulos.p_anterior = articulos.p_publico
 
		UPDATE articulos SET articulos.p_farmaci3;
	 		= (select prec_pub as p_publico from nadro WHERE nadro.cod_nad = articulos.code_nadro)
	 	UPDATE articulos SET articulos.p_farmaci2;
	 		= (select prec_farm from nadro WHERE nadro.cod_nad = articulos.code_nadro)
 
	UPDATE articulos SET articulos.p_publico = 0 WHERE ISNULL(articulos.p_publico) = .T.
 
	*// actualiza los precios de un upd
	UPDATE articulos SET articulos.p_publico = articulos.p_farmaci3;
		WHERE articulos.p_farmaci3 > articulos.p_publico
 
	UPDATE articulos SET articulos.p_farmacia = articulos.p_farmaci2;
		WHERE articulos.p_farmaci2 > articulos.p_farmacia
 
	*// actualiza los movimientos
	UPDATE articulos SET articulos.movim = (select movim from nadro WHERE nadro.cod_nad = articulos.code_nadro)
	*// los articulos que no se encuentran registrados
	SELECT * FROM nadro WHERE cod_nad NOT in (SELECT code_nadro FROM articulos);
		INTO CURSOR nuevos_art


en este punto sigue unas declaracion de variables con local que no pondre para no hacer tan pesada su lectura y despues continuo con unos parametros basicos pero todo el problema se basa en el

1
2
3
4
CLOSE ALL
	*// intenta usar nadro
		OPEN DATABASE "C:\Farmaciai2\datos\datos.dbc"
		USE &rut ALIAS nadro  IN 0



esto lo hago considerando que el cliente, puede ejecutar mas de una vez esta rutina en un dia

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
*// actualizar precios
	UPDATE articulos SET articulos.p_anterior = 0
	UPDATE articulos SET articulos.p_anterior = articulos.p_publico
 
		UPDATE articulos SET articulos.p_farmaci3;
	 		= (select prec_pub as p_publico from nadro WHERE nadro.cod_nad = articulos.code_nadro)
	 	UPDATE articulos SET articulos.p_farmaci2;
	 		= (select prec_farm from nadro WHERE nadro.cod_nad = articulos.code_nadro)
 
	UPDATE articulos SET articulos.p_publico = 0 WHERE ISNULL(articulos.p_publico) = .T.
 
	*// actualiza los precios de un upd
	UPDATE articulos SET articulos.p_publico = articulos.p_farmaci3;
		WHERE articulos.p_farmaci3 > articulos.p_publico
 
	UPDATE articulos SET articulos.p_farmacia = articulos.p_farmaci2;
		WHERE articulos.p_farmaci2 > articulos.p_farmacia
 
	*// actualiza los movimientos
	UPDATE articulos SET articulos.movim = (select movim from nadro WHERE nadro.cod_nad = articulos.code_nadro)
	*// los articulos que no se encuentran registrados
	SELECT * FROM nadro WHERE cod_nad NOT in (SELECT code_nadro FROM articulos);
		INTO CURSOR nuevos_art


1
2
3
4
INSERT INTO articulos (cod_barra , descrip , p_farmacia , cve_dev , cve_refr , code_nadro , cve_ssa , cve_onco , cve_susp , cve_espe , familia , laborato , margen , gravaiva , movim ,departam , categori);
					VALUES    (cod_barra_, descrip_, p_farmacia_, cve_dev_, cve_refr_, code_nadro_, cve_ssa_, cve_onco_, cve_susp_, cve_espe_, familia_, laborato_, margen_, gravaiva_, movim_,departam_, categori_)
	ENDFOR
	*/// insert art --------------


esta rutina se executa en menos de un segundo con mas de 20 mil productos lo que la hace muy eficiente pero lamentablemente le tengo que hacer un quit al formilario para evitar que si la ejecutan por segunda ocacion y marque un error de tabla en uso, y caiuse un cierre inesperado e incluso pueda da;ar tablas abiertas en ese momento.

gracias por tamarse la molestia de ver mi codigo y hacerme alguna sugerencia, 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