powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ResyncCommand не работает если ее FROM отличается от FROM источника формы
21 сообщений из 21, страница 1 из 1
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32789161
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всегда думал что команда синхронизации
должна лиш возвращать набор полей по ключу

но сегодня пропарился с вот такой ситуацией

Есть ХП источник ленточной формы

------------------------------------------------------------------------------
ALTER PROCEDURE dbo.InC_Jurnal_p
(
@Status_ID tinyint,
@UserID int,
@AddDate smalldatetime
)

AS

SET @Status_ID=ISNULL(@Status_ID,200)
SET @UserID=ISNULL(@UserID,-1)
SET @AddDate=ISNULL(@AddDate,0) --(SELECT TOP 1 AddDate FROM InContacts ORDER BY AddDate DESC))

SELECT dbo.InContacts.ID, dbo.Status_tbl.Name AS Status_Name, dbo.InContacts.Status_ID, dbo.InContacts.ContactName, dbo.InContacts.Company,
dbo.InContacts.Street, dbo.InContacts.City, dbo.InContacts.ZIP, dbo.InContacts.Country, dbo.InContacts.Phone, dbo.InContacts.Fax,
dbo.InContacts.EMail, dbo.InContacts.WebSite, dbo.InContacts.CAuth, dbo.InContacts.AddDate, dbo.InContacts.ChangeDate, dbo.InContacts.UserID,
dbo.InContacts.ChangeUser, dbo.InContacts.RecallingTime, dbo.sUser.login
FROM dbo.InContacts INNER JOIN
dbo.SU_Current_v ON dbo.InContacts.UserID = dbo.SU_Current_v.userID OR dbo.SU_Current_v.IsSupervisor = 1 INNER JOIN
dbo.Status_tbl ON dbo.InContacts.Status_ID = dbo.Status_tbl.ID INNER JOIN
dbo.sUser ON dbo.InContacts.UserID = dbo.sUser.userID
WHERE ( (dbo.Status_tbl.FlRecalling = 1 AND @Status_ID=200) OR (dbo.Status_tbl.FlRecalling = 0 AND @Status_ID=201) OR (dbo.InContacts.Status_ID=@Status_ID) OR @Status_ID=202)
AND (@UserID=-1 OR dbo.InContacts.UserID=@UserID) AND (@AddDate=CAST(0 as smalldatetime) OR dbo.InContacts.AddDate=@AddDate)
ORDER BY dbo.InContacts.ID

------------------------------------------------------------------------------

dbo.SU_Current_v используется только для ограничения кол-ва строк
и не является источником для выводимых полей
посчитав что для синхронизации я могу обойтись без доп условий
сделал вот такую ХП

------------------------------------------------------------------------------
ALTER PROCEDURE dbo.InC_Jurnal_Resync_p1
(@ID int)
SELECT dbo.InContacts.ID, dbo.Status_tbl.Name AS Status_Name, dbo.InContacts.Status_ID, dbo.InContacts.ContactName, dbo.InContacts.Company,
dbo.InContacts.Street, dbo.InContacts.City, dbo.InContacts.ZIP, dbo.InContacts.Country, dbo.InContacts.Phone, dbo.InContacts.Fax,
dbo.InContacts.EMail, dbo.InContacts.WebSite, dbo.InContacts.CAuth, dbo.InContacts.AddDate, dbo.InContacts.ChangeDate, dbo.InContacts.UserID,
dbo.InContacts.ChangeUser, dbo.InContacts.RecallingTime, dbo.sUser.login
FROM dbo.InContacts INNER JOIN
dbo.Status_tbl ON dbo.InContacts.Status_ID = dbo.Status_tbl.ID INNER JOIN
dbo.sUser ON dbo.InContacts.UserID = dbo.sUser.userID
WHERE (dbo.InContacts.ID = @ID)

------------------------------------------------------------------------------

Но так не работает,а работает только вот так:

------------------------------------------------------------------------------

ALTER PROCEDURE dbo.InC_Jurnal_Resync_p2
(@ID int)
AS SELECT dbo.InContacts.ID, dbo.Status_tbl.Name AS Status_Name, dbo.InContacts.Status_ID, dbo.InContacts.ContactName, dbo.InContacts.Company,
dbo.InContacts.Street, dbo.InContacts.City, dbo.InContacts.ZIP, dbo.InContacts.Country, dbo.InContacts.Phone, dbo.InContacts.Fax,
dbo.InContacts.EMail, dbo.InContacts.WebSite, dbo.InContacts.CAuth, dbo.InContacts.AddDate, dbo.InContacts.ChangeDate, dbo.InContacts.UserID,
dbo.InContacts.ChangeUser, dbo.InContacts.RecallingTime, dbo.sUser.login
FROM dbo.InContacts INNER JOIN
dbo.SU_Current_v ON dbo.InContacts.UserID = dbo.SU_Current_v.userID OR dbo.SU_Current_v.IsSupervisor = 1 INNER JOIN
dbo.Status_tbl ON dbo.InContacts.Status_ID = dbo.Status_tbl.ID INNER JOIN
dbo.sUser ON dbo.InContacts.UserID = dbo.sUser.userID
WHERE (dbo.InContacts.ID = @ID)

