Недостаточно сведений из основной таблицы для обновления.

вадя
Дата: 21.11.2009 18:01:42
адп (2002)+sql2005
источник хранимка на основе нескольких таблиц , есть id из одной из таблиц, но в поле id есть значения null, есть поле с нумерами строк (row_number() over....) для однозначной идентификации записи достаточно (но для как это сказать скулю?)
данные выводятся при условии если у формы 'тип набора записей' = стстический набор

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

задача - обойти то что в заголовке
делать временную таблицу на сервере - не подходит.
делать временную таблицу в локальном мдб - не подходит
делать на оторванном рекордсте - не подходит (только в крайнем случае, но это сам знаю как)
вадя
Дата: 21.11.2009 18:02:31
автор
делаю хранимку с входными параметрами - все поля из источника данных,
соответственно выходные теже поля , только одно поле изменено


для команды синхронизации
VladimirKr
Дата: 21.11.2009 18:43:00
вадя,

Параметры команды синхронизации - это ключ уникальной таблицы. То есть Null исключен - будет ошибка.

Не очень понятно что вы хотите. Просто сделать ресинхронизацию строки формы, или изменить поле интерактивно, через контрол формы, с последующей ресинхронизацией, которую акс сделает после апдейта записи?
Отсюда два разных варианта решения.
VladimirKr
Дата: 21.11.2009 18:51:08
VladimirKr
вадя,

Параметры команды синхронизации - это ключ уникальной таблицы. То есть Null исключен - будет ошибка.

Не очень понятно что вы хотите. Просто сделать ресинхронизацию строки формы, или изменить поле интерактивно, через контрол формы, с последующей ресинхронизацией, которую акс сделает после апдейта записи?
Отсюда два разных варианта решения.



B еще хочется увидеть, какое поле меняется, однозначную таблицу, текст хранимки и процедуры ресинхронизации.
вадя
Дата: 21.11.2009 19:02:21
автор
Параметры команды синхронизации - это ключ уникальной таблицы. То есть Null исключен - будет ошибка.


один из параметров, остальные по количесву и типу - на вкус

автор
Просто сделать ресинхронизацию строки формы, или изменить поле интерактивно, через контрол формы, с последующей ресинхронизацией, которую акс сделает после апдейта записи?


по сути это одно и тоже.

требуется -
Me.ResyncCommand = "exec dbo.xxxxx_resync " & Me!id & набор нужных мне значений
Me.Recordset.Resync adAffectCurrent

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

если есть id - нет проблем...
вадя
Дата: 21.11.2009 19:08:30
автор
B еще хочется увидеть, какое поле меняется, однозначную таблицу, текст хранимки и процедуры ресинхронизации.


ALTER PROCEDURE [dbo].[disigner_orders]
@disigner int,
@status int
AS
	SET NOCOUNT ON;

with 
tt(id_orders,n_or,dp,df,namep,id_plan,stat,nn ) as
(
SELECT 
 order_list_tbl.id AS id_orders,
 order_list_tbl.number_order AS n_or, 
CONVERT(nvarchar(8), order_plan_tbl.date_plan, 4) AS dp, 
CONVERT(nvarchar(8), order_plan_tbl.date_fact, 4) AS df,
property_tbl.name_p AS namep, 
order_plan_tbl.id AS id_plan, 
order_list_tbl.status AS stat, 
property_tbl.пор_номер AS nn
FROM         order_plan_tbl INNER JOIN
                      property_tbl ON order_plan_tbl.id_property = property_tbl.id INNER JOIN
                      order_list_tbl ON order_plan_tbl.id_order = order_list_tbl.id
WHERE     (order_list_tbl.status = CASE @status WHEN 99 THEN order_list_tbl.status ELSE @status END) AND (order_list_tbl.id IN
                          (SELECT     id_order
                            FROM          order_users_tbl
                            WHERE      (id_user = (CASE @disigner WHEN 0 THEN id_user ELSE @disigner END))))
)
,
userss ( nn,id_order,name) as
(
SELECT     
row_number() over(partition by order_list_tbl.id order by users.name) as nnn, 
order_list_tbl.id as id_order, users.name
FROM         property_tbl INNER JOIN
                      order_users_tbl ON property_tbl.id = order_users_tbl.id_property INNER JOIN
                      order_list_tbl ON order_users_tbl.id_order = order_list_tbl.id INNER JOIN
                      users ON property_tbl.id = users.id_property AND order_users_tbl.id_user = users.id
WHERE     (property_tbl.name_p = 'дизайнеры')
)


