|
|
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Sergej_S Прогони код из поста 2436139 - CAD в VFP 9 решает вопрос о передаче ключевого поля, присвоенного сервером в фокс без requery() всего курсора. Сам, правда с CAD я пока на 8 фоксе работаю, там такого прибамбаса еще нет. А вот это полностью решает проблему. Устанавливаем свойство адаптера Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 18:34 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Уважаемый 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 совместимым сервером баз данных. Хотелось бы услышать от вас, как идеолога системы ответы на мои вопросы. С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 18:41 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Ув. Алексей! понял ваш вопрос. вот вы говорите: авторт.к. построитель RV самого VFP не в состоянии построить запрос для удаленного источника данных даже в соответствии с ANSI-92!. а для неудаленного источника? для неудаленного источника VFP в состоянии посторить запрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 19:16 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Если строить запрос через Local View, то ограничения, как я полагаю, те же, что и в Remote View, но я ни разу не пользовался Local View :). Если мне надо сделать запрос, то использую команду SELECT - SQL самого VFP. А в ней с каждой версией все больше соответствия наблюдается со стандартом ANSI-92. И это рабует! Собственно говоря, как я полагаю, в этом одно из огромных достоинств VFP перед другим, как клиента сервера баз данных. Есть свой RDBE (Relation DataBase Enagine), который почти полностью соответствует ANSI-92. Можно гибко разделять нагрузку между севером и клиентом. Поэтому, лет 6 назад мы на фирме и выбрали его (VFP) в качестве инструмента написания клиентской части для КИС (Корпоративной Информационной Системы). С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 19:42 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Алексей! Вы используете нормализацию? какую? Вам много приходится собирать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 19:45 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Local View вполне соответствует.. справляется, LV строим из RV таблиц. view на сервере для отчетов, мониторинга, наблюдения , не для корректировки. для корректировки RV таблиц, LV RV.. вот такой каламбур. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 19:50 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
схема такая: RV1+RV2 -> LV1 RV3+RV4 -> LV2 RV1+RV4+LV1 -> LV3 LV1+LV2-LV3 -> LV4 вот и все... чтобы изменения вступали в силу нужны ключевые поля участников в результате.. и Send SQL Updates например Key Fields Only Update Using SQL UPDATE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 20:03 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
FoXXXАлексей! Вы используете нормализацию? какую? Вам много приходится собирать? 1. Да, конечно, 3N - 3-я нормальная форма. 2. А практически все запросы у нас следуют не к таблицам, а к View С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 20:06 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
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 только к одной таблице? С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 20:09 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
нет конечно, хотя можно и к одной, но зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 20:19 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
RV - remout view LV - local view ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 20:21 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
да еще в 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 20:40 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Все таки хотелось бы глянуть на пример: У вас на SQl Server есть View, котрый объединяет 3 таблицы: 1. Документ 2. Два справочника на котором есть ссылки в документе. Есть View на сервере, который объединяет эти три таблицы. Как вы будете строить LV и RV? С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 21:36 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 22:26 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Oopyr Sergej_S Прогони код из поста 2436139 - CAD в VFP 9 решает вопрос о передаче ключевого поля, присвоенного сервером в фокс без requery() всего курсора. Сам, правда с CAD я пока на 8 фоксе работаю, там такого прибамбаса еще нет. А вот это полностью решает проблему. Устанавливаем свойство адаптера Код: plaintext Подобного же результата можно добиться с помощью метода CA.RecordRefresh()(начиная опять же с 9-ки). Но его, естественно, надо вызывать ручками после каждого TABLEUPDATE(). Эдакий мини-REQUERY() на одну запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2006, 00:53 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
можно делать такой RV SELECT * FROM dbo.ra Ra WHERE Ra.id= @@identity тогда requery() после inserta работает прекрасно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2006, 16:48 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
OopyrПодобного же результата можно добиться с помощью метода CA.RecordRefresh()(начиная опять же с 9-ки). Тоже хорошо, списибо за информацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2006, 18:50 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Sergej_S, Oopyr Нет ребята. Так не пойдет. В 9 версии по прежнему нет решения. То, что Вы привели - это все то же решение через дополнительное поле. Просто оно скрыто в автоматическом режиме. Тут все очень хитро "запрятано". Чтобы понять в чем проблема, снимите в приведенном примере настройку UNIQUE с поля f_int_unique и создай новую запись со значением этого поля уже существующей записи. Например, f_int_unique=2. Делаем TableUpdate() и видим значение ключевого поля равное 2 (!). Ну, и TableUpdate() возвращает .F., поскольку поле не уникально. Другими словами, CAD просто прочитал значение записи, опираясь в качестве ключа на то поле, которое указано в свойстве InsertCmdRefreshKeyFieldList . По сути - это все то же решение с дополнительным полем, когда поиск новой записи осуществляется по значению другого (НЕ ключевого) поля или набора полей. Просто CAD дал возможность явно указать это дополнительное поле. Так что, рано обрадовались. По прежнему нет адекватного решения "в общем случае" при использовании CAD. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2006, 22:42 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
ВладимирМ! А как мой пример? Нормальное решение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2006, 04:48 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Это если на insert триггеры не повешены, которые вставляют в другие таблицы, у которых тоже есть identity. Тогда сработает. Если же такой триггер есть, то вернёт identity последней таблицы, в которую вставляли, а не той, которую нам надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2006, 05:21 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
OopyrЭто если на insert триггеры не повешены, которые вставляют в другие таблицы, у которых тоже есть identity. Тогда сработает. Если же такой триггер есть, то вернёт identity последней таблицы, в которую вставляли, а не той, которую нам надо. да наверно, но scope_identity() не срабатывает к сожалению ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2006, 07:09 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
ВладимирМ 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 Мы всё это получаем в полном объёме С уважением ко всем....... !!! Всё боится времени .... и только время боится пирамид! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2006, 17:31 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
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 может получить информацию о новой записи? Особенно, если "он появился давно". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2006, 23:07 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Если вернуться к теме, то вот здесь http://forum.foxclub.ru/read.php?29,184077,184299#msg-184299 Алексей Цингауз, представитель MSFT команды разработчиков VFP привел несколько вариантов решения: 1) Через ODBC - Чтение значения @@IDENTITY после удачной вставки. 2) и 4) Через ADO - вместо прямой команды вставки формируется хранимая процедура. В нее в качестве параметров передаются значения полей и через SCOPE_IDENTITY( ) читается новое значение 3) Это ранее описанное решение с авторефрешем, когда для чтения новой записи опираются на значение другого поля. В общем, нет простого решения. Все время приходится что-то изобретать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2006, 23:34 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Hi Oopyr! > Собственно ещё есть способ > Вернуться к старым временам и генерить ключ на клиенте. На клиента можно генерировать пожалуй только GUID - иначе обеспечить уникальность будет проблематично. А вот если использовать собственно сервер для генерации ID - тогда другое дело. При этом вполне можно обойтись одной универсальной схемой - это модификация NewID для случая отсутствия блокировок. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2006, 00:30 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33610075&tid=1592046]: |
0ms |
get settings: |
4ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
140ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 404ms |

| 0 / 0 |
