powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Добавление новой строки
7 сообщений из 7, страница 1 из 1
Добавление новой строки
    #33891493
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос очень часто разбирался, но ответов я не нашел.
У меня на форме есть Grid заполненный локальным представлением vie.
Есть кнопка новая строка на ней такой код
PUBLIC nRecn
SELECT vie
nRecn =RECNO()
GO BOTTOM in vie
APPEND BLANK IN vie

thisform.grid2.column1.text1.Value = NewID('vie')
= TABLEUPDATE(.T.)
Thisform.grid2.Refresh
thisform.grid2.SetFocus()
Строчка thisform.grid2.column1.text1.Value = NewID('vie') присваивает новое значение уникального ключа. На представлении стоит 3 буферизация. После нажатия на кнопку появляется новая строка с уник. ключом но как только я перехожу на другую появляется ошибка
Cannot insert an empty row from a view into its base table(s)
И ещё, при добавлении строки уник. ключ надо добавлять в представление или в таблицу по которой построено представление.
...
Рейтинг: 0 / 0
Добавление новой строки
    #33892248
Проходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уж сколько раз твердили миру...

Грид ничем не может быть заполнен по определению. Он ничего в себе не хранит.
Представление тоже ничего в себе не хранит. Это всего лишь SQL запрос. Все изменения надо вносить в исходные таблицы. Что, собственно, фокс и говорит в сообщении об ошибке.
То есть вместо строки
thisform.grid2.column1.text1.Value = NewID('vie')
должно быть что-то вроде
Код: plaintext
Insert into base_table_for_view_VIE (keyfield) values (NewId('vie'))
...
Рейтинг: 0 / 0
Добавление новой строки
    #33894159
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за объяснение. Я сделал вот так.
PUBLIC nRecn
SELECT disp3
nRecn =RECNO()
GO BOTTOM in disp3
APPEND BLANK IN disp3
REPLACE code3 WITH NEWID('VIE'), code WITH 0
= TABLEUPDATE(.T.)
Thisform.Refresh()


где disp3 основная таблица. Но появилась проблема если нажимать на кнопку новая строка то строка не появляется, а появляется только после того как закрою форму и открою её снова. Как это исправить ?
...
Рейтинг: 0 / 0
Добавление новой строки
    #33894178
sanya_tir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
thisform.grid1.setfocus
...
Рейтинг: 0 / 0
Добавление новой строки
    #33894343
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sanya_tirthisform.grid1.setfocus

Не помогло, строка появляется только после перезапуска формы.
Может кто глянет в чем у меня ошибка?
...
Рейтинг: 0 / 0
Добавление новой строки
    #33895050
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавляешь в таблицу - грид на вьюхе.
и чегой-то этой записи показываться ;-)
REQUERY('VIE') поможет отцу русской демократии
...
Рейтинг: 0 / 0
Добавление новой строки
    #33895169
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это надо самые азы объяснять.

Физически Local View - это результат работы команда Select-SQL. Т.е. это некая выборка из исходной таблицы, которая записывается в некоторую временную таблицу.

Другими словами, Local View - это НЕ исходная таблица с наложенным фильтром. Это физически ДРУГАЯ таблица.

Однако при определенных настройках FoxPro может взять на себя задачу синхронизации данных в Local View и в исходной таблице. Т.е. изменения, внесенные в Local View будут автоматически перенесены в исходную таблицу.

Эти настройки делаются на закладке Update Criteria в дизайнере Local View. В данном случае принципиально важными являются следующие настройки:

Переключатель "Send SQL Update" - будет ли вообще запущен процесс переноса данных из Local View в таблицу-источник

Столбец под иконкой ключа - это поле или набор полей по значению которых будет происходить поиск записи в таблице-источнике при модификации данных.

Столбец под иконкой карандаша - это те поля, значения которых будут обновлены значениями из Local View.

Если необходимо, чтобы изменения, сделанные в ключевом поле Local View также попали в таблицу-источник, то для ключевого поля надо будет поставить птички в обеих колонках. И под иконкой ключа и под иконкой карандаша.

Local View всегда находится в режиме оптимистической буферизации. По умолчанию, в строковой (3), но можно переключить в табличную (5). Отменить режим буферизации или переключиться в пессимистическую буферизацию для Local View - невозможно.

Соответственно, процесс синхронизации (переноса изменений) с таблицей источником происходит в момент сброса буфера.

Для строковой буферизации:

При попытке перехода на другую запись

При попытке закрытия Local View

По команде TableUpdate()

Для табличной буферизации - только по команде TableUpdate() и никак иначе.

Однако следует понимать, что после операции сброса буфера в Local View содержимое этого самого Local View никак не изменится. Мы же не его меняли, а всего-лишь переносили данные из Local View в таблицу-источник.

Чтобы обновить содержимое Local View свежими данными из таблицы-источника используется специальная функция

Requery("MyLocalView")

которая, по сути, выполняет перезапрос. Заново выполняет команду Select-SQL для наполнения Local View. Все старые данные, содержащиеся в Local View при этом теряются.

=====================

По поводу NewID()

Подобные функции записывают в хранимых процедурах контейнера базы данных (Stored Procedure), поскольку они напрямую связаны с целостностью базы данных. При этом отпадает необходимость прописывать путь доступа к этим процедурам или подключать их через SET PROCEDURE.

Поскольку это функции генерации значений по умолчанию, то вызов этой функции делается в свойстве Default соответствующего поля. Подробнее об этом свойстве читай здесь

Значение по умолчанию (Default)

Для Local View также можно настроить значение Default. В конструкторе Local View самая первая закладка "Fields" внизу в середине есть кнопка "Properties".

Генерить NewId в привязке к собственно Local View (в примере - по алиасу Local View) - бессмысленно. Ведь значение, которое отображается в Local View берется из таблицы-источника. Значит, надо вызвать эту функцию с параметром - таблицы-источника.

Тогда создание новой записи примет примерно такой вид:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
* Создание новой записи во View
select vie
APPEND BLANK

* Попытка сброса буфера, чтобы создать новую запись в таблице-источнике
* Обычно весь этот код выносится в специальную кнопку "Сохранить"
IF TableUpdate() = .T.
	* Если сброс буфера прошел успешно, то обновляю содержимое View
	Requery('vie')
ELSE
	LOCAL laError( 1 )
	AERROR(laError)
	* Анализ содержимого массива laError для уточнения причины ошибки
ENDIF
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Добавление новой строки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]