*<Main.prg después de los SET command>
* Con esto determinas la carpeta de arranque del sistema con su path
* Por ejemplo, lcDir=MiCurdir()
* ? lcDir -> "c:\develop\sistema1"
Addproperty(_Screen,"dapli",MiCurdir())
AddProperty(_Screen,"Datos","") && creas esta propiedad. Luego le asignarás un valor
TestConfig() && verifica si existe config.fpw
GetWay() && obtiene la ruta donde están las tablas y dbc.
* Ahora siguen las instrucciones ON SHUTDOWN y lo demás
* A partir de acá, las tablas las debes abrir con el path completo
* Use Addbs(_screen.datos)+TalTabla in 0 EXCLUSIVE
* Generalmente vas a usar un programa que abra las tablas, por ejemplo
lREsult = AbrirDbf( _screen.datos , "clientes")
*<AbrirTablas>
*---------------------------------------------------------
PROCEDURE AbrirDbf
LPARAMETERS tcPath, tcTabla, tlExclusive
* --------------------------------------------------------
* tcPath: Ruta de la tabla
* Podrá ser _Screen.Datos, pero también cualquier otra
* por ejemplo _Screen.dapli
* tcTabla: Nombre de la tabla dbf
* tlExclusive: Si se necesita abrir en modo exclusivo, .T.
* si se omite el primer parámetro toma _screen.datos como valor
IF VARTYPE(tcPath)#"C" OR EMPTY(TcPath)
tcPath=_screen.datos
ENDIF
* programación defensiva
IF EMPTY(tcTabla)
MESSAGEBOX("debe indicar el nombre de la tabla")
RETURN .f.
ENDIF
local lcPath,lcUse
lcUse=ADDBS(tcPath)+tcTabla
IF USED(tcTabla)
RETURN .t.
ENDIF
IF !FILE(FORCEEXT(lcUse,"dbf")
MESSAGEBOX("La tabla "+lcUse+" no existe")
RETURN .f.
ENDIF
TRY
LOCAL loex as Exception
if tlExclusive
USE (lcUse) IN 0 EXCLUSIVE
ELSE
USE (lcUse) IN 0 SHARED
ENDIF
CATCH TO loEx
loEx.UserValue=PROGRAM()
lReturn=.f.
* ShowError(LoEx) Rutina que muestra errores
FINALLY
ENDTRY
RETURN lReturn
*<AbrirTablas>
*<Determinar directorio del programa>
***************************
PROCEDURE MiCurdir
***************************
LPARAMETERS lVerbose
* lVerbose .t. informa
* Determinar el directorio actual por Wscript
**********************************************
LOCAL cdir , objShell
objShell=CreateObject("Wscript.Shell")
cDir=objShell.CurrentDirectory
if lVerbose
Messagebox(cDir,0,"Directorio Actual")
endif
objShell=null
IF RIGHT(cdir,1)="\"
cdir=SUBSTR(cdir,1,LEN(cdir)-1)
endif
return cDir
ENDFUNC
*</Determinar directorio del programa>
*<Crear archif config.fpw si no existe>
PROCEDURE TESTCONFIG
*---------------------------------------
local crf , nfop
crf=addbs(_SCREEN.dapli)+"config.fpw"
if !file(crf)
nfop=fcreate(crf)
=fputs(nfop,"* CONFIG.FPW for \THEOCALC\")
=fputs(nfop,"SCREEN = OFF")
=fputs(nfop,"TITLE = Theodore Calculadora")
=fputs(nfop,[_STARTUP = ""])
=fputs(nfop,[_BROWSER = ""])
=fputs(nfop,[_SPELLCHK = ""])
=fputs(nfop,[_GENMENU = ""])
=fputs(nfop,[_GENGRAPH = ""])
=fputs(nfop,[_GENXTAB = ""])
=fputs(nfop,[_COVERAGE = ""])
=fputs(nfop,[_SCCTEXT = ""])
=fputs(nfop,[_CONVERTER = ""])
=fputs(nfop,[_TRANSPORTER = ""])
=fputs(nfop,[_BUILDER = ""])
=fputs(nfop,[_WIZARD = ""])
=fputs(nfop,"MVCOUNT = 1025")
=fputs(nfop,"OUTSHOW = ON")
=fputs(nfop,"RESOURCE = OFF")
=fputs(nfop,"_THROTTLE = 0")
=fputs(nfop,"TALK = OFF")
=fputs(nfop,"MULTILOCKS = ON")
=fputs(nfop,"EXCLUSIVE = OFF")
=fputs(nfop,"SAFETY = OFF")
=fclose(nfop)
ENDIF
*</Crear archif config.fpw si no existe>
*<Ruta de tablas y bases de datos>
* PROCEDURE GETWAY
****************************
* Supongamos que tenemos una tabla llamada "Accedat.dbf"
* en la cual guardamos la ruta de acceso a datos
LOCAL lcTabla,lcDir
lcTabla=ADDBS(_screen.dapli)+"Accedat.dbf"
IF !FILE(lcTabla)
CREATE TABLE &lcTabla FREE ;
("RUTADATOS" C(100))
SELECT ACCEDAT
USE
ENDIF
USE (LcTabla) IN 0 EXCLUSIVE
SELECT accedat
GO top
IF EOF()
APPEND BLANK
ENDIF
IF EMPTY(RUTADATOS)
lcDir=GETDIR(FULLPATH(""),"Carpeta de Datos","Inicio del Sistema",48)
IF EMPTY(lcdir)
SELECT accedat
USE
MESSAGEBOX("No podrá usar la aplicación")
QUIT
ENDIF
SELECT accedat
replace rutadatos WITH lcDir
ENDIF
LcDir=ALLTRIM(rutadatos)
IF !DIRECTORY(lcDir)
MESSAGEBOX("La Ruta de datos ha desaparecido o es incorrecta")
replace rutadatos WITH ""
USE
QUIT
ENDIF
SELECT ACCEDIR
USE
* Acá se puede poner algún test para ver si la ruta es correcta
* Generalmente se testea si existe un archivo típico.
_screen.datos=lcDir
ENDPROC
*</Ruta de tablas y bases de datos>