How To Ensure Form Uses Tables from Correct .dbc File Location - Как убедиться, что форма использует таблицы из корректного местонахождения файла базы данных .dbc?
Резюме.
Если вы создаете форму и вводите таблицы в ее DataEnvironment из файла .dbc в определенном каталоге и затем вы перемещаете форму или меняете структуру каталогов, вы можете обнаружить, что продолжает использоваться доступ к файлу .dbc в его изначальном каталоге. Если вы желаете убедиться, что форма с таблицами в ее Data Environment использует таблицы из определенного каталога (а именно, из определенного файла или файлов), укажите путь к файлу .dbc для каждого объекта курсора в методе события BeforeOpenTables объекта DataEnvironment формы.
Подробнее.
Для того, чтобы принудить вашу форму использовать таблицы из файла .dbc из каталога C:\Mydatadir, указажите путь к файлу .dbc коде метода события BeforeOpenTables. Файл .dbc в приведенном примере называется Mydbc.dbc. Независимо от расположения файла .dbc., используемого во время разработки формы, если вы используете приведенный ниже код, будет использоваться файл .dbc в каталоге C:\Mydatadir когда вы запустите форму.
* Place this in the DataEnvironment.BeforeOpenTables() code
LOCAL lcDatapath, lnBufferMode, lnI, lcI
* This could be in a format of "\\\share\" or
* ":\directory\"
lcDatapath = "C:\myDataDir\"
lnBufferMode = 5
FOR lnI = 1 TO 10 && Assume only 10 or less Cursor objects
* This assumes that the cursors have been left with the default names
* in the format of Cursor1, Cursor2, etc.
IF TYPE("this.cursor"+ALLTR(STR(lnI)))=="O" && Is this cursor an object?
lcI=ALLTR(STR(lnI)) && Convert the counter to a string
* Macro substitute the string value into cursorname to set property
THIS.CURSOR&lcI..DATABASE=(lcDatapath)+'mydbc.dbc'
* You may also set other properties for cursors here
THIS.CURSOR&lcI..BUFFERMODEOVERRIDE=lnBufferMode
ENDIF
ENDFOR
Advantages of Manual vs. Automatic DataEnvironment Behavior - Преимущества ручного по сравнению с автоматическим управления поведением DataEnvironment
Таблицы в DataEnvironment могут быть открыты и закрыты либо вручную, либо автоматически. Оба способа открытия и закрытия таблиц имеют определенные преимущества.
Если свойства объекта DataEnvironment' - AutoOpenTables и AutoCloseTables - используют свои значения по умолчанию, а именно - "истинно" - True (.T.), то вам не нужно писать никакого кода для обеспечения открытия и закрытия таблиц и представлений в DataEnvironment.
Установка свойства AutoOpenTables объекта DataEnvironment - в "фальш" - False (.F.) дает разработчику чуть больше контроля над процессом. Таблицы открываются автоматически до наступления события формы Load, но после срабатывания события BeforeOpenTables объекта DataEnvironment. Это означает, что если код в методе, ассоциированном с событием Load формы определяет состояние ошибки (такой как в случае если пользователь открывает форму, которую он или она не имеют права использовать) и возвращает False (.F.), предохраняя форму от открытия, то в результате вы будете иметь отрицательное воздействие на производительность (нравится мне это выражение - performance penalty), так как таблицы будут открыты, но вообще не будут использованы. В таком случае, вызов метода OpenTables объекта вручную, после проверки разрешений безопасности для пользователя, может поднять скорость выполнения приложения. В реальности, открытие таблиц с помощью метода OpenTables вручную не является существенно более быстрым или более медленных, как в случае позволения объекту DataEnvironment открывать их автоматически , но время может быть сохранение в случае если не открывать таблицы вообще, если они не нужны или не могут быть использованы конкретным пользователем в силу указанной выше причины.
Если большая часть или все таблицы в объекте DataEnvironment используются следующей формой, набором форм или объектов DataEnvironment отчета, установка свойства AutoCloseTables объекта DataEnvironment в False (.F.) поднимет скорость закрузки следующего объекта DataEnvironment (формы, набора форм или отчета), так как таблицы уже открыты.
|