powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
17 сообщений из 67, страница 3 из 3
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32812294
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
За картинку спасибо, подготовил уже было пост
А ну вот, вроде понял, как поместить на задний план контрол:
оказывается , если на форме уже есть контрол,
то вновь создаваемый нельзя засунуть под него
нужно, таким образом , всегда вначале создать контролы заднего плана, а затем уже те, что будут их заслонять , наоборот не получается.
(т.е. если дословно следовать шагам , приводлимым Latuk, то не получится, нужно наоборот, хотя у него Access2002, может там есть какой-то формат, который позволяет поместить на задний план...)
Может я не прав, но пока это решение.
Меня это ,конечно, сильно сбило , поэтому этот способ и получался.
Но теперь с этим все OK.

команда синхронизации нужна только для отображения результата редактирования на форме.
Я понимаю, так вот пока не могу усечь , как добиться этого отображения для всех затронутых редактированием записей.
мыла пока нет.
...
Рейтинг: 0 / 0
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32812440
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Create  VIEW dbo.QView1
AS
SELECT     dbo.Контакты.*, dbo.Клиенты.КрНаим AS КрНаим, dbo.КонтЛица.ФИО AS ФИО, dbo.КонтЛица.Тел AS Тел, dbo.Должности.Наим AS Должность, 
                      dbo.Должности.Id AS IdДолжность, dbo.КонтЛица.IdDolgnost AS IdDolgnostКонтЛица, dbo.Клиенты.Id AS IdКлиенты, 
                      dbo.КонтЛица.IdKlienta AS IdKlientaКонтЛица
FROM         dbo.Должности RIGHT OUTER JOIN
                      dbo.КонтЛица ON dbo.Должности.Id = dbo.КонтЛица.IdDolgnost RIGHT OUTER JOIN
                      dbo.Клиенты INNER JOIN
                      dbo.Контакты ON dbo.Клиенты.Id = dbo.Контакты.IdKlienta ON dbo.КонтЛица.Id = dbo.Контакты.IdKontLica
GO

Create  PROCEDURE dbo.Q1Resync
(@P1 datetime,
@P2 int)
AS SELECT     dbo.Контакты.*, dbo.Клиенты.КрНаим AS КрНаим, dbo.КонтЛица.ФИО AS ФИО, dbo.КонтЛица.Тел AS Тел, dbo.Должности.Наим AS Должность, 
                      dbo.Должности.Id AS IdДолжность, dbo.КонтЛица.IdDolgnost AS IdDolgnostКонтЛица, dbo.Клиенты.Id AS IdКлиенты, 
                      dbo.КонтЛица.IdKlienta AS IdKlientaКонтЛица
FROM         dbo.Должности RIGHT OUTER JOIN
                      dbo.КонтЛица ON dbo.Должности.Id = dbo.КонтЛица.IdDolgnost RIGHT OUTER JOIN
                      dbo.Клиенты INNER JOIN
                      dbo.Контакты ON dbo.Клиенты.Id = dbo.Контакты.IdKlienta ON dbo.КонтЛица.Id = dbo.Контакты.IdKontLica
WHERE     (dbo.Контакты.Дата = @P1) AND (dbo.Контакты.IdKlienta = @P2)



Форму Контакты_Q3 исправил
Контакты1 -стандартный подход со строкой синхронизации с параметрами
Контакты2 - динамически формируемая команда синхронизации без параметров
см событие текущая запись WHERE Может быть любым каким захочеш
главное чтобы запрос вернул строку с тем же перечнем полей
и FROM бал такой же как у источника формы

Выполни скрипт и создаш в своей базе ХП и вьюху
Привяжи ADP к своей базе

PS все я пошел пить пиво
...
Рейтинг: 0 / 0
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32812728
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2yuniki
ты бы скинул и мне бэкар базы и адп

всё не нада только по теме

чё-то заинтриговали
мыло в профиле.
...
Рейтинг: 0 / 0
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32812772
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Latuk>
Спасибо, пример твой рассмотрел,
НО , как , оказалось, он не дает решения о котором идет речь,
приведены просто известные стандартные варианты редактирования полей одной уникальной таблицы ,
и о чем тогда копья ломать было ?

Другими словами у меня был такой пост :
потому что редактируется только одна таблица
остальные же используются как справочники

Вот из этого могу сделать вывод , что насчет команды синхронизации ничего сделать невозможно , так как у меня редактируются поля трех таблиц ( уже в n-й раз повторяю) в одной записи на форме.(Так было в MDB)
Хотя , наверное , насчет этого надо отдельный топик сдлеать.

ты на это ответил

Вывод неправильный (см пример)
редактировать можно все поля кроме тех которые со стороны LEFT & RIGHT
Для которых отсутствует запись в соотв таблице
но иэто можно обойти включив в запрос ключевые поля этих таблиц
и проверяя их на NULL при попытке редактирования добавлять соотв запись в соотв таблицу


И попробуй в своем примере отредактиовать поле КонтЛица.ФИО - получишь сообщение
"Допускается измененение только полей из уникальной таблицы", а уникальную-то ты задал "Контакты".
Поле КонтЛица.ФИО не подпадает под твои условия LEFT & RIGHT (см выше)

Короче вопрос с командой синхронизации остается - а именно можно ли ее использовать
для случая обновления записей после редактирования нескольких полей из разных баз
Видимо, свойство уникальная таблица уже не понадобиться , т.к. придется делать
триггеры INSTED OF и вью с VIEW_METADATA . А иначе никак не получается.
...
Рейтинг: 0 / 0
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32813012
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>И попробуй в своем примере отредактиовать поле КонтЛица.ФИО - получишь сообщение

У меня поле КонтЛица.ФИО легко редактируется
и в Acc2002 и в Acc2003
возможно это спецефическая реакция 2000-го
Из каких соображений выбран для разработки Acc2000 ?
Там ADP-к откровенно сырой.
но это легко обойти например как в примере от вадя сливать изменения
самому используя для накопления данных свободный контрол
и запуская динамически свормированную команду синхронизации для
отображения изменений на форме
или с подкладыванием свободного контрола у тебя тоже так и не получилось?
Даже если совершенно необходимо сделать именно для Acc2000
то это тоже легко достаточно запустить профайлер и перенести реакцию
Acc2002 на редактирование полей типа КонтЛица.ФИО на события после редактирования
свободных контролов подложенных под поля соотв поля
хотя я бы подумал всетаки о переходе для разработки ADP на Acc2002-2003 где все работает и так.


в Acc2002 и в Acc2003 однозначная таблица используется только для того чтобы форма поняла значения ключевых полей из какой таблицы подставлять
в качестве параметров в команду синхронизации.

>Видимо, свойство уникальная таблица уже не понадобиться , т.к. придется делать
>триггеры INSTED OF и вью с VIEW_METADATA . А иначе никак не получается.
Для начала научись пользоватся простыми вещами.
То как ты заполнил свойство команда синхронизации
в своей форме (см. форму Контакты из примера) обнажает полное непонимание в этом вопросе.
...
Рейтинг: 0 / 0
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32813168
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Latuk>
1)
У меня поле КонтЛица.ФИО легко редактируется
и в Acc2002 и в Acc2003


A что в A2002 свободно редактируются, добавляются,удаляются ВСЕ поля в предложенной мной форме Контакты ?

2)
Даже если совершенно необходимо сделать именно для Acc2000
то это тоже легко достаточно запустить профайлер и перенести реакцию

Здесь не понял , как и для чего ты предлагаешь профайлер

3)
То как ты заполнил свойство команда синхронизации
Это была просто попытка - посмотреть, что будет.
В своем понимании я руководствуюсь Help A2000, в котором сказано , что МОЖНО РКДАКТИРОВАТЬ ТОЛЬКО ПОЛЯ ОДНОЗНАЧНОЙ ТАБЛИЦЫ. А что, Help A 2002 в этом месте другой что ли - я не думаю...


4) я бы подумал всетаки о переходе для разработки ADP на Acc2002-2003 где все работает и так

Да , хорошо бы и так, но это надо переносить все наработки Office'ных приложений из 2000 в 2002, которых у меня немало, и я знаю, например, что Excel'ские у меня не переносились в XP например, как в 2002 будут - не знаю.
...
Рейтинг: 0 / 0
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32813184
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2yuniki

смотри почту
...
Рейтинг: 0 / 0
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32813225
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так там оба файла есть и бекап C4 и ADP
...
Рейтинг: 0 / 0
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32813400
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>A что в A2002 свободно редактируются, добавляются,удаляются ВСЕ поля в предложенной мной форме Контакты ?

редактируются свободно , но в сделанных мной формах Контакты1 и Контакты2
c правильной командой синхронизации

удаляются строки из однозначной таблицы свободно
в принципе если стандартная реакция не подходит
довольно легко сделать реакцию на удаление такой как хочется

добавлятся мешают индексы по полям не присутствующим на форме
думаю это не большое препятствие

>Здесь не понял , как и для чего ты предлагаешь профайлер
Запускаеш профайлер
запускаеш Acc2002
Юзаеш форму и смотриш какие команды выполняются на сервере
при редактировании тех или иных полей
прописываеш их для Acc2000 вручную
например при редактировании поля ФИО в моей форме Контакты1
происходит следущее
Код: plaintext
1.
2.
3.
4.
5.
6.
exec sp_executesql N'UPDATE "C4"."dbo"."КонтЛица" 
SET "ФИО"=@P1 
WHERE "IdDolgnost"=@P2 AND "IdKlienta"=@P3 
AND "upsize_ts"=@P4', N'@P1 nvarchar(17),@P2 int,@P3 int,@P4 varbinary(8)', N'ГлБухов111fff3344',  2 ,  8 , 0x0000000000001C27

exec sp_executesql N'exec Q1Resync @P1,@P2', N'@P1 datetime,@P2 int', 'апр 11 2004 12:00:00:000AM',  8 


>Это была просто попытка - посмотреть, что будет.
Не знаю чем ты руководствовался но когда в твоей форме Контакты я вижу что
RecordSource=ResyncCommand=UniqueTable="Q1View"
я делаю соотв. выводы

>Help A 2002 в этом месте другой что ли - я не думаю
На заборе тоже написано,а попробывать слабо?


>но это надо переносить все наработки Office'ных приложений из 2000 в 2002
Во первых не такая уж и большая переделка (в отличии скажем от 97->2000)
Во вторых что мешает юзать оба аксеса одновременно?
...
Рейтинг: 0 / 0
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32813490
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Latuk>
1)
Насчет

>И попробуй в своем примере отредактиовать поле КонтЛица.ФИО - получишь сообщение

У меня поле КонтЛица.ФИО легко редактируется
и в Acc2002 и в Acc2003
возможно это спецефическая реакция 2000-го


Это не просто "спецефическая реакция 2000-го" , это ,как написано в его Help, принципальный момент, т.е. в A2000 запрещается редактировать любые поля , кроме полей уникальной таблицы.
А A2002, кроме всего прочего, у меня нет, так , что в его Help на этот счет сказано, не могу посмотреть, и ты, вообще говоря,тоже об этом молчишь. Хотя то, что у тебя редактируется в A2002 поле ФИО конечно смущает.
Кстати, насчет перехода на A2002 (уж тогда логичнее сразу весь Office 2002), это не так просто - нужно весь завод будет переводить, а там есть и слабые компы, которые могут не потянуть, да и сам объем работы не маленький, не говоря уж о том, что нужно будет убедить народ.


2)
перенести реакцию
Acc2002 на редактирование полей типа КонтЛица.ФИО на события после редактирования
свободных контролов подложенных под поля соотв поля


Тут тоже обнаружил проблемы - если делать me.Recordset.update ПОСЛЕ редактирования
свободных контролов, то получится, что источник 2 раза апдейтится, второй раз будет при выходе из текущей обновленной записи - форма сама еще раз проапдейтит его, а это нехорошо как-то.
Вообще - то на этот счет мне непонятно :
Как вообще в ленточной форме явно апдейтить запись, т.е. на какие события формы надо делать me.Recordset.update , можно ли менять свойства Me.Recordset.LockType ,Me.Recordset.CursorType ,me.RecordsetType , как организовать явную транзакцию в форме.
Т.е. когда форма сама оптимистическим способом занимается обновлением источника, то этих вопросов нет, а когда явно это нужн осделать самому, то тут - проблемы.

3)
И вот еще что - ResyncCommand должна задаваться в синтаксисе T_SQL ?
Ну, например, WHERE с константой datetime как " WHERE Дата = '" & Format(Me.Дата, "mm.dd.yyyy") & "'"


PS.
Пока бьюсь в 2000-м - сделал вариант с триггером INSTEAD OF UPDATE, View ... WITH VIEW_METADATA ,
поля на форме стали редактироваться, правда при этом пришлось их обрабатывать как свободные контролы.
Все в форме редактируется, запись в базе обновляется, но при этом выходит, зараза, сообщение, что
"Данные, добавленные в базу данных, не будут отображены в форме, так как они противоречат условиям на базовый источник записей."
Делаю me.Requery в Form_AfterUpdate - не помогает .Точнее говоря, туда и не приходит управление.
Результат правки (корректный надо сказать) виже после перезагрузки формы,
UniqueTable можно при WITH VIEW_METADATA поставить только Q1View , а ResyncCommand вообще не ставлю, так как в Help сказано, что она отвечает только за правильиное отображение записи после редактирования, а я этог же могу добиться с помощью me.Requery для формы, вот только приведеное выше зараза не дает это сделать (но не при любых правках,и когда дает , то все OK).
Вот таки дела.
...
Рейтинг: 0 / 0
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32813678
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>но при этом выходит, зараза, сообщение
Патамушта
>ResyncCommand вообще не ставлю
и это совсем не то же самое что me.Requery
>там есть и слабые компы, которые могут не потянуть,
Не баись у мине 2002-й работал на P1-200 под Win98 даже быстрее чем 2000-й
>да и сам объем работы не маленький
если хотябы Win2K то все можно сделать не отрываясь от стула
плагин скриптами
на крайний случай есть рунтайм версия которая пакуется в инсталятор
делов останется - запустить у юзера под админскими правами
Чаво админа нет? Все сам делаеш?
>ResyncCommand должна задаваться в синтаксисе T_SQL
это запрос не важно как оформлен (ХП или строка)
должен иметь FROM такой же как у источника,
и возвращать одну строку с таким же кол-вом и типом полей как у источника формы.
Если использовать параметры "?" то форма подставит туда значение ключевых полей однозначной таблицы
почитай у Гетца хорошо описанно.
>" WHERE Дата = '" & Format(Me.Дата, "mm.dd.yyyy") & "
почитай FAQ

PS Голова болит а руки делают
...
Рейтинг: 0 / 0
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32813689
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>ResyncCommand должна задаваться в синтаксисе T_SQL ?
конкретно для твоего случая
SELECT * FROM Q1View WHERE [Дата]=? AND [IdKlienta]=?
или для динамической сборки без параметров поскольку у табе id счетчик
для однозначной идентификации строки будет вполне достаточно
Me.ResyncCommand="SELECT * FROM Q1View WHERE " & Me!id
...
Рейтинг: 0 / 0
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32813693
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поправочка
Me.ResyncCommand="SELECT * FROM Q1View WHERE id=" & Me!id
...
Рейтинг: 0 / 0
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32814223
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот это уже интересно !

Возникает такой интересный вопрос по этому поводу :

Если Resync делается c помощью Select * from Q1View ..., а Q1View состоит из нескольких таблиц, то какие поля и в каком порядке будут образовывать там "первичный ключ" , ведь именно это определяет то, как задавать параметры в ResyncCommand
?????????????
...
Рейтинг: 0 / 0
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32814259
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверно еще нужно добавить, что у меня однозначная таблица Q1View,
по другому при при WITH VIEW_METADATA нельзя, и
если как ты пишешь Если использовать параметры "?" то форма подставит туда значение ключевых полей однозначной таблицы
почитай у Гетца хорошо описанно.


то и возникает вопрос какие поля и в каком порядке будут ключевыми в этом случае ?
Это, как японимаю, для задания параметров посредством "?" важно .

PS. Если бы у меня еще и Гетц был !
...
Рейтинг: 0 / 0
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32814370
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если форма не может определить ключевые поля
для однозначной идентификации строки она делает фильтр по всем полям
Код: plaintext
1.
exec sp_executesql N'UPDATE "C4".."Q1View" SET "КрНаим"=@P1,"ФИО"=@P2 WHERE "Дата"=@P3 AND "IdKlienta"=@P4 AND "upsize_ts"=@P5 AND "IdДолжность" IS NULL AND "IdDolgnostКонтЛица" IS NULL AND "IdКлиенты"=@P6 AND "IdKlientaКонтЛица" IS NULL', N'@P1 nvarchar(3),@P2 nvarchar(1),@P3 datetime,@P4 int,@P5 varbinary(8),@P6 int', N'288', N'8', 'Apr 11 2001 12:00:00:000AM',  10 , 0x00000000000004F8,  10 
в твоем случае гораздо проще не парится с таким кол-вом параметров
а заполнять команду синхронизации динамически
Private Sub Form_Current()
Me.ResyncCommand = "SELECT * FROM Q1View WHERE id=" & Me!Id
End Sub
...
Рейтинг: 0 / 0
в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
    #32814650
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для однозначной идентификации строки она делает фильтр по всем полям

Да я тоже это увидел в профайлере, но это для Update , а если посмотреть , что будет при me.recordset.Resync adAffectCurrent , то оказывается , что даже при при такой провокационной команде, как
Код: plaintext
1.
2.
3.
Me.ResyncCommand = _
 " select * from Q1View " & _
 " where Дата = ? and IdKlienta=? and IdДолжность=?" & _
 "   and IdКонтЛица=? and ФИО=? " 
Можно увидеть :
Код: plaintext
1.
2.
3.
4.
exec sp_executesql 
N' select * from Q1View  
where Дата = @P1 and IdKlienta=@P2 and IdДолжность=@P3 and IdКонтЛица=@P4 and ФИО=@P5 '
, N'@P1 int,@P2 int,@P3 datetime,@P4 int,@P5 nvarchar(1)', 
 1 ,  37 , 'Dec   6   2004    1 : 49 : 14 :000PM',  10 , N' 1 '
Что будет соответствовать , если знать значения полей следующему порядку и составу ключевых полей :
IdДолжность,IdКонтЛица,Дата,IdKlienta,КрНаим

т.е. НЕ ВСЕ при синхронизации она использует, а только необходимые,
Это кстати, вроде как способ, в этой ситуации разобраться как задавать ResynCommand c "?"


А насчет " твоем случае гораздо проще не парится с таким кол-вом параметров
а заполнять команду синхронизации динамически"
- это я тоже понял, что красивее это и использую. Просто по поводу неявной параметризации было интересно - ее ведь не надо формировать динамически, что есть преимущество , форма сама сформирует.
...
Рейтинг: 0 / 0
17 сообщений из 67, страница 3 из 3
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / в ленточной форме с необновляемым набором перехватить реакцию на попытку обновления записи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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