Шаг 8 - Открываем таблицу

Когда-то мы создали функцию CloseAlias(). Настало время написать функцию OpenTable():

#INCLUDE .\Include \Define.H
*
* function OpenTable
* передаем имя таблицы или путь к ней и псевдоним
  lparameters strLocPrmTable, strLocPrmAlias
*
  local intLocReturnWorkArea, intLocCount, objLocWorkArea
* инициализируем код возврата
  intLocReturnWorkArea = 0
* проверяем наличие файла на диске
  if file(strLocPrmTable)
* цикл по объектам рабочих областей с целью найти свободный
    for intLocCount = 1 to DEF_MAXWORKAREA
* проверка открытой таблицы в рабочей области
        if .not. used(intLocCount)
           use (strLocPrmTable) in intLocCount again alias (strLocPrmAlias)
* проверяем успешность открытия таблицы с заданным псевдонимом
           if used(strLocPrmAlias)
* обращаемся к соответствующему объекту рабочей области
              objLocWorkArea = arrPblWorkArea[intLocCount]
* проверяем тип объекта
              if (type(objLocWorkArea) = "O")
* это мы делали при инициализации объекта, но можно и повторить
                  objLocWorkArea.intPrpWorkArea = intLocCount
* свойство псевдоним рабочей области
                  objLocWorkArea.strPrpAlias = strLocPrmAlias
* свойство файл DBF
                  objLocWorkArea.strPrpDBF = dbf(intLocCount)
* инициализируем код возврата номером рабочей области
                  intLocReturnWorkArea = intLocCount
              endif
           endif
* выходим из цикла
           exit
       endif
    endfor
endif
return intLocReturnWorkArea

Функциональность объекта рабочей области можно наращивать добавлением новых свойств и методов. А для получения уникального псевдонима напишем очень короткую функцию GetNewAlias():

*
* function GetNewAlias
* возвращаем уникальное имя
return "Alias" + sys(2015)

Для перехода в рабочую область с указанным псевдонимом напишем функцию SelectAlias():

*
* function SelectAlias
    lparameter strLocPrmAlias
    local logLocReturn
    logLocReturn = .F.
    if used(strLocPrmAlias)
       select (strLocPrmAlias)
       logLocReturn = .T.
    endif
return logLocReturn
*

Использование нашей функции в программе будет выглядеть следующим образом:

*
   local strLocNewAlias
* запоминаем псевдоним для дальнейшего использования
   strLocNewAlias = GetNewAlias()
   if (OpenTable(".\System\T_Users.DBF", strLocNewAlias) > 0) .and. SelectAlias(strLocNewAlias)
      scan
::::::
:::..
      endscan
   endif
   CloseAlias(strLocNewAlias)

Обратите внимание на команды

use (strLocPrmTable) in (intLocCount) again alias (strLocPrmAlias)

и

select (strLocPrmAlias)

Они могли бы быть написаны и по-другому, с использованием макроподстановки:

use &strLocPrmTable in intLocCount again alias &strLocPrmAlias
select strLocPrmAlias

Макроподстановка иногда очень удобна. Но для работы с таблицами и псевдонимами рекомендуется использовать вариант со скобками. В документации сказано, что это работает быстрее.

После окончания работы с таблицей не забывайте ее закрывать функцией CloseAlias(). В большом проекте может быть и 100, и 200, и 300 таблиц. Открывать их все при старте программы и закрывать при выходе - НЕ самое лучшее решение. Лучше открывать их динамически в зависимости от логики приложения и действий пользователя.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Сергей Платонов - 4.02.2000