Когда-то мы создали функцию 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 таблиц. Открывать их все при старте программы и закрывать при выходе - НЕ самое лучшее решение. Лучше открывать их динамически в зависимости от логики приложения и действий пользователя.