Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Еще раз о Instead, многотабличном view и клиентах / 20 сообщений из 20, страница 1 из 1
30.07.2001, 11:07
    #32010662
Erika
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
После просмотра материалов этого форума удалось создать 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, который знать не знает, на чем основана связанная таблица??? Или я что-то не учитываю
...
Рейтинг: 0 / 0
31.07.2001, 01:59
    #32010684
Павел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
Все дело в ADO. Просто функциональность ADO сильно отстает от возможностей MSSQL. ADO+ в этом отношении гораздо гибче. Сужу только по статьям, сам с ADO+ еще не разбирался.
...
Рейтинг: 0 / 0
31.07.2001, 07:00
    #32010726
Erika
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
Получается, что если использовать многотабличные VIEW, то от DAO никуда не уйти? Люди, подскажите, кто как эту проблему решил? Я вообще-то поняла, что DAO себя тихо изживает, и дальше его поддерживать может и не будут. Поэтому новых клиентов под него писать не очень хочется. А что тогда?
...
Рейтинг: 0 / 0
31.07.2001, 09:44
    #32010749
ДиД.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
Посмотри на форум по Access+SQL вопрос:Почему никто не хочет осваивать adp? Была та же проблема. Все решилось на свойствах формы: однозначная таблица, команда синхронизации и Input Parameters. Мучался 2 недели. Открыл одну плюшку и теперь у меня формы работают и на хр. проц., и на view, и на sql-выражениях. Если, конечно, Вас это заинтересовало.
...
Рейтинг: 0 / 0
31.07.2001, 09:50
    #32010750
Павел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
Так это косяк Accеssa. Если в источнике записей формы не присутствует ключевое поле то он ни при каких условиях не дает изменять в ней данные. А что касается VB - видимо не совсем корректно прописаны триггеры. Кидай скрипты таблиц и триггеров, посмотрим в чем дело. Тут ADO скорее всего не виноват.
...
Рейтинг: 0 / 0
31.07.2001, 12:58
    #32010769
Erika
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
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
...
Рейтинг: 0 / 0
31.07.2001, 13:07
    #32010772
Erika
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
2 Павел
Да, в форме ключевое поле присутствует. Я его пока грубо ручками прописываю на Insert. Там ведь и Update не работает.
...
Рейтинг: 0 / 0
31.07.2001, 13:32
    #32010775
ДиД.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
Чтобы обновлялись записи в форме на основе хр. проц. нужно:
Предположим имеется хр.проц., объединяющая записи нескольких таблиц по ключевым полям
1. В качестве источника записей формы выбираете таблицу на стороне "многие", т.е. ту, в которую будете вносить данные.
2, Идете в свойство формы "однозначная таблица" и выбираете из списка эту таблицу (в дальнейшем это свойство больше не трогаете)
3. Идете в источник записей формы и меняете на имя хр. проц. Если после этого попытаетесь посмотреть свойство "однозначная таблица", то оно будет пустым. Ничего в этом страшного нет. Все будет работать.
3, Формируете sql-выражение точно такое же как в хр.проц., только в условие where ставите имя ключевого поля обновляемой таблицы, например: ... where ID=?
4. Ну, и если есть параметры вписываете их в свойство формы Input parameters.
5, Запускаете все это.
Самое интересное. Если попытаетесь сначала поставить в качестве источника формы хр.проц., а потом вручную внести название таблицы в свойство "однозначная таблица" она Вам не даст этого сделать.
Может такой хитрый способ Вам поможет для работы. Я открыл случайно. И постоянно этим пользуюсь. Не знаю как к этому отнесутся знатоки, но все работает уже 3 месяца.
...
Рейтинг: 0 / 0
31.07.2001, 13:44
    #32010779
ДиД.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
Добавка к п,3. sql-выражение вписыаете в свойство формы "команда синхронизации"
...
Рейтинг: 0 / 0
31.07.2001, 15:01
    #32010790
Erika
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
Не получается
1. Данные у меня вносятся сразу в две таблицы( они связаны 1 к 1), для чего на VIEW и прописаны INSTEAD триггеры
2. Если вместо VIEW я использую sp с тем же SELECTом, изменение возможно, но только в однозначной таблице, и никаких INSTEADов. А ежели в sp поставить Select * From MyVIEW, то все опять становится необновляемым. А INSTEAD на sp не пропишешь!
Для чего вообще эта ResyncCommand? Насколько поняла из хелпа - он все равно работает только с однозначной таблицей.
...
Рейтинг: 0 / 0
01.08.2001, 14:02
    #32010900
Erika
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
А ADO действительно вовсе не виноват (в VB была ошибочка), и из аксеса cn.Execute("Insert Into VIEW ...") проходит. А вот форма в упор не видит, что этот view таки обновляемый. А мне эти VIEW позарез нужны для разделения данных.
Придется, видимо, для вставки и изменением извращаться с дополнительными формами и хп. Если кто знает способ лучше - дайте знать.
...
Рейтинг: 0 / 0
02.08.2001, 03:48
    #32010924
Павел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
Erika, я собрал Ваш пример, только добавил в представление ключевые поля из обеих таблиц. Все работает. Нужно только в форме правильно прописать свойство Resync Command.
...
Рейтинг: 0 / 0
02.08.2001, 03:55
    #32010925
Павел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
Еще один совет на будушее: все триггера и процедуры начинай с Set Nocount On. Конечно не везде это требуется, но во избежании возможных проблем лишним не будет.
...
Рейтинг: 0 / 0
02.08.2001, 09:09
    #32010966
Erika
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
Чувствую, что всех утомила, но никак не могу успокоиться. Ну бестолковая я.
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.
Где же перекосяк??? :-<
...
Рейтинг: 0 / 0
02.08.2001, 13:49
    #32010984
JINX
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
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 не сможет производить обновления - поскольку не сможет найти - в какую именно строку каждой таблицы нужно внести исправления).
...
Рейтинг: 0 / 0
02.08.2001, 15:00
    #32010989
Erika
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
Так во втором варианте я так и сделала - там в V_Object_Human есть

dbo.Object_human.id_object AS ID_HUMAN

а не работает


Причем поскольку связь 1 к 1, пробовала и с Object_common в качестве UniqueTable и с
WHERE dbo.Object_common.id_object=? в ResyncCommand
- по барабану
...
Рейтинг: 0 / 0
02.08.2001, 17:40
    #32010998
Павел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
Дошлите скрипт на таблицу Class. В прошлый раз собрал пример без нее (вы скрипты недоложили). Опишу точный диагноз. Вернее анамнез.
...
Рейтинг: 0 / 0
03.08.2001, 09:19
    #32011036
Erika
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
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
...
Рейтинг: 0 / 0
03.08.2001, 10:32
    #32011043
Павел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
Пока без таблицы 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.

Удачи!
...
Рейтинг: 0 / 0
03.08.2001, 14:51
    #32011074
Erika
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще раз о Instead, многотабличном view и клиентах
Дааа !!!!! Заработало!!!!
Для двух таблиц была просто ошибка - забыла прописать 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

Спасибо огромнейшее Дид, Павел. У меня слов не хватает, чтобы выразить всю свою признательность. Без помощи я бы завязла окончательно.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Еще раз о Instead, многотабличном view и клиентах / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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