select
row_number() over( order by isnull(dd.id_orders,9999999)) as nn,
 number_order, namep,dp,df,isnull(dd.id_orders,0) id_orders,isnull(stat,0) stat,userss.name,isnull(id_plan,0) id_plan,up_line,picline from
(
select  
		row_number() over(partition by t.n_or order by t.nn) as nn,
        case row_number() over(partition by t.n_or order by t.nn)
			when 1 then  space(6)+cast(t.n_or as nvarchar)
			when 2 then
				case stat
					when 0 then 'создан'
					when 1 then 'в работе'
					when 2 then 'выполнен'
					when 3 then 'сдан'
					when 4 then 'закрыт'
				end 
		else null end as number_order,
        namep,dp,df,t.id_orders,stat,id_plan,
		case 
			when (row_number() over( order by t.n_or, t.nn)>1)  and (row_number() over(partition by t.n_or order by t.nn)=1)
			then (SELECT pic FROM pic WHERE (number = 5))
			ELSE null
		end AS up_line,
		(SELECT pic FROM pic WHERE (1=2)) as picline
  from tt t) dd  FULL OUTER JOIN userss on userss.id_order=dd.id_orders and   userss.nn=dd.nn

синхронизация
ALTER PROCEDURE [dbo].[disigner_orders_picline_resync]
@nn int,
@number_order nvarchar(15),
@namep nvarchar(15),
@dp nvarchar(8),
@df nvarchar(8),
@id_orders int,
@stat int,
@name nvarchar(15),
@id_plan int,
@up_line image,
@picline image
AS
	SET NOCOUNT ON;

select 
@nn ,
@number_order ,
@namep ,
@dp ,
@df ,
@id_orders ,
@stat ,
@name ,
@id_plan ,
@up_line ,
(select pic from pic where number=3)
VladimirKr
Дата: 21.11.2009 19:42:34
вадя


требуется -
Me.ResyncCommand = "exec dbo.xxxxx_resync " & Me!id & набор нужных мне значений
Me.Recordset.Resync adAffectCurrent

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

если есть id - нет проблем...


Ну дык это совсем просто...
Чтобы сделать синхронизацию чего угодно нужно просто подсунуть левую однозначную таблицу:

CREATE TABLE [dbo].[AccessResync](
	[SyncInd] [int] NOT NULL CONSTRAINT [DF_Resync_SyncInd]  DEFAULT ((1)),
 CONSTRAINT [PK_Resync] PRIMARY KEY CLUSTERED 
(
	[SyncInd] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY];

insert into dbo.AccessResync(SyncInd) values(1);

таблица с одной записью готова. далее легкое изменение хранимки формы:
ALTER PROCEDURE [dbo].[disigner_orders]
@disigner int,
@status int
AS
	SET NOCOUNT ON;
----- добавляем к select  : cross join dbo.AccessResync R и выводим  R.SyncInd
select
R.SyncInd,
row_number() over( order by isnull(dd.id_orders,9999999)) as nn,
 number_order, namep,dp,df,isnull(dd.id_orders,0) id_orders,isnull(stat,0) stat,userss.name,isnull(id_plan,0) id_plan,up_line,picline from
(
select  
		row_number() over(partition by t.n_or order by t.nn) as nn,
        case row_number() over(partition by t.n_or order by t.nn)
			when 1 then  space(6)+cast(t.n_or as nvarchar)
			when 2 then
				case stat
					when 0 then 'создан'
					when 1 then 'в работе'
					when 2 then 'выполнен'
					when 3 then 'сдан'
					when 4 then 'закрыт'
				end 
		else null end as number_order,
        namep,dp,df,t.id_orders,stat,id_plan,
		case 
			when (row_number() over( order by t.n_or, t.nn)>1)  and (row_number() over(partition by t.n_or order by t.nn)=1)
			then (SELECT pic FROM pic WHERE (number = 5))
			ELSE null
		end AS up_line,
		(SELECT pic FROM pic WHERE (1=2)) as picline
  from tt t) dd  FULL OUTER JOIN userss on userss.id_order=dd.id_orders and   userss.nn=dd.nn
cross join dbo.AccessResync R

теперь процедура ресинхронизации:
ALTER PROCEDURE [dbo].[disigner_orders_picline_resync]
@nn int,
@number_order nvarchar(15),
@namep nvarchar(15),
@dp nvarchar(8),
@df nvarchar(8),
@id_orders int,
@stat int,
@name nvarchar(15),
@id_plan int,
@up_line image,
@picline image,
@SyncInd int
AS
	SET NOCOUNT ON;

-- кстати, не пробовал ни разу но неужели select  без имен полей в процедуре синхронизации прокатывает?
select 
R.SyncInd 
@nn ,
@number_order ,
@namep ,
@dp ,
@df ,
@id_orders ,
@stat ,
@name ,
@id_plan ,
@up_line ,
(select pic from pic where number=3)
from dbo.AccessResync R where SyncInd=@SyncInd
И в конце концов собственно ресинхронизация:
В форме в свойстве UniqueTable ставим "AccessResync"

и
Me.ResyncCommand = "exec dbo.xxxxx_resync " & Me!id & набор нужных мне значений +", ?"
Me.Recordset.Resync adAffectCurrent 

Я тыщу раз так делал :)

И еще очень важно, иначе будут ошибки - типы полей основной процедуры и процедуры синхронизации должны полностью совпадать. Если нет уверенности - делайте cast/convert. Иначе в аксе можно получить загадочное сообщение : "ошибка в ходе вполнения многошаговой процедуры".
VladimirKr
Дата: 21.11.2009 19:52:28
VladimirKr,

Кстати ни разу не пробовал (не было нужды) но раз ресинхронизация делается только константами, то прокатит видимо и такая процедура ресинхронизации:
ALTER PROCEDURE [dbo].[disigner_orders_picline_resync]
@nn int,
@number_order nvarchar(15),
@namep nvarchar(15),
@dp nvarchar(8),
@df nvarchar(8),
@id_orders int,
@stat int,
@name nvarchar(15),
@id_plan int,
@up_line image,
@picline image,
@SyncInd int
AS
	SET NOCOUNT ON;

select 
@nn ,
@number_order ,
@namep ,
@dp ,
@df ,
@id_orders ,
@stat ,
@name ,
@id_plan ,
@up_line ,
(select pic from pic where number=3)
вадя
Дата: 22.11.2009 21:57:09
изменения это

R.SyncInd,

cross join dbo.AccessResync R
?

у меня выводится 1 в этом столбце. должно ли так быть?
насколько такой метод согласуется с использованием оператора with ?
мне так и не удалось пока решит эту проблему.

вроде метод должен работать , но что-то мешает. что надо проверить?
VladimirKr
Дата: 23.11.2009 09:57:23
вадя
изменения это

R.SyncInd,

cross join dbo.AccessResync R
?

у меня выводится 1 в этом столбце. должно ли так быть?
насколько такой метод согласуется с использованием оператора with ?
мне так и не удалось пока решит эту проблему.

вроде метод должен работать , но что-то мешает. что надо проверить?


ДА, в этом вся соль. На результирующий select кроме выше определенных СТЕ можно навешивать все что угодно.
Одна строка в таблице с одним полем, которое ПК. Это нужно для того, чтобы в запросе была таблица с первичным ключем, которая будет UniqueTable в форме и по которой будет работать ресинхронизация (Заметили лишний параметр в dbo.xxx_resync и ",?" в вызове Resync?).
А что конкретно у вас не получается. Какое сообщение об ошибке?