:: Visual Foxpro, Foxpro for DOS
проблема с TableUpdate
SergN
Автор
подскажите как обмануть Фокс (9я версия)

есть табличка t_group с полями group_id, type_id, group
как я понимаю "group" не очень хорошее название для поля но так уж есть
и над ней построено локальное представление 'group_v'

когда я делаю
UPDATE group_v ;
SET group_v.group = tmp1 ;
WHERE group_id = thisform.cmdEditGroup.Tag
TABLEUPDATE(.t.,.t.,'group_v')
=AERROR(err)

то TABLEUPDATE возвращает FALSE, а массив err содержит запись об ошибке №10 "syntax error"

она возникала сначала при простом update пока я не поменял значение поля group на group_v.group
а вот как можно обмануть TABLEUPDATE, чтобы он все-таки сбросил буфер?
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
Перминов Игорь

Сообщений: 1591
Откуда: Красная Орловка
Дата регистрации: 16.09.2001
Может я что-то не понимаю, а зачем собсно делать UPDATE по ЛВ? Не проще-ли сразу UPDATE для таблицы, а затем REQUERY?




------------------
Без коментариев..
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
SergN
Автор
ЛВ предполагается потом заменить на Remote View
так что надо вьюхи оставить
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
Перминов Игорь

Сообщений: 1591
Откуда: Красная Орловка
Дата регистрации: 16.09.2001
Может возникнуть такая ситуация, что Вы не сможите использовать Remote View для просмотра и редактирования удаленных данных. Как пример, ситуация в нашей (где я работаю) корпоративной сети, а именно сервер под ORACLE, без регистрации с помощью ХП, вообще не получишь доступа к данным, т.е. все попытки построить Remote View в дизайнере безуспешны. Только непосредственные запросы через SQLEXEC.




------------------
Без коментариев..
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Цитата:
когда я делаю
UPDATE group_v ;
SET group_v.group = tmp1 ;
WHERE group_id = thisform.cmdEditGroup.Tag
TABLEUPDATE(.t.,.t.,'group_v')
=AERROR(err)

то TABLEUPDATE возвращает FALSE, а массив err содержит запись об ошибке №10 "syntax error"

А не надо в командах SQL использовать ключевые слова типа ThisForm. Используй переменные памяти:

LOCAL lcGroup_ID
lcGroup_ID = thisform.cmdEditGroup.Tag
UPDATE group_v ;
SET group_v.group = tmp1 ;
WHERE group_id = m.lcGroup_ID
IF TABLEUPDATE(.t.,.t.,'group_v') = .F.
=AERROR(err)
ENDIF
Ну, и надеюсь, ты в курсе, что подобные групповые команды надо окружать транзакцией. Поскольку групповой TableUpdate() способен записать часть записей. Т.е. все те записи, которые были сброшены из буфера ДО возникновения ошибки будут, тем не менее, сохранены в таблице.
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
А почему в качестве первого параметра функции логическое значение?
Там должно быть 0,1 или 2. И необязательно форсировать апдет... RTFM.
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
Не должно.

For compatibility with previous Visual FoxPro applications, the nRows parameter also accepts False (.F.) and True (.T.) instead of 0 and 1 respectively. When specifying 0 or 1 for nRows, the record pointer remains on the record where changes could not be committed.
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
да, логично судя по тексту программы, проблем быть не должно,
видимо дело в самом view.
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
SergN
Автор
Про заключение в транзакции я в курсе, просто не стал их здесь указывать
замена thisform..... на локальную переменную памяти m.tmp2 ничего не дало

все-таки проблема именно с TABLEUPDATE, и именно после комманды SQL-UPDATE,
т.к. после SQL-INSERT буфер сбрасывается без проблем

view построено в Фоксовском редакторе, как и все остальные которые я использую, и с ними проблем не возникает

так что проблема №10 "syntax error" остается.
может как-то можно по-другому обратиться к этому полю?
или что-то изменить в DBSETPROP для поля?
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Триггер на модификацию у этой таблицы есть?
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
Сложно сказать в чем дело, не видя проекта... у меня такая конструкция
UPDATE SQL
TABLEUPDATE(0,.F.,'table1')
с удаленным представлением работает корректно.
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi Владимир!

