***************************************************************
// WorkSpac.Ch
//
//
**************************************************************
#Translate DEFINE WORKSPACE <oWS> => ;
<oWS>:= TWorkSpace():New()
#Define NO_PATHBLOCK NIL
// Si no se pasa path ni empresa asume la empresa actual
#Translate USE WORKAREA IN WORKSPACE <oWS> ;
[PATH <cPath> ] ; // Normalmente NO SERA NECESARIO pasar el path !!
FILES <xFiles> ; // Nombres fichero en disco con o sin extension (hacer tratamiento para cuendo lleva extension pq puede no ser .dbf)
[ALIAS <xAliasExterno> ] ; // Por si varios con mismo nombre fichero; ademas deberia se obligatorio cuando FILE sea una variable (no una constrante entrecomillada)
[EXCLUSIVE <lExclusive> ] ;
[PRE_OPEN <lPreOpen> ] ;
[FILTER <bFilter> ] ; // Para luego poderse quitar y restaurar.
[OPEN_INDICES <lOpenInd> ] ; // Abrir indices si/no
;
[TO <lOk>] ; // Solo tiene sentido cuando sea PRE_OPEN
;
;
;
;
;
;
=> ;
;
[<lOk>:=] <oWS>:AddWorkArea(<cPath>, NO_PATHBLOCK, <xFiles>, <xAliasExterno>, <lExclusive>, <lPreOpen>, <bFilter>, <lOpenInd>, NIL, NIL, <cCodEmp>, NIL, <lEmpresaAsociada>)
*
***********************************************************************
// WorkSpac.Prg
//
*************************************************************************
#Include "FiveWin.Ch"
STATIC nCountWorkSpaces:= 0
#Define PARAM_AWA cPath, bPath, xFiles, xAliasExterno, lExclusive, lPreOpen, bFilter, lOpenInd, lDeGestion, lDeConta, cCodEmp, lEmpresaActual, lEmpresaAsociada
#Define PARAMETROS_TODOS ;
PARAM_AWA, cAliasReal, lOpen, cFile, cAliasExterno, cCodEmpCambiado
// Aqui la declaracion de PARAMETROS_TODOS
#Define POS_cPath 01
#Define POS_bPath 02
#Define POS_xFiles 03
#Define POS_xAliasExterno 04
#Define POS_lExclusive 05
#Define POS_lPreOpen 06
#Define POS_bFilter 07
#Define POS_lOpenInd 08
#Define POS_lDeGestion 09
#Define POS_lDeConta 10
#Define POS_cCodEmp 11
#Define POS_lEmpresaActual 12
#Define POS_lEmpresaAsociada 13
#Define POS_cAliasReal 14
#Define POS_lOpen 15
#Define POS_cFile 16
#Define POS_cAliasExterno 17
#Define POS_cCodEmpCambiado 18
*********************************************************************
// Ejemplo de manejo.
FUNCTION WSSample()
Local oRdbms
DEFINE WORKSPACE oRdbms
USE WORKAREA IN WORKSPACE oRdbms ;
PATH "Data" ;
FILES {"File1", "File2", "File3"}
oRdbms:Activate()
oRdbms:End()
RETURN NIL
//--------------------------------------------------------------------------//
CLASS TWorkSpace
METHOD New()
METHOD Activate()
METHOD End()
METHOD AddWorkArea()
METHOD OpenFile() HIDDEN
METHOD OpenNoOpen() HIDDEN // Abre los que queden sin abrir
// Para trabajar con los alias
DATA oAlias READONLY
// Contiene todas las areas. Se movera al unisono con oAlias.
DATA aAreasInfo HIDDEN
DATA nCountWorkAreas HIDDEN INIT 0
METHOD CloseAll() HIDDEN
METHOD SelectArea(nOrdenApertura) INLINE dbSelectArea(::aAreasInfo[nOrdenApertura, POS_cAliasReal])
*
*
DATA aAreas READONLY
METHOD RetAreas() HIDDEN
ENDCLASS
//--------------------------------------------------------------------------//
METHOD New()
nCountWorkSpaces++
*
::oAlias:= TPublic():New()
::aAreasInfo:= {}
RETURN Self
*
//--------------------------------------------------------------------------//
METHOD End()
nCountWorkSpaces--
*
::CloseAll()
RETURN NIL
*
*
//--------------------------------------------------------------------------//
METHOD Activate()
Local lOk:= .t.
*
IF !::OpenNoOpen()
::CloseAll()
lOk:= .f.
ELSE
::aAreas:= ::RetAreas()
ENDIF
RETURN lOk
*
//--------------------------------------------------------------------------//
METHOD CloseAll()
Local nI
Local cAlias
*
FOR nI:= 1 TO Len(::aAreasInfo)
//MDEBUG_(::aAreasInfo[nI, POS_cAliasReal], nI, ::aAreasInfo[nI, POS_lOpen])
IF ::aAreasInfo[nI, POS_lOpen] ////.AND. ::aAreasInfo[nI, POS_lActivateSiYaAbierto]
cAlias:= ::aAreasInfo[nI, POS_cAliasReal]
(cAlias)-> (dbCommit())
CLOSE (cAlias)
*
*
::aAreasInfo[nI, POS_lOpen]:= .f. // Marca como NO abierto !!
ENDIF
NEXT
RETURN NIL
*
//--------------------------------------------------------------------------//
// Abre los que no se PRE-abrieron (preopen) que seran todos
// casi siempre pq ... utilizar poco lo de preopen !!
METHOD OpenNoOpen()
Local lOk:= .t.
Local cFile, cAliasReal
FOR nI:= 1 TO Len(::aAreasInfo)
IF !::aAreasInfo[nI, POS_lOpen]
cFile:= ::aAreasInfo[nI, POS_cFile]
cAliasReal:= ::aAreasInfo[nI, POS_cAliasReal]
//.......
IF !::OpenFile(cFile, ::aAreasInfo[nI, POS_cPath], @cAliasReal,;
::aAreasInfo[nI, POS_lExclusive],;
::aAreasInfo[nI, POS_lOpenInd])
lOk:= .f.
EXIT
ENDIF
::aAreasInfo[nI, POS_cAliasReal]:= cAliasReal // Esto para cuando en el futuro se coja un area ya abierta.
::aAreasInfo[nI, POS_lOpen]:= .t.
//...........
ENDIF
NEXT
RETURN lOk
*
*
//--------------------------------------------------------------------------//
METHOD AddWorkArea(PARAM_AWA)
Local oWorkAreaInfo
Local cAliasReal
Local lActivateSiYaAbierto // Especifica si se abrio en nueva area (cuando se abra)
Local lOpen // Especifica si esta abierto
Local lRetOpen:= NIL
Local nI, cFile, cAliasExterno
Local lAbierto, cAliRet
Local cCodEmpCambiado // Empresa en la que finalmente abrio... en TCamino() se pudo cambiar la empresa
*
DEFAULT lExclusive:= .f.
DEFAULT lPreOpen:= .f.
*
*
IF ValType(xFiles) == "C"
aFiles:= {xFiles}
xAliasExterno:= {xAliasExterno}
ELSE
IF xAliasExterno == NIL
// Alias externo por defecto... ojo que ahora mismo
// coge el valor de la variable, si se declaro con una
// variable... Para casos de variable, lo mejor es hacer
// obligatorio el pasar el xAliasExterno...
xAliasExterno:= {}
FOR nI:= 1 TO Len(xFiles)
Aadd(xAliasExterno, xFiles[nI])
NEXT
ENDIF
ENDIF
*
*
FOR nI:= 1 TO Len(xFiles)
cFile:= Upper(xFiles[nI])
cAliasExterno:= xAliasExterno[nI]
*
::nCountWorkAreas++
*
// Con el prefijo puedo distinguir aquellos que son o no de WorkSpace
#Define INI_WORKSPACE_AREA "WSA"
*
*
#Define GENERA_ALIAS (INI_WORKSPACE_AREA+ StrZero(nCountWorkSpaces, 3)+ StrZero(::nCountWorkAreas, 4) )
cAliasReal:= GENERA_ALIAS
*
*
IF lPreOpen
IF ::OpenFile(cPath, cFile, @cAliasReal,;
lExclusive,;
lAbrirInd)
lOpen:= .t.
ELSE
lOpen:= .f.
ENDIF
lRetOpen:= lOpen
ELSE
lOpen:= .f.
ENDIF
*
IF !::oAlias:IsDef(cAliasExterno)
::oAlias:Add(cAliasExterno, cAliasReal)
ELSE
MERROR_("Alias externo ya usado !!", "Utiliza clausula ALIAS", cAliasExterno, cAliasReal)
ENDIF
Aadd(::aAreasInfo, Inutilizar(PARAMETROS_TODOS))
NEXT
RETURN lRetOpen
*
//--------------------------------------------------------------------------//
// La utilizo para inutilizar algunos valores que ya no tienen sentido cuando
// se abre el fichero por fichero...
// y los inutilizo pq los guardo todos para no complicarme la vida !!!
STATIC FUNCTION Inutilizar(PARAMETROS_TODOS)
bPath := NIL
xFiles:= NIL
xAliasExterno:= NIL
RETURN {PARAMETROS_TODOS}
*
*
*
//--------------------------------------------------------------------------//
// cAliasReal por si en el futuro se cambia y se permite reutilizar areas
// ya abiertas... mientras tanto cAliasReal ya viene dado !!
METHOD OpenFile(cFile, cPath, cAliasReal,; //cPath, cFile, lActivateSiYaAbierto, cAliasReal)
lExclusive,;
lAbrirInd)
Local oDbf
*
#Define SIEMPRE_ABRIR .T.
#Define ACTIVATE_SI_YA_ABIERTO .F.
*
oDbf:= Your_open_file_function(cFile, cPath, cAliasReal,;
lExclusive,;
SIEMPRE_ABRIR,;
lAbrirInd,;
ACTIVATE_SI_YA_ABIERTO)
IF !oDbf:lOpen
oDbf:MsgNoOpen()
RETURN .f.
ENDIF
//IF cAliasReal == NIL
cAliasReal:= oDbf:cAlias
//ENDIF
*
RETURN .t.
*
*
*
//--------------------------------------------------------------------------//
// Devuelve objetos de las areas... es para hacer tratamientos
// externos...
METHOD RetAreas()
Local nI
Local aRet:= {}
Local oClass
*
FOR nI:= 1 TO Len(::aAreasInfo)
oClass:= ClassVar({;
{"cAlias", ::aAreasInfo[nI, POS_cAliasReal]},;
{"cPath", ::aAreasInfo[nI, POS_cPath]};
})
Aadd(aRet, oClass)
NEXT
RETURN aRet
*
*
*
*
*