------------------------------------------------------------------------------

Т.е. требует чтобы FROM ХП источника формы был такимже как у ХП синхронизации
хотя dbo.InC_Jurnal_Resync_p2 возвращает
абсолютно такойже результат как и dbo.InC_Jurnal_Resync_p1
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32789561
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
во-первых: что значит не работает?


Код: plaintext
1.
2.
ALTER PROCEDURE dbo.InC_Jurnal_Resync_p2
(@ID int)
AS SELECT dbo.InContacts.ID, dbo.Status_tbl.Name 


Код: plaintext
1.
2.
ALTER PROCEDURE dbo.InC_Jurnal_Resync_p1
(@ID int)
SELECT dbo.InContacts.ID, dbo.Status_tbl.Name 


найди отличие
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32789628
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"AS" потерял при копировании на форум :)
Разница между ХП только в наличии/отсутствии dbo.SU_Current_v в FROM

не работает значит-
1)строка формы не обновляется после редактирования однозначной таблицы
2)Me.Recordset.Resync adAffectCurrent вызывает ошибку
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32789739
ищ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Latuk
ты такие коды выкладываешь,
что нахрен кому разбираться
хочется.
а перед вадей преклоняюсь, что
он нашел отличие: это ж
скока надо было времени потрятить,
штоб найтить разницу.
снимаю шляпу перед вадей.
нет.
снимаю всё.
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32789840
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
слушай !!!
а из конструктора картинки показать можешь ?
там где таблы стрелками соединены.

у меня (ежели не ошибаюсь ) ресинк вообще только по полям возвращаемым похожа была на источник и работало.
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32790525
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ok Исправляюсь вот упрощенная илюстрация
Есть источник формы
Код: plaintext
1.
2.
3.
4.
5.
ALTER PROCEDURE dbo.FormSourse
AS SELECT     dbo.InContacts.ID, dbo.InContacts.Status_ID, dbo.Status_tbl.Name AS Status_Name, dbo.InContacts.UserID
FROM         dbo.InContacts INNER JOIN
                      dbo.Status_tbl ON dbo.InContacts.Status_ID = dbo.Status_tbl.ID INNER JOIN
                      dbo.CutingView ON dbo.InContacts.UserID = dbo.CutingView.UserID
dbo.InContacts- таблица данных
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE [dbo].[InContacts] (
	[ID] [int] IDENTITY ( 1 ,  1 ) NOT NULL ,
	[Status_ID] [tinyint] NULL ,
	[UserID] [int] NULL 
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[InContacts] ADD 
	CONSTRAINT [PK_InContacts] PRIMARY KEY  CLUSTERED 
	(
		[ID]
	)  ON [PRIMARY] 
GO
dbo.Status_tbl - таблица справочник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE [dbo].[Status_tbl] (
	[ID] [tinyint] NOT NULL ,
	[Name] [varchar] ( 100 ) COLLATE Cyrillic_General_CI_AS NOT NULL 
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Status_tbl] ADD 
	 PRIMARY KEY  CLUSTERED 
	(
		[ID]
	)  ON [PRIMARY] 
GO
dbo.CutingView - вьюха для фильтрации строк
используется только для ограничения кол-ва строк
и не является источником для выводимых полей
конкретная реализация не выжна,она должна быть на основе таблицы
Код: plaintext
1.
2.
3.
4.
5.
CREATE VIEW dbo.CutingView
AS
SELECT     UserID
FROM         dbo.ConnectInfo
GO
иначе если написать просто
Код: plaintext
1.
SELECT  0  AS UserID
то набор становится не редактируемым (почему тоже не очень понятно)

посчитав что для синхронизации я могу обойтись без доп условий
сделал вот такую ХП
Код: plaintext
1.
2.
3.
4.
5.
6.
ALTER PROCEDURE dbo.sp_ResyncCommand_1
(@ID int)
AS SELECT     dbo.InContacts.ID, dbo.InContacts.Status_ID, dbo.Status_tbl.Name, dbo.InContacts.UserID
FROM         dbo.InContacts INNER JOIN
                      dbo.Status_tbl ON dbo.InContacts.Status_ID = dbo.Status_tbl.ID
WHERE     (dbo.InContacts.ID = @ID)
Делаю мастером ленточную автоформу
проставляю ей однозначную таблицу dbo.InContacts
и команду синхронизации dbo.sp_ResyncCommand_1 ?

Но так не работает,а работает только вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ALTER PROCEDURE dbo.sp_ResyncCommand_2
(@ID int)
AS SELECT     dbo.InContacts.ID, dbo.InContacts.Status_ID, dbo.Status_tbl.Name, dbo.InContacts.UserID
FROM         dbo.InContacts INNER JOIN
                      dbo.Status_tbl ON dbo.InContacts.Status_ID = dbo.Status_tbl.ID INNER JOIN
                      dbo.CutingView ON dbo.InContacts.UserID = dbo.CutingView.UserID
WHERE     (dbo.InContacts.ID = @ID)
команда синхронизации dbo.sp_ResyncCommand_2 ?

Т.е. требует чтобы FROM ХП источника формы был такимже как у ХП синхронизации
хотя dbo.sp_ResyncCommand_2 возвращает
абсолютно такойже результат как и dbo.sp_ResyncCommand_1
не работает значит:
1)строка формы не обновляется после редактирования однозначной таблицы
2)Me.Recordset.Resync adAffectCurrent вызывает ошибку

2модератор
невнятный пример в начале топика можно удалить
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32790640
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример в прикрепленном файле.
Form1 - не работает
Form2 - работает

AccessXP ADP + MSSQL2000SP3a
Возможно это от того , что у меня сервис паков нет
(админы не дают устанавливать, типа если у табе будут сервис паки,
то у юзеров может не работать, а у юзеров мы сервис паки устанавливать не собирамся)
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32790668
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты в профайлере взгляни, чего Access отправляет на сервер при синхронизации "по собственному Access-ному разумению" и обнаружишь причину.
--------------------
Access плюет на SP, он синхронизирует строку прямо с таблицей.
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32790736
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в профайлере взглнул
Form1-не работает
Код: plaintext
1.
2.
3.
4.
5.
exec sp_executesql N'UPDATE "Resync"."dbo"."InContacts" 
SET "Status_ID"=@P1 
WHERE "ID"=@P2 AND "Status_ID"=@P3 AND "UserID"=@P4', N'@P1 tinyint,@P2 int,@P3 tinyint,@P4 int',  2 ,  4 ,  1 ,  39 

exec sp_executesql N'exec sp_ResyncCommand_1 @P1', N'@P1 int',  4 
Form2-Работает
Код: plaintext
1.
2.
3.
4.
5.
exec sp_executesql N'UPDATE "Resync"."dbo"."InContacts" 
SET "Status_ID"=@P1 
WHERE "ID"=@P2 AND "Status_ID"=@P3 AND "UserID"=@P4', N'@P1 tinyint,@P2 int,@P3 tinyint,@P4 int',  2 ,  4 ,  1 ,  39 

exec sp_executesql N'exec sp_ResyncCommand_2 @P1', N'@P1 int',  4 
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32790786
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня работает в одной хрени даже - источник данных хранимка
а ресинх - строка запроса

1 может прокатит если всем полям дать принудительные псевдонимы ?

может быть из за того что :
в одном случае идет обращение к полю
как dbo.InContacts.ID
(когда несколько таблиц)

а в другом
как просто ID -
когда одна таблица

2 может from в обеих случаях закатать в подзапрос и назвать его
типа Deliveredtbl ?
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32790806
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вечером посмотрю
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32790849
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переименовал ID не помогло
Перенес тела ХП в форму в виде строки - работает так же
Подзапрос не помог

PS Можно конечно плюнуть,ведь второй вариант рабочий
но вьюха может быть довольно тяжелой
и ее бессмысленность в комманде синхронизации слегка бесит
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32790879
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПереименовал ID не помогло

я имел ввиду дать псевдонимы всем полям - можно даже исходные:

dbo.InContacts.ID as ID , dbo.Status_tbl.Name AS Status_Name, dbo.InContacts.Status_ID as Status_ID , dbo.InContacts.ContactName as ContactName ....

в обоих случаях - и данных и ресинхронизации
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32791072
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделал на
Код: plaintext
1.
2.
dbo.InContacts.InC_ID AS Expr1, dbo.InContacts.Status_ID AS Expr2, 
dbo.Status_tbl.Name AS Expr3, dbo.InContacts.UserID AS Expr4
не помогло
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32792642
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по форме изменение в каком поле приводит к ошибке?

поле Status_Name у меня меняется в обеих формах

про поле Status_ID - говорит о целосности данных при замене значения на любое число вне нужного диапазоно, при замене на число из диапазона - меняет..

добавить не удалось в обоих формах.

ХР Рro/XP SP3

SQL developer без SP.

Jet4 SP8
( mdb - заметное увеличени скорости!!!!)

какие действия нада сделать чтоб получить твою ошибку?
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32792682
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тут посмотрел твои хранимки в конструкторе
и чё-то не понялллл....
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32792685
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нафига связь к пустой таблице?
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32792828
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадянафига связь к пустой таблице?

для иллюстрации заявленной темы.
человек показывает, что у него join еще и фильтрующие
функции выполняет. И, скорее всего, в этом направлении и лежит
тема "оптимизации" - перенести явно в WHERE фильтр по невыводимым в результат таблицам (пока не проверил - но должно бы "заработать")


ЗЫ
в пятницу попробовал выложенный Latuk проект. Успел увидеть,
что поведение на 100% соответствует тому, что он описал.
(MDAC 2.8, MSDE без сервис-паков)
Кроме того, проверил, что простое включение в "план исполнения" "пропущенной таблицы" методом селекта из нее в локальную переменную - ничего не меняет.

Нет уверенности, что к этому можно применить термин "не работает" - в действительности ресинк ключевого поля уникальной таблицы происходит.
Но и нет понимания, как в точности к этому отнестись...
Может завтра, для очистки совести, проверю, что на стандартном MSDataShape ситуация воспроизводится и убедюсь в том , что clientbatch-курсор здесь ни при чем...
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32793079
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для чего это всё - для ресинка, а для ресинка достаточно и необходимо чтоб результатом была запись только из одной строки. а одна строка должна быть выбрана по опеределённым параметрам.
для оптимизайии пересылаемых данных необходимо чтоб в однозначной таблице присутствовало поле даташтамп.

для оптимизации фильтрования данных возвращаемой ХП можно ( и я считаю нужно) использовать не запись команды синхронизации из конструктора формы , из вба по событию после обновления поля,(или записи)
или на событие ошибки формы ( при соответствующем отключении вывода об ошибке)

можно записать



Код: plaintext
1.
2.
3.
'*

Me.ResyncCommand = "P02_1 " & Me!id  '**
Me.Recordset.Resync adAffectCurrent

'*- здесь можно запустить ХП которая бы произвела необходимые действия как-то вставила в нужные полянужных таблиц значения из ключевых полей соответствующих таблиц.


'** - тут можно добавить еще несколько параметров, для выбора только одной записи
вообще ресинк должна вернуть только поля в последовательности и количестве , как у источника данных . при этом отображаемые данные(после ресинк) МОГУТ НЕ СООТВЕТСТВОВАТЬ данным если бы произошел рефреш формы!!!!!!

т.е при рефреше данная строка пропала из отображения на форме!!!!

если использовать стандартный ресинк так будет.

ПРОШУ УДЕЛИТЬ ВНИМАНИЕ : НА ФОРМЕ ПОСЛЕ ИЗМЕНЕНИЯ ЗАПИСЬ НЕ СООТВЕТСТВУЮЩАЯ ДЛЯ ИСТОЧНИКА ДАННЫХ ФОРМЫ!!!!
поле можно изменить взад.( пристандартном подходе этого нельзя сделать- строка исчезнет с формы) (ежели без транзакций, но с транзакциями запись исчезнет) т.е можно видеть какие записи изменились....

я может не совсем понятно изложил... если потребуется


Вопрос по обновлению записи + тест (АДП)



здесь можно посмотреть использование, правда вопрос о другом , но с применением изложенного метода..
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32793154
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашлось вот что
ACC2000: How to Simulate AutoLookup with a Stored Procedure in Access Client/Server

Q239886

<...>
general rule is that you should set the ResyncCommand property to the same SQL statement as the stored procedure being used as the record source, minus the WHERE clause being used in the stored procedure. Then add a WHERE clause to the SQL statement that parameterizes the primary key columns from the table designated in the UniqueTable property of the form.
<...>
Multiple-Field Primary Keys
If the primary key of the "foreign" or "many side" table is made up of multiple fields, you must use the AND clause and parameterize each field within the WHERE clause of the ResyncCommand property. For example, if the foreign table contains a three-field primary key, the SQL statement for the ResyncCommand property would look similar to the following:

SELECT
Table1.Field1,
Table1.Field2,
Table1.Field3,
Table2.*
FROM
Table1 INNER JOIN Table2
ON
Table1.ID = Table2.ForeignID
WHERE
Table2.PrimaryKeyField1 = ? AND
Table2.PrimaryKeyField2 = ? AND
Table2.PrimaryKeyField3 = ?

<...>

более внятных текстов на эту тему пока не видел...

(с выражением лица)
...
Рейтинг: 0 / 0
ResyncCommand не работает если ее FROM отличается от FROM источника формы
    #32793214
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это всё для использования "стандартным методом"...
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ResyncCommand не работает если ее FROM отличается от FROM источника формы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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