Дело не в триггере, а в поле с именем group - ради интереса отследи через CursorAdapter (с аналогичными настройками), какую SQL конструкцию строит фокс при "автообновлениях". Именно на неё и ругается он.
Если поменять View вот так:
DBSETPROP("t_group.group", "FIELD", "UpdateName", "t_group.group")
То будет работать правильно.
Конечно ЛУЧШЕ всё-же заменить имя этого поля - ибо возможно что в очередной версии фокса и на конструкцию типа
UPDATE data!t_group ;
SET t_group.group = xxxx ;
WHERE ...
Будет идти ругань - как сейчас на
UPDATE data!t_group ;
SET data!t_group.group = xxxx ;
WHERE ...
И на
UPDATE data!t_group ;
SET group = xxxx ;
WHERE ...
Первая из которых очевидно и получается при использовании ViewDesigner




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
SergN
Автор
2 Igor Korolyov

ViewDesigner составляет такую строчку
DBSetProp(ThisView+".group","Field","UpdateName","t_group.group")
так что она есть...
а если поменять на
DBSETPROP("t_group.group", "FIELD", "UpdateName", "t_group.group")
то она просто ругается на неверный синтаксис, т.к. t_group - это таблица, а не view

а как в CursorAdapter посмотреть стандартную конструкцию UPDATE?
в ADVANCED он оставляет пустые поля, в которые можно писать СВОИ команды, если они отличаются от стандартных..

видимо и правда придется менять название поля обидно что Microsoft ограничивает нас в использовании имен

Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi SergN!

Странно, у меня он пишет полностью квалифицированное имя - т.е. "имя_БД!имя_таблицы.Имя_поля" и удаление имени БД из этой конструкции помогает... Может у тебя эта таблица не включена в БД?

Посмотреть можно так:
Открываем View, на базе его свойств CURSORGETPROP("SQL"), Tables, KeyFieldList, UpdatableFieldList, UpdateNameList, WhereType, SendUpdates cтроим CursorAdapter.
Пишем в обработчике BeforeUpdate код типа этого:
LPARAMETERS cFldState, lForce, nUpdateType, cUpdateInsertCmd, cDeleteCmd
? cFldState, lForce, nUpdateType, cUpdateInsertCmd, cDeleteCmd
RETURN DODEFAULT(cFldState, lForce, nUpdateType, cUpdateInsertCmd, cDeleteCmd)
Закрываем View и создаём экземпляр нашего адаптера, делаем CursorFill(), вносим изменения в разные поля, пытаемся их сохранить (если буферизация табличная, то нужен явный TableUpdate()) и смотрим на выводимые строки...




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
SergN
Автор
2 Igor Korolyov
таблица у меня действительно не включена в БД и лежит отдельно на файл-сервере (база состоит из свободных таблиц, и не вижу пока смысла их объединять в базу)
а БД состоит только из View'шек

вот такую комманду отправляет CA
UPDATE t_group SET GROUP=ca1.group WHERE GROUP_ID=OLDVAL('group_id','ca1')
и после TABLEUPDATE(.t.,.t.,'ca1') , ca1 - alias КурсорАдаптера
AERROR выдает уже ошибку №107 "Operator/operand type mismatch."

я пробовал заменить UpdateCmd на
UPDATE t_group SET t_group.GROUP=ca1.group WHERE t_group.GROUP_ID=OLDVAL('group_id','ca1')
но ошибка осталась

есть еще предложения что можно с этим сделать?

Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
Видимо, прийдется отказаться в данном случае от обновления RV, обновлять непосредственно таблицу
с последующим requery('group_v')
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi Влад!

Если у него выдаёт ошибку и второй UPDATE (я не тестировал на free таблице, потому не знаю), то ничего ему не поможет - он просто не сможет написать синтаксически корректную команду. Для таблицы включенной в БД второй синтаксис у меня сработал...




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
На таблице с последующим requery() работает, я проверял.
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
SergN
Автор
2 Igor Korolyov

То есть вы предлагаете отказаться от использование имени поля GROUP?
а через CA никак нельзя решить эту ситуацию ?
хотя у меня не получилось и так....
Ratings: 0 negative/0 positive
Re: проблема с TableUpdate
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
А что мешает делать так, как я написал?
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 61 (Гостей: 61)

© 2000-2024 Fox Club 
Яндекс.Метрика