|
Программирование >> Разработка пользовательского интерфейса
12 Редактируется 45 Редактируется -1 Добавляется -2 Добавляется Для того чтобы удалить запись, которая была добавлена, но не записана на диск, вам следует использовать функцию TABLEREVERT(), при этом помните, что ее использование с аргументом .T. очистит буфер полностью, а с аргументом .F. - только от текущей записи. Если вы не выполните функцию TABLEREVERT() раньше, чем функцию TABLEUPDATE(), то все записи, даже помеченные на удаление, запишутся на диск и при этом будут помечены на удаление. Мы уже не раз упоминали и использовали в примерах функции TABLEUPDATE() и TABLEREVERT(). Эти функции можно использовать при установлении буферизации. В противном случае появится системное сообщение о том, что без буферизации их использовать нельзя. Посмотрим более подробно на синтаксис этих функций: TABLEUPDATE([ \ Rows] [,lForce]] [, cTableAlias nWorkArea]) Первый аргумент lAllRows принимает значения .T. или .F.. Если значение аргумента равно .T. и установлена табличная буферизация, то на диск запишутся изменения во всех отредактированных записях, в противном случае запишутся только изменения из текущей записи. Второй аргумент lForce, также принимающий логическое значение, определяет, как относиться к изменениям других пользователей. Если вы вызываете функцию TABLEUPDATE() с аргументом lForce, равным .F., Visual FoxPro сгенерирует ошибку, как только найдет запись, в которой были сделаны изменения другим пользователем. Вам остается только решить, каким образом поступить с этой записью. В случае, если вы используете функцию TABLEUPDATE() со вторым аргументом, равным .T., то все изменения, сделанные другим пользователем или пользователями, будут переписаны. Если вы работаете с таблицей в текущей рабочей области, то третий аргумент cTableAlias или nWorkArea можете не указывать. В противном случае надо указать либо псевдоним, либо номер рабочей области таблицы, которую вы редактируете. Функция TABLEREVERT() выполняет обратное по отношению к TABLEUPDATE() действие -она очищает буфер без записи изменений на диск. TABLEREVERT([lAllRows] [, cTableAlias nWorkArea]) При этом если первый аргумент lAllRows равен .T., то очищается весь буфер, если же он равен .F., то буфер очищается только от изменений для текущей таблицы. Следующие четыре функции помогают находить выход из ситуаций, в которые может попасть приложение, когда велика вероятность одновременного редактирования одних и тех же записей разными пользователями. Это функции OLDVAL(), CURVAL(), GETNEXTMODIFIED(), GETFLDSTATE(). Функция OLDVAL() имеет следующий синтаксис: OLDVAL(cExpression [, cTableAlias nWorkArea]) Функция OLDVAL() возвращает первоначальное значение поля таблицы для текущей записи при установленной буферизации. При этом надо упомянуть, что если таблица в базе данных или курсор имеют правила проверки ввода, то устанавливать буферизацию не обязательно. Если указатель записи переместится на другую запись, когда установлена буферизация записи, или будет выполнена функция TABLEUPDATE() для записи изменений на диск, или будут произведены какие-либо другие действия, которые ведут к модификации данных, первоначальное значение больше доступно не будет. Тип значения, которое вернет функция OLDVAL(), соответствует типу значения аргумента cExpression. Например: OPEN DATABASE auto store USE account =CURSORSETPROP( Buffering ,5) GO 3 REPLACE account WITH 203 ?OLDVAL( account ) *** Будет возвращено значение 103 =TABLEUPDATE(.t.) ?OLDVAL( account ) *** Будет возвращено значение 203 Функция CURVAL() имеет следующий синтаксис: CURVAL(cExpress/on [, cTableAlias nWorkArea]) Функция CURVAL() возвращает значение поля прямо с диска для таблицы или внешнего источника данных. Значения полей, возвращаемые функциями CURVAL() и OLDVAL(), можно сравнивать, для того чтобы выяснить, изменял ли другой пользователь в сети значения поля, пока проводилось редактирование данного поля. Естественно, что CURVAL() и OLDVAL() возвращают разные значения только при использовании оптимистической буферизации записи или таблицы. Функция CURVAL() возвращает значение для текущего поля, и тип возвращаемого значения определяется типом выражения cExpress/on. В качестве примера слегка увеличим количество объектов в форме JUSTMADEFORMFORBUFFERINGVALIDATE. Добавьте два объекта TextBox, не связанных ни с каким полем, и две командные кнопки. Для события AfterRowColChange объекта Grid1 напишите следующий код: LPARAMETERS nColIndex THisForm.Text1.Value =; OLDVAL(ThisForm.Grid1.Columns(nColIndex).ControlSource) THisForm.Text2.Value =; CURVAL(ThisForm.Grid1.Columns(nColIndex).ControlSource) Для первой командной кнопки (она будет, к примеру, кнопкой сохранения) напишите всего две строчки: =TABLEUPDATE(.F.) ThisForm.Grid1.SetFocus Вторая кнопка будет отменять изменения, то есть уничтожать содержимое буфера для текущей записи в текущем образце формы: =TABLEREVERT(.F.) ThisForm.Grid1.SetFocus Теперь можете запустить эту форму несколько раз, проследив при этом, чтобы ее свойство BufferMode было равно Optimistic, и экспериментировать со значениями в первом и втором текстовом полях. Скорее всего, вы еще раз убедились, насколько хорошо иметь возможность создавать многопользовательскую среду на одном компьютере. На рис. 7.19 представлена ситуация, когда первоначальное значение поля RRR для третьей записи Greece в одном экземпляре формы было изменено на Israel, а в другом на Cyprus. Inl vtl Рис. 7.19. Так как значение Israel было записано на диск раньше, то теперь в самой правой форме мы имеем разные значения, возвращаемые функциями OLDVAL() и CURVAL(). Функция GETFLDSTATE() возвращает числовое значение, указывающее, было ли отредактировано значение поля в таблице или курсоре, или была ли запись добавлена, или был ли изменен статус удаления текущий записи. Если вы не указываете псевдоним или номер рабочей области, то функция GETFLDSTATE() возвращает значение для поля в текущей таблице или курсоре. Эта функция имеет следующий синтаксис: GETFLDSTATE(cF/eldWame nFieldNumber [, cTableAlias nWorkArea]) Следует отметить, что GETFLDSTATE() только определяет, изменялся ли статус удаления для записи. Например, если вы пометите запись для удаления, а затем выполните команду RECALL, то функция GETFLDSTATE() укажет, что статус деления изменился, даже если вы вернули его в перовоначальное положение. Поэтому мы рекомендуем использовать функцию DELETED() для определения статуса удаления. Функция GETFLDSTATE() может употребляться и при отсутствии буферизации. Значения, которые возвращает эта функция, приведены в табл. 7.7. Таблица 7.7. Возвращаемые значения и соответствующий статус Значение Статус 1 Поле не изменялось, и статус удаления не изменялся 2 Поле было отредактировано или статус удаления был изменен 3 Поле в добавленной записи не редактировалось, и его статус удаления не изменилось 4 Поле в добавленной записи изменялось, и его статус удаления изменялся Функция GETNEXTMODIFIED() возвращает номер следующей измененной записи в буферизованой таблице или курсоре: GETNEXTMODIFIED(nRecordNumber [, cTableAlias nWorkArea]) Параметр nRecordNumber указывает номер записи, начиная с которой необходимо искать запись, подвергнутую изменениям. Функция GETNEXTMODIFIED() возвращает 0, если нет модифицированных записей после записи, которую вы указали. Запись рассматривается как измененная, если содержимое хоть одного из полей было изменено (даже если было возвращено первоначальное значение) или был
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |