powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / VFP + SQL поле IDENTITY
25 сообщений из 215, страница 8 из 9
VFP + SQL поле IDENTITY
    #33606379
Oopyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergej_S Прогони код из поста 2436139 - CAD в VFP 9 решает вопрос о передаче ключевого поля, присвоенного сервером в фокс без requery() всего курсора. Сам, правда с CAD я пока на 8 фоксе работаю, там такого прибамбаса еще нет.

А вот это полностью решает проблему. Устанавливаем свойство адаптера
Код: plaintext
InsertCmdRefreshFieldList = "PKey"  && имя ключевого поля
и после TABLEUPDATE() оно автоматически обновляется. Никаких REQUERY() делать не надо и указатель остаётся на той же записи.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606392
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый FoXXX
Я не прощу от вас конкретных примеров!
Мой вопрос именно про идеологию построения системы.
Дело в том, что я на работе занимаюсь именно идеологией взаимодействия клиента и сервера.
Я в свое время (примерено лет 5 назад) отказался от построения универсальной клиентской системы, которая могла бы работать с ЛЮБЫМ сервером баз данных и в качестве сервера выбрали MS SQL Server. По этой причине у меня нет необходимости писать свой серверный код с строго в ANSI-92. Также я могу использовать SQL Pass-Through (PT) без всяких ограничений.
Вы выбрали, как я понял из ваших сообщений в этом топике, вариант с использование для извлечения и обновления существующих данных Remote View (RV).
При этом, из ваших же сообщений, я делаю вывод, что в качестве исходных данных для построения RV вы используете не только таблицы сервера, но и объекты View сервера. Это нормально и вполне логично, т.к. построитель RV самого VFP не в состоянии построить запрос для удаленного источника данных даже в соответствии с ANSI-92!.
Т.е. у вас в формах клиента (VFP) есть данные, полученные через такие RV, которые отображают данные из нескольких таблиц, т.к. View как объект базы данных сервера может почти тоже самое, что и запрос, т.е. содержать конструкции вида JOIN, UNION, GROUP BY. Не так ли.
Далее вы писали, что обновление данных на севере вы производите через RV с использованием команды VFP - TABLEUPDATE(...).
И вот тут у меня возникает большой вопрос! Каким образом вы производите обновление данных на севере через RV (TABLEUPDATE) в случае, когда в качестве источника данных для вашего RV послужил View сервера, а не таблица? Да не просто View, а View, который построен от нескольких таблиц.
При попытки обновить такое поле вы получите сообщение типа "Update or insert of view ..... failed because it contains a derived or constants field". Думаю, что переводить это не надо.
А в реальной системе, у вас все таблицы (ну за исключением, может быть "плоских" таблиц-справочников, т.е. таблиц, которые не имеют НИ одного Foreign Key) имеют связи с другими и с помощью View вы их и "собираете".
Как вы в таком случае обновляет RV в клиенте?
Если через хранимые процедуры сервера, т.е. через SQLEXEC, т.е. через PT, то тогда система у вас точно не будет универсальная и работать с любым ANSI-92 совместимым сервером баз данных.
Хотелось бы услышать от вас, как идеолога системы ответы на мои вопросы.

С уважением, Алексей
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606470
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ув. Алексей!

понял ваш вопрос.
вот вы говорите:

авторт.к. построитель RV самого VFP не в состоянии построить запрос для удаленного источника данных даже в соответствии с ANSI-92!.

а для неудаленного источника? для неудаленного источника VFP в состоянии посторить запрос?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606532
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если строить запрос через Local View, то ограничения, как я полагаю, те же, что и в Remote View, но я ни разу не пользовался Local View :).
Если мне надо сделать запрос, то использую команду SELECT - SQL самого VFP. А в ней с каждой версией все больше соответствия наблюдается со стандартом ANSI-92. И это рабует!
Собственно говоря, как я полагаю, в этом одно из огромных достоинств VFP перед другим, как клиента сервера баз данных. Есть свой RDBE (Relation DataBase Enagine), который почти полностью соответствует ANSI-92. Можно гибко разделять нагрузку между севером и клиентом.
Поэтому, лет 6 назад мы на фирме и выбрали его (VFP) в качестве инструмента написания клиентской части для КИС (Корпоративной Информационной Системы).

С уважением, Алексей
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606539
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей! Вы используете нормализацию? какую?

Вам много приходится собирать?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606549
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Local View вполне соответствует.. справляется, LV строим из RV таблиц.

view на сервере для отчетов, мониторинга, наблюдения , не для корректировки.

для корректировки RV таблиц, LV RV.. вот такой каламбур.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606579
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
схема такая:
RV1+RV2 -> LV1
RV3+RV4 -> LV2
RV1+RV4+LV1 -> LV3
LV1+LV2-LV3 -> LV4

вот и все... чтобы изменения вступали в силу нужны ключевые поля участников в результате.. и Send SQL Updates например Key Fields Only
Update Using SQL UPDATE
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606589
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXАлексей! Вы используете нормализацию? какую?

Вам много приходится собирать?
1. Да, конечно, 3N - 3-я нормальная форма.
2. А практически все запросы у нас следуют не к таблицам, а к View
С уважением, Алексей.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606596
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXсхема такая:
RV1+RV2 -> LV1
RV3+RV4 -> LV2
RV1+RV4+LV1 -> LV3
LV1+LV2-LV3 -> LV4

вот и все... чтобы изменения вступали в силу нужны ключевые поля участников в результате.. и Send SQL Updates например Key Fields Only
Update Using SQL UPDATE
Другим словами, RV1, RV2, RVN - это View только к одной таблице?
С уважением, Алексей.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606605
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нет конечно, хотя можно и к одной, но зачем?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606606
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RV - remout view
LV - local view
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606627
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да еще в Connection Designer

Batch Processing Automatic Transactions Packet Size 4096

в RV

Share Connection Number of Records to Fetch at a Time all Maximum Number of Records to Fetch all Number of Records to Batch Update 1

ну остальное по умолчанию

с уважением FoXXX
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606686
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все таки хотелось бы глянуть на пример:
У вас на SQl Server есть View, котрый объединяет 3 таблицы:
1. Документ
2. Два справочника на котором есть ссылки в документе.
Есть View на сервере, который объединяет эти три таблицы.
Как вы будете строить LV и RV?
С уважением, Алексей
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606740
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-KВсе таки хотелось бы глянуть на пример:
У вас на SQl Server есть View, котрый объединяет 3 таблицы:
1. Документ
2. Два справочника на котором есть ссылки в документе.
Есть View на сервере, который объединяет эти три таблицы.
Как вы будете строить LV и RV?
С уважением, Алексей

1. Мы же не будем корректировать справочники в форме (гриде) показывающем документ? (естественно справочники подключены и мы видим не коды, а значения) правильно?

2. Здесь возможно два варианта, это я так на вскидку как версия, union не нужен, view простенький получается:
вариант1 создать view на сервере, по-моему (если мне не изменяет память) SQL сервер не запрещает корректировку view с определенными условиями, сейчас не вспомню, но знаю что это можно, тогда все по схеме view->RV
корректируем RV, доступны для корректировки только поля главной таблицы.
вариант2 создать RV1 RV2 RV3, ну естественно с отсевом ненужной информации, что бы лишнего на клиента не тащить, потом RV1+RV2+RV3->LV
корректируем LV но здесь по полям справочников не нужно ставить галку в LV.
да и в RV справочников, хотя может быть вы хотите корректировать справочники, тогда в RV можно оставить.

ну вот вроде так в данный момент и проверить не могу, попробуйте протестируйте, должно работать.

С уважением FoXXX.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606841
Oopyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oopyr Sergej_S Прогони код из поста 2436139 - CAD в VFP 9 решает вопрос о передаче ключевого поля, присвоенного сервером в фокс без requery() всего курсора. Сам, правда с CAD я пока на 8 фоксе работаю, там такого прибамбаса еще нет.

А вот это полностью решает проблему. Устанавливаем свойство адаптера
Код: plaintext
InsertCmdRefreshFieldList = "PKey"  && имя ключевого поля
и после TABLEUPDATE() оно автоматически обновляется. Никаких REQUERY() делать не надо и указатель остаётся на той же записи.

Подобного же результата можно добиться с помощью метода CA.RecordRefresh()(начиная опять же с 9-ки). Но его, естественно, надо вызывать ручками после каждого TABLEUPDATE(). Эдакий мини-REQUERY() на одну запись.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33608739
куб
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно делать такой RV
SELECT * FROM dbo.ra Ra WHERE Ra.id= @@identity

тогда requery() после inserta работает прекрасно!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33609138
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OopyrПодобного же результата можно добиться с помощью метода CA.RecordRefresh()(начиная опять же с 9-ки).
Тоже хорошо, списибо за информацию.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33609375
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergej_S, Oopyr
Нет ребята. Так не пойдет. В 9 версии по прежнему нет решения.

То, что Вы привели - это все то же решение через дополнительное поле. Просто оно скрыто в автоматическом режиме.

Тут все очень хитро "запрятано".

Чтобы понять в чем проблема, снимите в приведенном примере настройку UNIQUE с поля f_int_unique и создай новую запись со значением этого поля уже существующей записи. Например, f_int_unique=2. Делаем TableUpdate() и видим значение ключевого поля равное 2 (!). Ну, и TableUpdate() возвращает .F., поскольку поле не уникально.

Другими словами, CAD просто прочитал значение записи, опираясь в качестве ключа на то поле, которое указано в свойстве InsertCmdRefreshKeyFieldList .

По сути - это все то же решение с дополнительным полем, когда поиск новой записи осуществляется по значению другого (НЕ ключевого) поля или набора полей. Просто CAD дал возможность явно указать это дополнительное поле.

Так что, рано обрадовались. По прежнему нет адекватного решения "в общем случае" при использовании CAD.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33609509
куб
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ!

А как мой пример? Нормальное решение?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33609516
Oopyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это если на insert триггеры не повешены, которые вставляют в другие таблицы, у которых тоже есть identity. Тогда сработает.
Если же такой триггер есть, то вернёт identity последней таблицы, в которую вставляли, а не той, которую нам надо.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33609533
куб
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OopyrЭто если на insert триггеры не повешены, которые вставляют в другие таблицы, у которых тоже есть identity. Тогда сработает.
Если же такой триггер есть, то вернёт identity последней таблицы, в которую вставляли, а не той, которую нам надо.

да наверно, но scope_identity() не срабатывает к сожалению
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33609891
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ Sergej_S, Oopyr


Нет ребята. Так не пойдет. В 9 версии по прежнему нет решения.

То, что Вы привели - это все то же решение через дополнительное поле. Просто оно скрыто в автоматическом режиме.

Тут все очень хитро "запрятано".

Чтобы понять в чем проблема, снимите в приведенном примере настройку UNIQUE с поля f_int_unique и создай новую запись со значением этого поля уже существующей записи. Например, f_int_unique=2. Делаем TableUpdate() и видим значение ключевого поля равное 2 (!). Ну, и TableUpdate() возвращает .F., поскольку поле не уникально.

Другими словами, CAD просто прочитал значение записи, опираясь в качестве ключа на то поле, которое указано в свойстве InsertCmdRefreshKeyFieldList .

По сути - это все то же решение с дополнительным полем, когда поиск новой записи осуществляется по значению другого (НЕ ключевого) поля или набора полей. Просто CAD дал возможность явно указать это дополнительное поле.

Так что, рано обрадовались. По прежнему нет адекватного решения "в общем случае" при использовании CAD.


топик настолько вырос уже стали забывать ,что было вначале.

