Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
После просмотра материалов этого форума удалось создать view с instead триггерами, который успешно обновляется не только из Query Analyzer, но и из Enterprise Manager (т.е. с опцией WITH VIEW_METADATA). А мои клиенты на этот instead чихать хотели. В 2000 в форме, построенной на этом view, добавление новой записи блокированно, а на попытку изменения получаю сообщение, что данный набор записей не допускает обновление. То же и в VB6 на Update - "Cannot insert or update columns from multiple tables". Все в норме только в mdb. Может, не стоит с adp и связываться - оставить старый добрый mdb, который знать не знает, на чем основана связанная таблица??? Или я что-то не учитываю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2001, 11:07 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
Все дело в ADO. Просто функциональность ADO сильно отстает от возможностей MSSQL. ADO+ в этом отношении гораздо гибче. Сужу только по статьям, сам с ADO+ еще не разбирался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2001, 01:59 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
Получается, что если использовать многотабличные VIEW, то от DAO никуда не уйти? Люди, подскажите, кто как эту проблему решил? Я вообще-то поняла, что DAO себя тихо изживает, и дальше его поддерживать может и не будут. Поэтому новых клиентов под него писать не очень хочется. А что тогда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2001, 07:00 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
Посмотри на форум по Access+SQL вопрос:Почему никто не хочет осваивать adp? Была та же проблема. Все решилось на свойствах формы: однозначная таблица, команда синхронизации и Input Parameters. Мучался 2 недели. Открыл одну плюшку и теперь у меня формы работают и на хр. проц., и на view, и на sql-выражениях. Если, конечно, Вас это заинтересовало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2001, 09:44 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
Так это косяк Accеssa. Если в источнике записей формы не присутствует ключевое поле то он ни при каких условиях не дает изменять в ней данные. А что касается VB - видимо не совсем корректно прописаны триггеры. Кидай скрипты таблиц и триггеров, посмотрим в чем дело. Тут ADO скорее всего не виноват. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2001, 09:50 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
2 ДиД Очень-очень заинтересовало. Чесно говоря, я толком не поняла смысла однозначных таблиц, команд синхронизации и Input Parameters (хотя и подозревала, что там-то собака и порылась). Про хелп в 2000 даже говорить ничего не буду, барышням таких слов знать не полагается. Если есть ссылки на информацию, или возможность подсказать, буду безмерно признательна. Структуру данных попытаюсь объяснить ниже. Да, у меня почему-то в качестве однозначной таблицы предлагается только сам VIEW???? 2 Павел По-моему, конструкция достаточно тривиальная. Целиком скрипты кидать не буду - много места займут. Попытаюсь на пальцах. Две таблицы связанные 1 к 1 по полю id_object(в обоих таблицах - PrimaryKey). Триггеры на них значения не имеют - они все AFTER: \nCREATE TABLE [dbo].[Object_common] ( [id_object] uniqueidentifier ROWGUIDCOL NOT NULL , [id_class] [tinyint] NOT NULL , [n_object] [nvarchar] (50) COLLATE Cyrillic_General_CI_AS NOT NULL ) ON [PRIMARY] \nCREATE TABLE [dbo].[Object_human] ( [id_object] [uniqueidentifier] NOT NULL , [l_name] [nvarchar] (50) COLLATE Cyrillic_General_CI_AS NULL , [f_name] [nvarchar] (50) COLLATE Cyrillic_General_CI_AS NULL , [p_name] [nvarchar] (50) COLLATE Cyrillic_General_CI_AS NULL , [birthday] [datetime] NULL , [course_number] [tinyint] NULL ) ON [PRIMARY] ALTER TABLE [dbo].[Object_human] ADD CONSTRAINT [FK_ObjectHuman_ObjectCommon] FOREIGN KEY ([id_object]) REFERENCES [dbo].[Object_common] ([id_object]) ON DELETE CASCADE ON UPDATE CASCADE и объединяющий их VIEW с INSTEAD триггерами \nCREATE VIEW dbo.V_Object_human WITH VIEW_METADATA AS SELECT dbo.Object_common.id_object, dbo.Object_common.n_object, dbo.Object_human.l_name, dbo.Object_human.f_name, dbo.Object_human.p_name, dbo.Object_human.birthday, dbo.Object_human.course_number FROM dbo.Object_common INNER JOIN dbo.Classes ON dbo.Object_common.id_class = dbo.Classes.id_class INNER JOIN dbo.Object_human ON dbo.Object_common.id_object = dbo.Object_human.id_object WHERE (dbo.Classes.n_class = N'Человек') CREATE TRIGGER tInsteadD ON dbo.V_Object_human INSTEAD OF DELETE AS Delete From Object_common Where id_object = (Select id_object From deleted) CREATE TRIGGER tInsteadI ON [dbo].[V_Object_human] INSTEAD OF INSERT AS /*Определить id_class как Человек*/ Declare @id_class tinyint Select @id_class = (Select id_class From Classes Where n_class = N'Человек') Begin Insert Into Object_common (id_object, n_object, id_class) Select id_object, n_object, @id_class From inserted Insert Into Object_human (id_object, l_name, f_name, p_name, birthday, course_number) Select id_object, l_name, f_name, p_name, birthday, course_number From inserted End CREATE TRIGGER tInsteadU ON [dbo].[V_Object_human] INSTEAD OF UPDATE AS /*Определить id_class как Человек*/ Declare @id_class tinyint Select @id_class = (Select id_class From Classes Where n_class = N'Человек') Begin Update Object_common Set Object_common.n_object = i.n_object, Object_common.id_class=@id_class From Object_common, inserted i Where Object_common.id_object = i.id_object Update Object_human Set Object_human.l_name = i.l_name, Object_human.f_name = i.f_name, Object_human.p_name = i.p_name, Object_human.birthday = i.birthday, Object_human.course_number = i.course_number From Object_human , inserted i Where Object_human.id_object = i.id_object End ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2001, 12:58 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
2 Павел Да, в форме ключевое поле присутствует. Я его пока грубо ручками прописываю на Insert. Там ведь и Update не работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2001, 13:07 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
Чтобы обновлялись записи в форме на основе хр. проц. нужно: Предположим имеется хр.проц., объединяющая записи нескольких таблиц по ключевым полям 1. В качестве источника записей формы выбираете таблицу на стороне "многие", т.е. ту, в которую будете вносить данные. 2, Идете в свойство формы "однозначная таблица" и выбираете из списка эту таблицу (в дальнейшем это свойство больше не трогаете) 3. Идете в источник записей формы и меняете на имя хр. проц. Если после этого попытаетесь посмотреть свойство "однозначная таблица", то оно будет пустым. Ничего в этом страшного нет. Все будет работать. 3, Формируете sql-выражение точно такое же как в хр.проц., только в условие where ставите имя ключевого поля обновляемой таблицы, например: ... where ID=? 4. Ну, и если есть параметры вписываете их в свойство формы Input parameters. 5, Запускаете все это. Самое интересное. Если попытаетесь сначала поставить в качестве источника формы хр.проц., а потом вручную внести название таблицы в свойство "однозначная таблица" она Вам не даст этого сделать. Может такой хитрый способ Вам поможет для работы. Я открыл случайно. И постоянно этим пользуюсь. Не знаю как к этому отнесутся знатоки, но все работает уже 3 месяца. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2001, 13:32 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
Добавка к п,3. sql-выражение вписыаете в свойство формы "команда синхронизации" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2001, 13:44 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
Не получается 1. Данные у меня вносятся сразу в две таблицы( они связаны 1 к 1), для чего на VIEW и прописаны INSTEAD триггеры 2. Если вместо VIEW я использую sp с тем же SELECTом, изменение возможно, но только в однозначной таблице, и никаких INSTEADов. А ежели в sp поставить Select * From MyVIEW, то все опять становится необновляемым. А INSTEAD на sp не пропишешь! Для чего вообще эта ResyncCommand? Насколько поняла из хелпа - он все равно работает только с однозначной таблицей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2001, 15:01 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
А ADO действительно вовсе не виноват (в VB была ошибочка), и из аксеса cn.Execute("Insert Into VIEW ...") проходит. А вот форма в упор не видит, что этот view таки обновляемый. А мне эти VIEW позарез нужны для разделения данных. Придется, видимо, для вставки и изменением извращаться с дополнительными формами и хп. Если кто знает способ лучше - дайте знать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2001, 14:02 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
Erika, я собрал Ваш пример, только добавил в представление ключевые поля из обеих таблиц. Все работает. Нужно только в форме правильно прописать свойство Resync Command. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2001, 03:48 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
Еще один совет на будушее: все триггера и процедуры начинай с Set Nocount On. Конечно не везде это требуется, но во избежании возможных проблем лишним не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2001, 03:55 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
Чувствую, что всех утомила, но никак не могу успокоиться. Ну бестолковая я. 2 Павел Добавила оба ключа, выставила Set Nocount On (правда, до триггеров дело, похоже, не доходит). Видимо, я так и не разобралась с Resync Command. Привожу свои измышления подробнее: 1)RecordSource формы - V_Object_human CREATE VIEW dbo.V_Object_human WITH VIEW_METADATA AS SELECT dbo.Object_common.id_object, dbo.Object_common.n_object, dbo.Object_human.id_object AS ID_HUMAN, dbo.Object_human.l_name, dbo.Object_human.f_name, dbo.Object_human.p_name, dbo.Object_human.birthday, dbo.Object_human.course_number FROM dbo.Object_common INNER JOIN dbo.Classes ON dbo.Object_common.id_class = dbo.Classes.id_class INNER JOIN dbo.Object_human ON dbo.Object_common.id_object = dbo.Object_human.id_object WHERE (dbo.Classes.n_class = N'Человек') 2)UniqueTable - Object_Human 3)ResyncCommand - проверяла разные варианты, результат - все равно что с неопределенным ResyncCommand SELECT Object_common.id_object, Object_common.n_object, Object_human.id_object AS ID_HUMAN, Object_human.l_name,Object_human.f_name, Object_human.p_name, Object_human.birthday, Object_human.course_number FROM dbo.Object_common INNER JOIN dbo.Object_human ON dbo.Object_common.id_object = dbo.Object_human.id_object WHERE dbo.Object_human.id_object=? Если в таком виде - идет сообщение в статусной строке, что данный набор записей не допускает обновления( на попытку редактирования), и вставка с удалением блокированны на форме. Если же из исходного запроса убрать таблицу Class (т.е. оставить 2 таблицы), то можно редактировать записи только для UniqueTable (Object_human), о чем и появляется соответствующее сообщение при попытке ввода в поле n_object. Где же перекосяк??? :-< ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2001, 09:09 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
Resync Command должно быть таким чтобы по первичному ключу из таблицы UniqueTable считывались значения всех остальных таблиц, входящих в обьединение. Естественно Resync Command всегда должно возвращать только одну строку. В Вашем случае SELECT dbo.Object_common.id_object, dbo.Object_common.n_object, dbo.Object_human.l_name, dbo.Object_human.f_name, dbo.Object_human.p_name, dbo.Object_human.birthday, dbo.Object_human.course_number FROM dbo.Object_common INNER JOIN dbo.Classes ON dbo.Object_common.id_class = dbo.Classes.id_class INNER JOIN dbo.Object_human ON dbo.Object_common.id_object = dbo.Object_human.id_object WHERE (dbo.Classes.n_class = N'Человек') Какой столбец в таблице Object_human является ключевым? Обязательно включите и его тоже в запрос. Resync Command должен быть таким же запросом но с ограничением в секции WHERE - Object_human.ключ = ? (вообще лучше взять за привычку всегда включать ключевые поля всех таблиц входящих в запрос иначе ADO не сможет производить обновления - поскольку не сможет найти - в какую именно строку каждой таблицы нужно внести исправления). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2001, 13:49 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
Так во втором варианте я так и сделала - там в V_Object_Human есть dbo.Object_human.id_object AS ID_HUMAN а не работает Причем поскольку связь 1 к 1, пробовала и с Object_common в качестве UniqueTable и с WHERE dbo.Object_common.id_object=? в ResyncCommand - по барабану ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2001, 15:00 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
Дошлите скрипт на таблицу Class. В прошлый раз собрал пример без нее (вы скрипты недоложили). Опишу точный диагноз. Вернее анамнез. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2001, 17:40 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
2 Павел Вам смешно, а мне уже плакать хочется. Больной скорее мертв, чем жив. Высылаю скрипт на Classes. Хотя и при отсутствии этой таблицы в запросе редактируются только поля, относящиеся к таблице, объявленной уникальной, что тоже не радует. \nCREATE TABLE [dbo].[Classes] ( [id_class] [tinyint] IDENTITY (1, 1) NOT NULL , [n_class] [nvarchar] (50) COLLATE Cyrillic_General_CI_AS NOT NULL , [id_parent] [tinyint] NULL , [note] [nvarchar] (255) COLLATE Cyrillic_General_CI_AS NULL , [obj_table_name] [char] (25) COLLATE Cyrillic_General_CI_AS NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[Classes] WITH NOCHECK ADD CONSTRAINT [PK_Classes] PRIMARY KEY CLUSTERED ([id_class]) ON [PRIMARY] GO ALTER TABLE [dbo].[Classes] ADD CONSTRAINT [FK_Classes_Classes] FOREIGN KEY ([id_parent]) REFERENCES [dbo].[Classes] ([id_class]) GO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2001, 09:19 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
Пока без таблицы Classes. С ней дополнительные сложности, попробуй разобраться сама - у меня времени нет, надо бежать. Обрати внимание на изменения в представлении и триггере (set вместо select) CREATE VIEW dbo.V_Object_human WITH VIEW_METADATA AS SELECT dbo.Object_common.id_object, dbo.Object_human.id_object AS Expr1, dbo.Object_common.n_object, dbo.Object_human.l_name, dbo.Object_human.f_name, dbo.Object_human.p_name, dbo.Object_human.birthday, dbo.Object_human.course_number FROM dbo.Object_common INNER JOIN dbo.Object_human ON dbo.Object_common.id_object = dbo.Object_human.id_object GO CREATE TRIGGER tInsteadI ON [dbo].[V_Object_human] INSTEAD OF INSERT AS Set Nocount On /*Определить id_class как Человек*/ Declare @id_class tinyint Set @id_class = (Select id_class From Classes Where n_class = N'Человек') Begin Insert Into Object_common (id_object, n_object, id_class) Select id_object, n_object, @id_class From inserted Insert Into Object_human (id_object, l_name, f_name, p_name, birthday, course_number) Select id_object, l_name, f_name, p_name, birthday, course_number From inserted End В форме: Unique Table - V_Object_human Resync Command - SELECT dbo.Object_common.id_object, dbo.Object_human.id_object AS Expr1, dbo.Object_common.n_object, dbo.Object_human.l_name, dbo.Object_human.f_name, dbo.Object_human.p_name, dbo.Object_human.birthday, dbo.Object_human.course_number FROM dbo.Object_common INNER JOIN dbo.Object_human ON dbo.Object_common.id_object = dbo.Object_human.id_object WHERE (dbo.Object_common.id_object = ?) Терерь самое смешное !!! Чтобы все это работало, нужно на форме иметь поля для обоих ключей из представления! Я балдею от Аксесса... Зделай их невидимыми или просто шириной 0. Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2001, 10:32 |
|
||
|
Еще раз о Instead, многотабличном view и клиентах
|
|||
|---|---|---|---|
|
#18+
Дааа !!!!! Заработало!!!! Для двух таблиц была просто ошибка - забыла прописать WITH VIEW_METADATA (память девичья). Обнаружила, когда не удалось задать Unique Table - V_Object_human2. А вот для трех все гораздо интереснее! Третья таблица ведь не обновляемая, а присутствует только для фильтра. И как только она появляется, неважно как - через JOIN или подзапросом в условии WHERE, Access перестает признавать за запросом право на обновление (если не добавить из этой таблицы ключ в запрос, но тогда при вставке Access желает знать его новое значение, а ведь записи туда не добавляются). Удалось обогнуть с помощью User Function, используя ее во view для фильтра: ... WHERE (dbo.Object_common.id_class = dbo.classID(N'Человек')) CREATE FUNCTION dbo.classID (@n_class char(25)) RETURNS tinyint AS BEGIN Declare @id_class tinyint Set @id_class = (SELECT id_class FROM dbo.Classes WHERE (n_class = @n_class)) Return (@id_class) END Спасибо огромнейшее Дид, Павел. У меня слов не хватает, чтобы выразить всю свою признательность. Без помощи я бы завязла окончательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2001, 14:51 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32011074&tid=1825982]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
28ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 275ms |
| total: | 407ms |

| 0 / 0 |
