Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
04.06.2003, 11:29
|
|||
---|---|---|---|
|
|||
LOCAL View again B-( |
|||
#18+
Достал уже всех наверное… но не выходит… База Kartr таблица trans (дочерняя) ключ по полю nCode к таблице этой LOCAL VIEW transbycod с установленным Send Updates На форме грид по данному LOCAL VIEW transbycod Продедура добавления записи в LOCAL VIEW transbycod INSERT INTO transbycod (nCode, nKartr_ful, nKartful_center, nKartr_emp,; nRequest, dDate_request) ; VALUES (VAL(thisform.kod.caption), nKF, nKFC + thisform.nQuantity.value, ; nEmpt - thisform.nQuantity.value, 1, thisform.ddate.value) kod = nDirKOD requery("transbycod") Продедура удаления записи в LOCAL VIEW transbycod select transbycod delete SKIP 1 IF EOF() SKIP -1 ENDIF Добавление идет нормально… а удаление… если после добавления 2-3 строк сделать удаление одной из них - вываливается WARNING: the they defined by the keyfield property for table is not unique В чем я туплю??? И еще вопрос – добавление и в локал вью и в саму таблицу идет одновременно… а как сделать, чтобы добавление в таблицу шло ТОЛЬКО после выполнения определенной процедуры (что именно в этой процедуре должно быть???) Никогда прежде не работал с представлениями… вот решил попробовать (хотя БЕЗ представления думаю уже давно бы решил проблему…) теперь неохота делать шаг назад… В-) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
04.06.2003, 12:25
|
|||
---|---|---|---|
LOCAL View again B-( |
|||
#18+
Утомился я уже повторять одно и то же. View - это НЕ исходная таблица. Это временная таблица являющаяся результатом выполнения SQL-запроса и физически расположенная на машине клиента. Тем не менее, в FoxPro предусмотрен механизм копирования информации из View в исходные таблицы. С этой целью на закладке Update Criteria необходимо указать поле или поля, являющиеся ключевыми. Вот именно на основе сравнения значения этого поля FoxPro и определяет в какой именно записи произошло изменение. View всегда находится в режиме оптимистической буферизации. По умолчанию - оптимизации строк (3), но может быть переключено и в режим оптимизации таблиц (5). Сброс буфера происходит: В режиме буферизации строк -) При переходе на другую запись -) При закрытии таблицы -) По команду TableUpdate() В режиме буферизации таблиц -) Только по команде TableUpdate() и никак иначе. Т.е. если необходимо обеспечить исключительно программный сброс буфера, то необходимо переключить View в режим табличной буферизации (5). Это можно сделать: -) В DataEnvironment в свойствах соответсвующего курсора (BufferModeOverride) -) Командой CursorSetProp('buffering',5,'MyView') -) Есть еще свойство BufferMode в форме, но им лучше не пользоваться Итак, что же у тебя собственно происходит. Судя по всему ты не переключал режим оптимизации и View у тебя установлено в режиме строковой буферизации (3). После добавления записи (INSERT) происходит автоматический сброс буфера и по Requery() ты уже видишь обновленные данные. После удаления записи в момент перехода на другую запись также происходит сброс буфера и запись удаляется в исходной таблице. Теперь ты создаешь новую запись, но с кодом использованном в ранее удаленной записи. Попытка сброса буфера такой записи вызывает сообсщение о нарушении уникальности индекса, поскольку в индексе учитываются и удаленные записи. На всякий случай: -) В формате DBASE реализовано двухтактное удаление. Т.е. команда DELETE только помечает запись как удаленную, но физически ее не удаляет. Для физического удаления записи необходимо дать команду PACK, но она требует открытия таблицы в режиме EXCLUSIVE. -) Если в режиме табличной буферизации создать во View новую запись и тут же ее удалить, то при сбросе буфера такая запись в исходную таблицу не сбрасывается. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
04.06.2003, 16:46
|
|||
---|---|---|---|
|
|||
LOCAL View again B-( |
|||
#18+
сделал как Вы и советовали... буфферизацию поставил на 5 НО при этом всем апдейт таблицы иднт ТОЛЬКО при добавлении записей... при удалении ничего не удаляется в таблицу изменения не переходят... select transbycod delete SKIP 1 IF EOF() SKIP -1 ENDIF а на гриде в AfterRowColChange tableupdate() вот и при удалении ничего не удаляет В-( Теперь ты создаешь новую запись, но с кодом использованном в ранее удаленной записи. Попытка сброса буфера такой записи вызывает сообсщение о нарушении уникальности индекса, поскольку в индексе учитываются и удаленные записи. и как этого избежать? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
04.06.2003, 18:12
|
|||
---|---|---|---|
LOCAL View again B-( |
|||
#18+
1. Не надо сбрасывать каждую запись отдельно. Это и тебе лишняя морока и пользователя раздражает. На форме должна быть кнопка "Сохранить". Т.е. пользователь наигрался с Grid, создал кучу новых записей, еще одну кучу удалил и решил что это хорошо. Вот теперь он нажимает кнопку "Сохранить" и все это добро пытается сбросится в исходные таблицы. 2. Я конечно понимаю, что лень читать документацию, если можно в конфе спросить. Но все-таки напрягись и почитай описание к команде TableUpdate(). По умолчанию происходит сброс только текущей записи. Чтобы сбросить все записи необходимо дать команду TableUpdate(.T.) 3. По поводу уникальности индекса. Ну все зависит от механизма генерации уникального ключа. Самый "правильный" способ - это использование суррогатного ключа построенного по принципу автоинкремента. Т.е. ранее использованное значение ключа уже не может быть использовано повторно, даже если запись была удалена. А вообще-то в приведенной идеологии, если сброс будет одномоментный по кнопке "Сохранить", а не для каждой записи в отдельности, то за один сеанс работы конфликтов уникальности быть не должно. Правда похоже ошибка уникальности связана не со значением ключа в исходной таблице, а с выбором ключевых полей на закладке Update Criteria собственно View. В качесвтве ключевого поля следует назначать то поле (или поля) значение которых будет уникально вне зависимости от факта удаления записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=41&tablet=1&tid=1598246]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
105ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
others: | 273ms |
total: | 470ms |
0 / 0 |