Sunteți pe pagina 1din 19

LiveUpdate para Mirror de Datos en Red LAN/WAN

Posted By admin On Noviembre 22, 2007 @ 4:20 am In FoxPro Red/Internet | No


Comments

Publicado originalmente por mi en PortalFox (20,Julio,2004)

Que tal, les comparto un programa casi completo para realizar un LiveUpdate o Actualizacion de Datos
cuando el Servidor no esta dedicado, y el sistema es usado por otras computadoras que requieren tener
los datos actualizados.

En este programa he sustituido la funcion IP_PING de Focus Library por otras APIS que encontre aqui
en PortalFox, asi como algunas rutinas viejas de mis programas de FPW 2.6

Fue probado bajo VFP7 en Win98, WinXP, WinME


Util cuando deseamos tener Mirror como Backups, o por alguna razon no tenemos Server dedicado y
ademas trabajamos con sucursales conectados mediante antenas en otros puntos de la ciudad.

NOTA: Aunque todo el codigo esta aqui, incluyendo las funciones necesarias, aun falta el programa
llamado 3D.PRG de KenLevy (util en FPW) que por espacio no he colocado, aun debe circular por la
red.

1. *cActualiza.prg
2. *Programa que verificara que si estamos en red, revise los archivos de datos para
3. *actualizar de manera automatica cuando entramos al programa, de esta forma
4. *siempre tendremos los datos mas actualizados sin intervencion de los usuarios o el
5. *administrador.
6. *
7. * Este programa es LiveUpdate porque se decidio hacer “mirror” (espejo) de los datos en 2
empresas diferentes
8. * y el servidor de datos no esta dedicado, es decir, no sabemos si estara encendido o no, pero
aqui es donde
9. * se capturan los datos; por tal motivo, estos se deben replicar, asi como sus imagenes a otras 2
computadoras
10. * de la red para que no dependan de una conexion de red viva. (EJ. como se usa LAN y WAN,
quiza pueda haber problemas
11. * con la antena, el radio (bridge), el router, el hub, el cable, haya una falla electrica en una
seccion que
12. * haga que el servidor este apagado pero la computadora remota no, de esta forma al tener los
datos de manera
13. * local el trabajo no se interrumpe, pero para hacer las actualizaciones de manera transparente, el
propio
14. * sistema (con este programa) buscara las actualizaciones de datos necesarias o nuevos archivos
que se incorporen
15. * siempre que haya estos cambios y todo este funcionando de manera correcta. En caso de no ser
asi, trabajara con
16. * los datos locales, y en cuanto se restablezcan las conexiones, el sistema se actualizara.
17. *
18. * Como beneficio, no ocuparemos el ancho de banda de la red al estar consultando directamente
a un servidor por lo
19. * que otras aplicaciones podran mejorar su desempeño.
20. *
21. *
22. * Lic. Sergio Hugo Sanchez
23. * H. Matamoros, Tam. - ID Systems
24. * 24, Junio, 2004.
25. *
26. * NOTA: En algunas ocasiones en WinXP no funciona el mapeo ni por WSH ni por API de
manera directa, solo
27. * mediante conexion con caja de dialogo. He probado algunas variantes sin exito, sin embargo,
no siempre es
28. * asi ya que en algunos WinXP si funciona al igual que Win98, WinME. Para resolver el
problema hay que tener
29. * mapeada la unidad desde el propio Windows.
30. *
31. SET TALK OFF
32. SET ECHO OFF
33. SET SAFETY OFF
34.
35. * PASO 1
36. * El primer paso es checar si NUESTRA computadora esta conectada a la RED.
37. * Esto se hace para saber si checamos la conexion con el servidor o no.
38. *
39. NETWORK_ALIVE_AOL = 0×4
40. NETWORK_ALIVE_LAN = 0×1
41. NETWORK_ALIVE_WAN = 0×2
42. DECLARE LONG IsNetworkAlive IN “SENSAPI.DLL” LONG @lpdwFlags
43. LOCAL nRet AS LONG
44. nRet = 0
45. nRet = IsNetworkAlive(@nRet)
46. IF nRet = 0 THEN
47. MESSAGEBOX( “La computadora no esta conectada a ninguna red!” )
48. * Puesto que la computadora no esta conectada a la red, (no hay conexion,
49. * hub apagado, falla el cable, etc.) No tiene caso continuar verificando las
50. * conexiones
51. RETURN
52. ENDIF
53. IF nRet = NETWORK_ALIVE_WAN
54. =WorkBox( “La PC esta conectada a una red wan” )
55. ENDIF
56. IF nRet = NETWORK_ALIVE_AOL
57. =WorkBox( “La pc esta conectada a una red AOL” )
58. ENDIF
59. IF nRet = NETWORK_ALIVE_LAN
60. =WorkBox( “La pc esta conectada a una red Lan” )
61. ENDIF
62.
63. * PASO 1A
64. * Leer del archivo INI la configuracion del server para este cliente
65. * Este es un archivo de texto en el directorio de la aplicacion que se modifica con un block de
notas
66. * en las secciones que corresponden.
67. *
68. lcComputadora = ReadFileIni(“C:clientes.ini”,“Red”,“Computer”)
69. lcServidor = ReadFileIni(“C:clientes.ini”,“Red”,“Servidor”)
70. lcFolderData = ReadFileIni(“C:clientes.ini”,“Red”,“FolderServer”)
71. lcFolderImg = ReadFileIni(“C:clientes.ini”,“Red”,“FolImgServer”)
72. lcDirEmpresa = ReadFileIni(“C:clientes.ini”,“Consulta”,“DirEmpresa”)
73. * Con estos datos podemos conectarnos al Servidor
74. *
75.
76. * PASO 2
77. * El segundo paso es saber si el SERVIDOR esta TAMBIEN CONECTADO a la red.
78. * Es posible que nosotros estemos conectados, pero el Server principal o donde estan los
79. * datos no, asi que tampoco habra actualizacion
80. *
81. DECLARE LONG IsDestinationReachable IN “SENSAPI.DLL” ;
82. STRING lpszDestination, ;
83. LONG lpQOCInfo
84. *lnOK = IsDestinationReachable( “Sistemas”, 0 )
85. lnOK = IsDestinationReachable( lcComputadora, 0 )
86. IF lnOK = 0
87. MESSAGEBOX( “El Servidor no esta conectado a la red!” )
88. * Puesto que no hay servicio de Server, no hacemos nada
89. =WorkBox( “El servidor no esta conectado” )
90. =WorkBox( “CLEANUP” )
91. RETURN
92. ENDIF
93. =WorkBox( “El servidor esta conectado” )
94.
95. * Mapear el servidor, si no, no funcionara el DIR que haremos despues.
96. * Primero debemos checar que no este mapeado de manera anterior o nos dara error
97. IF DirExist( “F:\” )
98. * No hacemos nada, ya que esta mapeado anteriormente
99. ELSE
100. * lcOk = Map2Drive( “F:“, “\\SISTEMAS\DELL (C)” )
101. lcOk = Map2Drive( “F:“, lcServidor )
102. ENDIF
103. =WorkBox( “El servidor esta mapeado ahora” )
104. *
105.
106. * PASO 3
107. * Saber si alguno de los archivos que necesitamos copiar no esta siendo usado en ese
momento
108. *
109. *? EstaBloqueado(”\\sistemas\c\sistemas\clientes\basedato\classic\c_operaciones.dbf“)
110. *? EstaBloqueado(”c_operaciones.dbf“)
111. *WAIT WINDOW “Actualizando… pulse una tecla“
112. *
113. =WorkBox( “Abriendo archivo temporal” )
114. USE c_update EXCLUSIVE
115. ZAP
116.
117. * PASO 4
118. * Conocer el directorio al que se va a conectar, leyendo el archivo INI de clientes
119. * que es donde esta escrito la ubicacion. Ej. el de arriba
120. *
121. Source_Dir = SYS(5)+CURDIR()+ lcDirEmpresa + “\*.*“
122. Source_Img = SYS(5)+CURDIR()+ lcDirEmpresa + “\ID\*.*“
123. *Target_Dir = “F:\SISTEMAS\CLIENTES\BASEDATO\CLASSIC\*.*“
124. *Target_Img = “F:\SISTEMAS\CLIENTES\BASEDATO\CLASSIC\ID\*.*“
125. Target_Dir = “F:” + lcFolderData + “*.*“
126. Target_Img = “F:” + lcFolderImg + “*.*“
127.
128. * PASO 5
129. * Ahora leer el directorio local ponerlo en un array para saber que archivos y cual fue
130. * la fecha de ultima copia para las fotos, y tambien para los archivos.
131. * Se validara mediante la funcion TYPE el array resultante, ya que si el directorio
132. * se encuentra vacio tanto en el Local como en el Remoto, debemos pasar de largo para
133. * seguir revisando los archivos y no nos de mensaje de error al no encontrar archivos
134. *
135. =WorkBox( “Leyendo Directorio Local” )
136. =ADIR( aSourceDir, Source_Dir )
137. IF TYPE( “aSourceDir” ) <> “U“
138. * Ponerlo en el archivo.
139. SELECT c_update
140. nFiles = ALEN( aSourceDir, 1 )
141. FOR i = 1 TO nFiles
142. APPEND BLANK
143. REPLACE s_archivo WITH aSourceDir( i, 1 )
144. REPLACE s_tamano WITH aSourceDir( i, 2 )
145. REPLACE s_fecha WITH aSourceDir( i, 3 )
146. REPLACE s_hora WITH aSourceDir( i, 4 )
147. REPLACE s_attrib WITH aSourceDir( i, 5 )
148. NEXT
149. ELSE
150. * No hay archivos a procesar
151. ENDIF
152.
153. * Ahora imagenes
154. =ADIR( aSourceImg, Source_Img )
155. IF TYPE( “aSourceImg” ) <> “U“
156. * Ponerlo en el archivo.
157. SELECT c_update
158. nFiles = ALEN( aSourceImg, 1 )
159. FOR i = 1 TO nFiles
160. APPEND BLANK
161. REPLACE s_archivo WITH aSourceImg( i, 1 )
162. REPLACE s_tamano WITH aSourceImg( i, 2 )
163. REPLACE s_fecha WITH aSourceImg( i, 3 )
164. REPLACE s_hora WITH aSourceImg( i, 4 )
165. REPLACE s_attrib WITH aSourceImg( i, 5 )
166. NEXT
167. ELSE
168. * No hay archivos a procesar
169. ENDIF
170.
171. * PASO 6
172. * Leer el directorio remoto para ponerlo en un array y saber la fecha de mod. de archivos
173. =WorkBox( “Leyendo Directorio Remoto” )
174. =ADIR( aTargetDir, Target_Dir )
175. IF TYPE( “aTargetDir” ) <> “U“
176. SELECT c_update
177. GO TOP
178. nFiles = ALEN( aTargetDir, 1 )
179. FOR j = 1 TO nFiles
180. LOCATE FOR RTRIM( s_archivo ) = RTRIM( aTargetDir( j, 1))
181. IF !FOUND()
182. APPEND BLANK
183. ENDIF
184. REPLACE t_archivo WITH aTargetDir( j, 1 )
185. REPLACE t_tamano WITH aTargetDir( j, 2 )
186. REPLACE t_fecha WITH aTargetDir( j, 3 )
187. REPLACE t_hora WITH aTargetDir( j, 4 )
188. REPLACE t_attrib WITH aTargetDir( j, 5 )
189. NEXT
190. ELSE
191. * No hay archivos a procesar
192. ENDIF
193. * Ahora imagenes
194. =ADIR( aTargetImg, Target_Img )
195. IF TYPE( “aTargetImg” ) <> “U“
196. * Poner lo en el archivo.
197. SELECT c_update
198. nFiles = ALEN( aTargetImg, 1 )
199. FOR j = 1 TO nFiles
200. LOCATE FOR RTRIM( s_archivo ) = RTRIM( aTargetImg( j, 1))
201. IF !FOUND()
202. APPEND BLANK
203. ENDIF
204. REPLACE t_archivo WITH aTargetImg( j, 1 )
205. REPLACE t_tamano WITH aTargetImg( j, 2 )
206. REPLACE t_fecha WITH aTargetImg( j, 3 )
207. REPLACE t_hora WITH aTargetImg( j, 4 )
208. REPLACE t_attrib WITH aTargetImg( j, 5 )
209. NEXT
210. ELSE
211. * No hay archivos a procesar
212. ENDIF
213. =WorkBox( “Comparando Archivos” )
214.
215. * PASO 7
216. * Comparar los archivos para saber si hay que copiar o no.
217. GO TOP
218. nTotalFiles = RECCOUNT()
219. nCount = 1
220. nUpdate = 0 && Contador de Actualizaciones
221. nNew = 0 && Contador de Nuevos
222. SCAN
223. IF t_archivo <> s_archivo
224. * El archivo remoto es diferente al archivo local
225. REPLACE filecode WITH “N“
226. nNew = nNew + 1
227. ELSE
228. DO CASE
229. CASE t_fecha > s_fecha
230. * El archivo remoto es mas actual que el archivo local?
231. REPLACE filecode WITH “U“
232. nUpdate = nUpdate + 1
233. CASE t_fecha = s_fecha
234. * El archivo remoto tiene la misma fecha que el archivo local
235. IF t_hora > s_hora
236. * Entonces la hora remota es mas nueva que la hora local?
237. REPLACE filecode WITH “U“
238. nUpdate = nUpdate + 1
239. ELSE
240. * Son de la misma hora y fecha, entonces su tamaño es mas grande?
241. IF t_tamano > s_tamano
242. REPLACE filecode WITH “U“
243. nUpdate = nUpdate + 1
244. ELSE
245. * Ya no podemos hacer nada y este archivo se brinca
246. ENDIF
247. ENDIF
248. ENDCASE
249. ENDIF
250. ENDSCAN
251. IF nNew > 0 .OR. nUpdate > 0
252. nRes=MESSAGEBOX( “Hay ” + STR( nUpdate, 3 ) + “ actualizaciones y ” + CHR(13)
+;
253. STR( nNew, 3 ) + “ archivos nuevos. ” + CHR(13) + CHR(13) + ;
254. “¿Quiere Actualizar?“, 4+32, “Confirmacion” )
255. IF nRes = 7 && NO queremos
256. =WorkBox( “CLEANUP” )
257. RETURN
258. ENDIF
259. ELSE
260. * Si no encuentra que hay actualizaciones o archivos nuevos que copiar no tiene caso
continuar
261. * asi que nos salimos del programa
262. =WorkBox( “CLEANUP” )
263. RETURN
264. ENDIF
265. =WorkBox( “Copiando Archivos ” )
266.
267. * PASO 8
268. * Copiar archivos
269. GO TOP
270. SCAN
271. nPorcent = (nCount * 100) / nTotalFiles
272. =Progress( nPorcent, “Copiando” + t_archivo)
273. IF filecode = “N” .OR. filecode = “U“
274. * Si el archivo es totalmente nuevo o esta actualizado
275. REPLACE hascopied WITH .T.
276. * Checar si es archivo de datos o indice, o una imagen
277. IF JUSTEXT( t_archivo ) = “JPG“
278. *RemoteFile = “F:\sistemas\clientes\basedato\classic\id\“+ RTRIM( t_archivo )
279. *LocalFile = “C:\sistemas\clientes\basedato\classic\id\” + RTRIM( t_archivo )
280. RemoteFile = “F:” + lcFolderImg + RTRIM( t_archivo )
281. LocalFile = SYS(5) + CURDIR() + lcDirEmpresa + “\id\” + RTRIM( t_archivo )
282. ELSE
283. *RemoteFile = “F:\sistemas\clientes\basedato\classic\“+ RTRIM( t_archivo )
284. *LocalFile = “C:\sistemas\clientes\basedato\classic\” + RTRIM( t_archivo )
285. RemoteFile = “F:” + lcFolderData + RTRIM( t_archivo )
286. LocalFile = SYS(5) + CURDIR() + lcDirEmpresa + “\” + RTRIM( t_archivo )
287. ENDIF
288. =CopyFile( RemoteFile, LocalFile )
289. ENDIF
290. nCount = nCount + 1
291. ENDSCAN
292. =Progress( 100, “Fin” )
293. =WorkBox( “CLEANUP” )
294. RETURN
295. * Fin del programa
296.
297.
298. *****************************************************************
299. * Funciones Necesarias para el programa
300. *****************************************************************
301. *? EstaBloqueado(”c:otr_atisaappreg01.dbf“)
302. FUNCTION EstaBloqueado(cArchivo)
303. DECLARE LONG _lopen IN “kernel32” AS lOpen STRING lpPathName, LONG
iReadWrite
304. DECLARE LONG _lclose IN “kernel32” AS lClose LONG hFile
305. LOCAL hFile AS LONG
306. hFile = -1
307. hFile = lOpen(cArchivo, 0×10)
308. Result = hFile = -1
309. lClose (hFile)
310. RETURN Result
311. ENDFUNC
312.
313. * Variacion de conexion de unidad de red a recurso compartido en Windows usando
314. * Windows Scripting Host (WSH), cuando las APIS de Windows cambian por las
diferentes
315. * versiones entre win95,98,XP,NT, 2000
316. FUNCTION map2Drive
317. PARAMETERS cDrive, cRecurso, cPersistente, cUsuario, cPassword
318. IF PARAMETERS() = 2
319. cPersistente = .F.
320. cUsuario = ““
321. cPassword = ““
322. ENDIF
323. *WAIT WINDOW cDrive + “-” + cRecurso
324. * Crear el objeto de WSH
325. o = CREATEOBJECT( ‘Wscript.NetWork’)
326. * Ejecutar la conexion
327. o.MapNetWorkDrive( cDrive, cRecurso, cPersistente, cUsuario, cPassword )
328.
329. ****************************************************************
330. *! Procedure Name : COPYFILE
331. *! Author : Ronald M. Sering
332. *! Date : March 19, 1994
333. *! Function : Copy file to another.
334. *!
335. *! Parameters :
336. *!
337. *! pcSource = Source file (PATH can be included.)
338. *! pcDest = Destination file and path.
339. *!
340. *!**************************************************************
341. PROCEDURE COPYFILE
342. PARAMETER pcSource, pcDest
343. PRIVATE pcSource && Source of the file including its path.
344. PRIVATE pcDest && Destination of the file.
345. PRIVATE pnFHandle && File handle of the source file.
346. PRIVATE pnTHandle && File handle of the destination file.
347. PRIVATE pnFSize && File size of the source file.
348. PRIVATE pcContent && Content of source file.
349. PRIVATE pnFCopied && Size copied by the destination file from the source
file.
350. *
351. * Open the source file for low-level use and
352. * return to the calling program if error is
353. * detected otherwise the program continues
354. *
355. pnFHandle = FOPEN(pcSource)
356. IF pnFHandle < 0
357. RETURN FERROR()
358. ENDIF
359. *
360. * Open the destination file for low-level use and
361. * return to the calling program if error is
362. * detected otherwise the program continues
363. *
364. pnTHandle = FCREATE(pcDest)
365. IF pnTHandle < 0
366. =FCLOSE(pnFhandle)
367. RETURN FERROR()
368. ENDIF
369. *
370. * Get the exact size of the source file
371. *
372. pnFSize = FSEEK(pnFHandle,0,2)
373. *
374. * Determine if there is sufficient disk space
375. * for the operation. If there is, program execution
376. * continues, otherwise ,it returns to the calling program
377. *
378. = FCHSIZE(pnTHandle, pnFSize)
379. pnFCopied = FSEEK(pnTHandle,0,2)
380. IF pnFCopied < pnFSize
381. =FCLOSE(pnFHandle)
382. =FCLOSE(pnTHandle)
383. DELETE FILE (pcDest)
384. RETURN 29
385. ENDIF
386. =FCLOSE(pnFHandle)
387. =FCLOSE(pnTHandle)
388. COPY FILE &pcSource TO &pcDest
389. RELEASE pcSource
390. RELEASE pcDest
391. RELEASE pnFHandle
392. RELEASE pnTHandle
393. RELEASE pnFSize
394. RELEASE pcContent
395. RELEASE pnFCopied
396. RETURN 0
397.
398. *!*************************************************************
399. *! Procedure Name : RETFERROR
400. *! Author : Ronald M. Sering
401. *! Date : March 19, 1994
402. *! Function : Return error description on last
403. *! low-level file operation.
404. *! Parameters :
405. *!
406. *! pnErrNo = low-level file error no.
407. *!
408. *!*************************************************************
409. FUNCTION RETFERROR
410. PARAMETER pnErrNo
411. *begin
412. PRIVATE pnErrNo
413. DO CASE
414. CASE pnErrNo = 2
415. RETURN “File not found.“
416. CASE pnErrNo = 4
417. RETURN “Too many files open (out of handles).“
418. CASE pnErrNo = 5
419. RETURN “File access denied.“
420. CASE pnErrNo = 6
421. RETURN “Invalid file handle given.“
422. CASE pnErrNo = 8
423. RETURN “Out of memory.“
424. CASE pnErrNo = 25
425. RETURN “Seek error (can’t seek before the start of a file).“
426. CASE pnErrNo = 29
427. RETURN “Insufficient disk space.“
428. CASE pnErrNo = 31
429. RETURN “General failure (EOF encountered).“
430. OTHERWISE
431. RETURN ““
432. ENDCASE
433. *end
434.
435. *!************************************************************
436. *! Procedure Name : DIREXIST
437. *! Author : Ronald M. Sering
438. *! Date : March 21, 1994
439. *! Function : Return true if directory exist
440. *! otherwise false.
441. *! Parameters :
442. *!
443. *! pcDrvPath = Directory/Path.
444. *!
445. *!************************************************************
446. FUNCTION DirExist
447. PARAMETER pcDrvPath
448. PRIVATE pcDrvPath, pcUniqueF
449. IF PARAMETERS() = 0
450. RETURN
451. ENDIF
452. pcUniqueF = UNIQUEF()
453. pcDrvPath = pcDrvPath + pcUniqueF
454. FHandle = FCREATE(pcDrvPath)
455. IF FHandle < 0
456. =FCLOSE(FHandle)
457. DELETE FILE (pcDrvPath)
458. RETURN .F.
459. ELSE
460. =FCLOSE(FHandle)
461. DELETE FILE (pcDrvPath)
462. RETURN .T.
463. ENDIF
464.
465. ************************************************************
466. * WorkBox
467. *********
468. FUNCTION WORKBOX
469. PARAMETERS pcworkmsg
470. PRIVATE pcworkmsg
471. IF pcworkmsg = “CLEANUP“
472. RELEASE WINDOW workbox
473. RETURN ““
474. ENDIF
475. DO CASE
476. CASE _DOS.OR._UNIX
477. IF .NOT.WEXIST(”WORKBOX“)
478. DEFINE WINDOW workbox AT 0,0 SIZE 3,70 FONT “FOXFONT“,9 FLOAT
SHADOW COLOR SCHEME 5
479. MOVE WINDOW workbox CENTER
480. ENDIF
481. IF .NOT.WVISIBLE(”WORKBOX“)
482. ACTIVATE WINDOW workbox
483. ELSE
484. ACTIVATE WINDOW workbox SAME
485. ENDIF
486. @ 1,5 SAY “Trabajando” COLOR GR+/RB*
487. @ 1,12 SAY “ –> “
488. @ 1,19 SAY PADR(pcworkmsg,80) SIZE 2,40
489. CASE _WINDOWS.OR._MAC
490. IF .NOT.WEXIST(”workbox“)
491. DEFINE WINDOW workbox AT 0.000,0.000 SIZE 7.667,68.167 FONT “Arial“,9
STYLE “B” SYSTEM COLOR RGB(,,,192,192,192)
492. MOVE WINDOW workbox CENTER
493. IF WVISIBLE(”workbox“)
494. ACTIVATE WINDOW workbox SAME
495. ELSE
496. ACTIVATE WINDOW workbox NOSHOW
497. ENDIF
498. DO 3dbox WITH .
340000000000000E+1,.233300000000000E+1,.313300000000000E+1,.635000000000001E+2,-
.300000000000000E+1,255,;
499. 255,255,128,128,128
500. @ 0.431,21.278 SAY “Trabajando…“ FONT “Arial“,24 STYLE “BT” COLOR
RGB(128,128,128,128,128,128)
501. @ 0.333,21.000 SAY “Trabajando…“ FONT “Arial“,24 STYLE “BT” COLOR
RGB(128,0,0),,,,
502. DO 3dbox WITH .
427100000000001E+1,.494400000000001E+1,.145900000000000E+1,.579440000000001E+2,1
,255,255,255,96,96,96
503. ENDIF
504. @ 4.467,5.500 SAY pcworkmsg PICTURE “;@I” SIZE .
106700000000000E+1,.568330000000001E+2 FONT “Arial“,9 STYLE “B“
505. ACTIVATE WINDOW workbox
506. ENDCASE
507. RETURN ““
508.
509. *****************************************************
510. * PROGRESS.PRG
511. * Programa de termometro para ver el progreso de avance de operaciones
512. * De: Internet. Dominio Publico
513. * Modificado por: Lic. Sergio Hugo Sanchez O.
514. * MOD: 23-Ago-96.. Convertido a Funcion para usarse en SQL
515. *
516. * Parametros: lnPct - Porcentaje de avance
517. * lcBotMsg - Mensaje inferior
518. * lcTopMsg - Mensaje superior
519. * dosGraphic - Si es en 3D para DOS (Windows esta activo)
520. * lcColor1 - Color de letras
521. * lcColor2 - Color de fondo
522. * Si no tiene parametros, se desactiva la ventana
523. *
524. *************************************************************
525. FUNCTION progress
526. PARAMETERS lnPct, lcBotMsg, lcTopMsg, dosGraphic, lcColor1, lcColor2
527. PRIVATE lnPct, lcBotMsg, lcTopMsg, llGraphic, lnPctAt, lcPctAt
528. PRIVATE dosGraphic, lcColor1, lcColor2, lcColor3
529. *****
530. * Validate the Parameters
531. *****
532. IF PARAMETERS() >= 2
533. IF TYPE(”m.lnPct“) # “N“
534. m.lnPct = 0
535. ENDIF
536.
537. IF TYPE(”m.lcBotMsg“) # “C“
538. m.lcBotMsg = ““
539. ENDIF
540.
541. IF TYPE(”m.lcTopMsg“) # “C“
542. m.lcTopMsg = ““
543. ENDIF
544.
545. IF TYPE( “dosGraphic” ) # “L“
546. dosGraphic = .F.
547. ENDIF
548.
549. IF TYPE( “lcColor1” ) # “C“
550. lcColor1 = “N“
551. ENDIF
552.
553. IF TYPE( “lcColor2” ) # “C“
554. lcColor2 = “G“
555. ENDIF
556.
557. m.llGraphic = .F.
558.
559. DO CASE
560. CASE _WINDOWS
561. m.llGraphic = .T.
562. CASE _DOS
563. m.llGraphic = .F.
564. * dosGraphic = .t.
565. CASE _MAC
566. m.llGraphic = .T.
567. CASE _UNIX
568. m.llGraphic = .F.
569. ENDCASE
570.
571. #DEFINE c_dlgface “MS Sans Serif“
572. #DEFINE c_dlgsize 8.000
573. #DEFINE c_dlgstyle “B“
574. * define window when calling the first time
575. *
576.
577. IF NOT WEXIST(’W_PROGRESS’)
578. * This only gets run once, first time called
579. *
580. SET CURSOR OFF
581. IF m.llGraphic
582. DEFINE WINDOW w_progress ;
583. AT INT((SROW() - (( 5.615 * FONTMETRIC(1, c_dlgface, c_dlgsize,
c_dlgstyle )) / FONTMETRIC(1,WFONT(1,”“),WFONT(2,”“),WFONT(3,”“)))) / 2) , ;
584. INT((SCOL() - (( 63.833 * FONTMETRIC(6, c_dlgface, c_dlgsize, c_dlgstyle )) /
FONTMETRIC(1,WFONT(1,”“),WFONT(2,”“),WFONT(3,”“)))) / 2) ;
585. SIZE 5.615, 63.833 FONT c_dlgface, c_dlgsize STYLE c_dlgstyle NOFLOAT ;
586. NOCLOSE NONE COLOR RGB(0, 0, 0, 192, 192, 192)
587.
588. MOVE WINDOW w_progress CENTER
589. ACTIVATE WINDOW w_progress NOSHOW
590. * Draw lines to create ‘raised-panel’ look:
591. @ 0.000, 0.000 TO 0.000, 63.833 COLOR RGB( 255, 255, 255, 255, 255, 255)
592. @ 0.000, 0.000 TO 5.615, 0.000 COLOR RGB( 255, 255, 255, 255, 255, 255)
593. @ 0.385, 0.667 TO 5.231, 0.667 COLOR RGB( 128, 128, 128, 128, 128, 128)
594. @ 0.308, 0.667 TO 0.308, 63.167 COLOR RGB( 128, 128, 128, 128, 128, 128)
595. @ 0.385, 63.000 TO 5.308, 63.000 COLOR RGB( 255, 255, 255, 255, 255, 255)
596. @ 5.231, 0.667 TO 5.231, 63.167 COLOR RGB( 255, 255, 255, 255, 255, 255)
597. @ 5.538, 0.000 TO 5.538, 63.833 COLOR RGB( 128, 128, 128, 128, 128, 128)
598. @ 0.000, 63.667 TO 5.615, 63.667 COLOR RGB( 128, 128, 128, 128, 128, 128)
599. @ 3.000, 3.333 TO 4.231, 3.333 COLOR RGB( 128, 128, 128, 128, 128, 128)
600. @ 3.000, 60.333 TO 4.308, 60.333 COLOR RGB( 255, 255, 255, 255, 255, 255)
601. @ 3.000, 3.333 TO 3.000, 60.333 COLOR RGB( 128, 128, 128, 128, 128, 128)
602. @ 4.231, 3.333 TO 4.231, 60.500 COLOR RGB( 255, 255, 255, 255, 255, 255)
603. ELSE
604. IF .NOT. dosGraphic
605. DEFINE WINDOW w_progress ;
606. FROM INT((SROW()-6)/2), INT((SCOL()-57)/2) ;
607. TO INT((SROW()-6)/2) + 6, INT((SCOL()-57)/2) + 57 ;
608. DOUBLE SHADOW COLOR SCHEME 5
609. ACTIVATE WINDOW w_progress NOSHOW
610. @ 02,01 TO 05,54
611. @ 03,03 SAY CHR(221)
612. ELSE
613. =NewVen( “W_PROGRESS“, INT((SROW()-6)/2), INT((SCOL()-57)/2),;
614. INT((SROW()-6)/2)+6, INT((SCOL()-57)/2)+57, “W+“, lcColor2 )
615. =Newbox2( WROWS()-5,2,WROWS()-3,WCOLS()-3,”W+“, lcColor2 )
616. ENDIF
617. ENDIF
618. SHOW WINDOW w_progress TOP
619. ELSE
620. ACTIVATE WINDOW w_progress
621. ENDIF
622. * Display the horizontal progress bar
623. IF m.lnPct > 0 AND m.lnPct < 100
624. m.nblocks = (m.lnPct / 100) * IIF(m.llGraphic,57, IIF(dosGraphic, 55, 50))
625. m.lcPct = LTRIM(STR(m.lnPct))+” %“
626. IF m.llGraphic
627. IF PARAMETERS() > 2
628. @ 0.5, 3 SAY m.lcTopMsg FONT c_dlgface, c_dlgsize STYLE c_dlgstyle
629. ENDIF
630. IF PARAMETERS() > 1
631. @ 1.5, 3 SAY m.lcBotMsg FONT c_dlgface, c_dlgsize STYLE c_dlgstyle
632. ENDIF
633.
634. m.lnPctAt = (WCOLS()-TXTWIDTH(m.lcPct))/2
635. @ 3.00, 3.33 TO 4.231, m.nBlocks + 3.333 PATTERN 1 COLOR RGB( 128, 128,
128, 128, 128, 128)
636. @ 3.10, m.nBlocks+3.43 TO 4.231, 60.400 PATTERN 1 COLOR RGB(192, 192,
192, 192, 192, 192)
637. IF m.lnPct < 50
638. @ 3.15, m.lnPctAt SAY m.lcPct FONT c_dlgface, c_dlgsize STYLE
c_dlgstyle+”T” COLOR RGB( 0, 0, 0, 192, 192, 192)
639. ELSE
640. @ 3.15, m.lnPctAt SAY m.lcPct FONT c_dlgface, c_dlgsize STYLE
c_dlgstyle+”T” COLOR RGB(255, 255, 255, 192, 192, 192)
641. ENDIF
642. ELSE
643. IF PARAMETERS() > 2
644. IF .NOT. dosGraphic
645. @ 0, 2 SAY m.lcTopMsg
646. ENDIF
647. ENDIF
648. IF PARAMETERS() > 1
649. @ 1, 2 SAY m.lcBotMsg
650. ENDIF
651.
652. IF .NOT. dosGraphic
653. @ 3,3 SAY REPLICATE(CHR(219),m.lnPct/2)+IIF(MOD(lnPct,2) =
1,CHR(221),”)
654. m.lnPctAt = (WCOLS()-LEN(m.lcPct)) /2
655. @ 3,m.lnPctAt SAY m.lcPct
656. ELSE
657. IF m.nBlocks <= 4
658. m.nBlocks = 4
659. ENDIF
660. =Newbox( WROWS()-5, 2, WROWS()-3, m.nBlocks, lcColor1, lcColor2 )
661. lcColor3 = lcColor1 + “/” + lcColor2
662. @ WROWS()-4,WCOLS()/2-1 SAY m.lcPct COLOR (lcColor3)
663. ENDIF
664. ENDIF
665. ENDIF
666.
667. IF m.lnPct >= 100
668. m.nblocks = IIF(m.llGraphic, 57, IIF(dosGraphic, 55, 50))
669. IF m.llGraphic
670. @ 3.000, 3.333 TO 4.231, m.nblocks + 3.333 PATTERN 1 COLOR RGB(128, 128,
128, 128, 128, 128)
671. ELSE
672. IF .NOT. dosGraphic
673. @ 3,3 SAY REPLICATE(CHR(219),m.nblocks)
674. ELSE
675. =Newbox( WROWS()-5, 2, WROWS()-3, m.nBlocks, lcColor1, lcColor2 )
676. lcColor3 = lcColor1 + “/” + lcColor2
677. @ WROWS()-4,WCOLS()/2-1 SAY “100 %” COLOR (lcColor3)
678. ENDIF
679. ENDIF
680. WAIT ” TIMEOUT .5
681. RELEASE WINDOW w_progress
682. SET CURSOR ON
683. ENDIF
684. ELSE
685. IF WEXIST( “w_progress” )
686. RELEASE WINDOW w_progress
687. SET CURSOR ON
688. ENDIF
689. ENDIF
690. RETURN .T.
691.
692. ******************************************************
693. * Procedure Name : UNIQUEF
694. * Author : Ronald M. Sering
695. * Date : February 23, 1994
696. * Function : Returns a unique filename.
697. *
698. FUNCTION UNIQUEF
699. PRIVATE pcTempF
700. pcTempF = SYS(3)+’.DBF’
701. DO WHILE FILE(pcTempF)
702. pcTempF = SYS(3)+’.DBF’
703. ENDDO
704. RETURN pcTempF
705. * END UNIQUEF
706.
707. ***************************************************
708. FUNCTION ReadFileIni(tcFileName,tcSection,tcEntry)
709. *
710. * Lee un valor de un archivo INI.
711. * Si no existe el archivo, la sección o la entrada, retorna .NULL.
712. * PARAMETROS:
713. * tcFileName = Nombre y ruta completa del archivo.INI
714. * tcSection = Sección del archivo.INI
715. * tcEntry = Entrada del archivo.INI
716. * USO: ReadFileIni(”C:MiArchivo.ini“,”Default“,”Port“)
717. * RETORNO: Caracter
718. *
719. LOCAL lcIniValue, lnResult, lnBufferSize
720. DECLARE INTEGER GetPrivateProfileString ;
721. IN WIN32API ;
722. STRING cSection,;
723. STRING cEntry,;
724. STRING cDefault,;
725. STRING @cRetVal,;
726. INTEGER nSize,;
727. STRING cFileName
728. lnBufferSize = 255
729. lcIniValue = SPAC(lnBufferSize)
730. lnResult=GetPrivateProfileString(tcSection,tcEntry,”*NULL*“,;
731. @lcIniValue,lnBufferSize,tcFileName)
732. lcIniValue=SUBSTR(lcIniValue,1,lnResult)
733.
734. IF lcIniValue=”*NULL*“
735. lcIniValue=.NULL.
736. ENDIF
737. RETURN lcIniValue
738. ENDFUNC
739.
740. **********************************************************
741. * Conectar una unidad de red a un recurso compartido
742. * Usando APIS de Windows de manera Directa.
743. * Ej. _MapDrive( “z:“; “\pc_remotorecurso” )
744. FUNCTION mapDrive
745. PARAMETERS tcDrive, tcResource, tcPassword
746. LOCAL lnRet
747. DECLARE INTEGER WNetAddConnection IN WIN32API;
748. STRING @lpzRemoteName, STRING @lpzPassword,;
749. STRING @lpzLocalName
750. IF PARAMETERS() < 3
751. lnRet = WNetAddConnection( @tcResource, 0, tcDrive )
752. ELSE
753. lnRet = WNetAddConnection( @tcResource, @tcPassword, @tcDrive )
754. ENDIF
755. IF lnRet # 0
756. WAIT WINDOW “Error ” + ALLTRIM( STR(lnRet))+” al conectar el drive ” +
tcDrive
757. RETURN
758. ENDIF
759. RETURN
760. ENDFUNC

Article printed from IDSFoxPro Blog: http://foxpro.idsystemsmx.com/wordpress

URL to article: http://foxpro.idsystemsmx.com/wordpress/?p=7


URLs in this post:
[1] Image: http://foxpro.idsystemsmx.com/wordpress/?p=7&print=1
[2] LiveUpdate: http://technorati.com/tag/LiveUpdate
[3] Mirror: http://technorati.com/tag/Mirror
[4] Red+LAN: http://technorati.com/tag/Red+LAN
[5] WAN: http://technorati.com/tag/WAN

S-ar putea să vă placă și