FUNCTION SaveIndex(cPre,xTag)
// Сохраняет текущий тег
LOCAL nArea:=SELECT()
MEMVAR cTag
PRIVATE cTag := IF(EMPTY(xTag),ORDNAME(),xTag)

IF FILE("MEMDAT.DBF").AND.(SELECT("MEMDAT") != 0 .OR. NetUse("MEMDAT","MEMDAT"))
 SELECT(nArea)
 SaveVar("cTag",ORDBAGNAME(),IF(EMPTY(cPre),"",cPre)+"BAG_ORDER"+LEFT(IDENT_USER,5)+SUBSTR(IDENT_USER,9,5),,,.T.)
ENDIF
RETURN NIL

FUNCTION RestIndex(cPre,lNoGoTop,aSortSeek)
// Восстанавливает текущий тег
MEMVAR cTag
LOCAL cSortTag, cBegTag,nArea:=SELECT()
PRIVATE cTag := ORDNAME()

IF FILE("MEMDAT.DBF").AND.(SELECT("MEMDAT") != 0 .OR. NetUse("MEMDAT","MEMDAT"))
  SELECT(nArea)
  ORDSETFOCUS(SaveVar("cTag",ORDBAGNAME(),IF(EMPTY(cPre),"",cPre)+"BAG_ORDER"+LEFT(IDENT_USER,5)+SUBSTR(IDENT_USER,9,5) ))
  IF ValType(aSortSeek) = "A" .AND. ASCAN(aSortSeek,{|aSort,nPoz| cSortTag := IF(ValType(aSort) != "A" .OR. LEN(aSort) < 8 .OR. EMPTY(aSort[8]),ORDNAME(nPoz),IF(ValType(aSort[8]) = "N",ORDNAME(aSort[8]),UPPER(aSort[8]))),IF(cBegTag = NIL,cBegTag := cSortTag,NIL),cSortTag == ORDNAME() }) = 0
    ORDSETFOCUS(cBegTag)
    dbGoTop()
  ENDIF
  IF EMPTY(lNoGoTop)
    dbGoTop()
  ENDIF
ELSE
  IF ValType(aSortSeek) = "A" .AND. ASCAN(aSortSeek,{|aSort,nPoz| cSortTag := IF(ValType(aSort) != "A" .OR. LEN(aSort) < 8 .OR. EMPTY(aSort[8]),ORDNAME(nPoz),IF(ValType(aSort[8]) = "N",ORDNAME(aSort[8]),UPPER(aSort[8]))),IF(cBegTag = NIL,cBegTag := cSortTag,NIL),cSortTag == ORDNAME() }) = 0
    ORDSETFOCUS(cBegTag)
    dbGoTop()
  ENDIF
ENDIF
RETURN NIL
//
//----------------------------------------------------------------------------//
                   FUNCTION SaveVar(cVar,xKey,cPre,cTag,cAlias,lSave,cPathdb)
//----------------------------------------------------------------------------//
// Записывает переменную в базу
// xKey - текущее значение ключа для идентификации раздела !!!
// [cPre] - префикс для идентификации данного типа генерации в пределах текущего
//        сеанса выполнения АРМ'а
// [cAlias] - алиас для доступа к счетчикам. По умолчанию MEMDAT.
// [Pathdb] - Полный путь к базе.
// ВНИМАНИЕ !! Требует открытой базы с алиасом cAlias с полями :
//             IDENT C 50, VALUE C 50, LEN N 2 0, TYPE C 1
//             проиндексированной по UPPER(IDENT)
LOCAL cIdent := UPPER(cPre+IF(xKey=NIL,"",xKey)),bakSelect := ALIAS()
LOCAL cReturn := &cVar, lUse := .F.
dbPush()
IF(ValType(cAlias) = "C",,cAlias := "MEMDAT")
IF(ValType(cPathdb) = "C",,cPathdb:=cAlias)
IF (SELECT(cAlias) = 0 .AND. (lUse := NetUse(cAlias,cPathdb))) .OR. SELECT(cAlias) != 0
 cIdent:=LEFT(cIdent,(cAlias)->(FIELDSIZE(FIELDNUM("IDENT"))))
 IF (cAlias)->(dbSeek(PADR(cIdent,LEN((cAlias)->IDENT)))) .AND. EMPTY(lSave)
   IF (cAlias)->TYPE = "C"
     cReturn := LEFT((cAlias)->VALUE,(cAlias)->LEN)
   ELSEIF (cAlias)->TYPE = "D"
     cReturn := CTOD(LEFT((cAlias)->VALUE,(cAlias)->LEN))
   ELSEIF (cAlias)->TYPE = "N"
     cReturn := CTOF((cAlias)->VALUE)
   ELSEIF (cAlias)->TYPE = "L"
     cReturn := (LEFT((cAlias)->VALUE,1) = "T")
   ELSEIF (cAlias)->TYPE = "A"
     IF (cAlias)->(FIELDPOS('Array'))>0
        cReturn := (cAlias)->Array
     ELSE
        cReturn:=''
     ENDIF
   ENDIF
 ELSEIF ((cAlias)->(!EOF())  .AND. (cAlias)->(RecLock())) .OR. (cAlias)->(AddRec())
  (cAlias)->TYPE := ValType(cReturn)
  IF (cAlias)->TYPE = 'D'
    (cAlias)->VALUE := DTOC(cReturn)
    (cAlias)->LEN := LEN(DTOC(cReturn))
  ELSEIF (cAlias)->TYPE = 'A'
     IF (cAlias)->(FIELDPOS('Array'))>0
       (cAlias)->Array := cReturn
     ENDIF
  ELSE
    (cAlias)->VALUE := XTOC(cReturn)
    (cAlias)->LEN := LEN(XTOC(cReturn))
  ENDIF
  (cAlias)->IDENT := cIdent
  (cAlias)->(dbUnLock())
 ENDIF
ENDIF
IF lUse
  (cAlias)->(dbCloseArea())
ENDIF
dbPop()
RETURN cReturn

Function DigitIs(cStr)
Local i,n := len(cStr),j := 0

For i := 1 to n
    if !( cStr[i] $  '-1234567890.')
       Return .f.
    end
end

For i := 1 to n
    if cStr[i] == '.'
       j++
    endif
Next
    if j > 1
       Return .f.
    endif
Return IIF(n = 0,.F.,.t.)

FUNCTION SetKeyIndex(cForKey,cNtxKey,bForKey,bNtxKey)
  LOCAL n
  bForKey := &("{||"+cForKey+"}")
  bNtxKey := &("{||"+cNtxKey+"}")
RETURN n