в первом приведённом мной примере соединение происходит через ODBC
и уникальное поле необходимо потому что ODBC не поддерживает авторефреш
без уникального поля

/topic/265415&pg=4#2436396
приведён второй пример где всё происходит через ADO и уникальное поле не нужно его там просто нет если бы открыли увидели
не вводите взаблужение заинтересованных лиц



я ничего не хочу доказывать и набрасываться на FoXXX
прав он или не прав
ему это не мешат писать свой код и даже руководить

переубедить его не возможно 8 страниц топика показатель

но вопрос был
как CAD получить IDEntity поле

авторефреш рекордсета есть давно

хороший ресурс по ADO ввиде справочника
http://www.activeserverpages.ru/ado/

если все правильно настроить , а это не так долго , то через CAD
Мы всё это получаем в полном объёме

С уважением ко всем....... !!!

Всё боится времени
.... и только время боится пирамид!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33610062
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_t
топик настолько вырос уже стали забывать ,что было вначале.

в первом приведённом мной примере соединение происходит через ODBC
и уникальное поле необходимо потому что ODBC не поддерживает авторефреш
без уникального поля

/topic/265415&pg=4#2436396
приведён второй пример где всё происходит через ADO и уникальное поле не нужно его там просто нет если бы открыли увидели
не вводите взаблужение заинтересованных лиц
Павел, Вы смотрели профайлер MS SQL? Т.е. как именно физически происходит это самое обновление записи?

Так вот, там "в лоб" пишется запрос

SELECT @@IDENTITY

Т.е. это все будет работать пока не появится триггер на вставку, в котором происходит вставка в другую таблицу с полем типа IDENTITY.

Я специально создал еще одну тестовую табличку и в триггере основной таблицы (которую просматривает ADO) на вставку сделал вставку в дополнительную таблицу. Так вот, Ваш пример просто заклинило! Он вообще не смог найти нужные данные! Т.е. запись физически успешно добавлялась, но обновления не происходило!

Разумеется, значение @@IDENTITY в подчиненной таблице должно отличаться от этого значения в главной. Поскольку триггер к временной таблице построить нельзя, то пришлось это все переделать для постоянных таблиц.

Pavel_tно вопрос был
как CAD получить IDEntity поле

авторефреш рекордсета есть давно

хороший ресурс по ADO ввиде справочника
http://www.activeserverpages.ru/ado/

если все правильно настроить , а это не так долго , то через CAD
Мы всё это получаем в полном объёме
Повторяю еще раз. НЕТ корректного решения "в общем случае".

ADO ведь не придумал ничего нового в этом смысле. Это просто другой способ доступа к данным. Но механизм работы MS SQL сервера от этого не изменился.

Ну, как физически ADO может получить информацию о новой записи? Особенно, если "он появился давно".
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33610075
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вернуться к теме, то вот здесь

http://forum.foxclub.ru/read.php?29,184077,184299#msg-184299

Алексей Цингауз, представитель MSFT команды разработчиков VFP привел несколько вариантов решения:

1) Через ODBC - Чтение значения @@IDENTITY после удачной вставки.
2) и 4) Через ADO - вместо прямой команды вставки формируется хранимая процедура. В нее в качестве параметров передаются значения полей и через SCOPE_IDENTITY( ) читается новое значение
3) Это ранее описанное решение с авторефрешем, когда для чтения новой записи опираются на значение другого поля.

В общем, нет простого решения. Все время приходится что-то изобретать...
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33610742
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Oopyr!

> Собственно ещё есть способ
> Вернуться к старым временам и генерить ключ на клиенте.

На клиента можно генерировать пожалуй только GUID - иначе обеспечить
уникальность будет проблематично. А вот если использовать собственно сервер
для генерации ID - тогда другое дело. При этом вполне можно обойтись одной
универсальной схемой - это модификация NewID для случая отсутствия
блокировок.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
25 сообщений из 215, страница 8 из 9
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / VFP + SQL поле IDENTITY
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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