Речь идет об использовании функции соединения для сохранения многозначного параметра и последующего восстановления точно таких же выборов из базы данных позже.
Я только что закончил отчет, в котором были требования, что параметры должны быть сохранены, и когда отчет открывается снова (отчет передается параметром OrderID), значения, ранее выбранные пользователем, должны быть снова выбраны.
В отчете использовалось полдюжины параметров, каждый из которых имел свой собственный набор данных и результирующий выпадающий список. Параметры были зависимы от предыдущих параметров, чтобы сузить область окончательного выбора, и когда отчет был «просмотрен», для заполнения была вызвана хранимая процедура.
Хранимая процедура получила каждый из параметров, переданных ей из отчета. Он проверил таблицу хранения в базе данных, чтобы увидеть, были ли какие-либо параметры сохранены для этого OrderID. Если нет, то сохраняются все параметры. Если так, он обновил все параметры для этого заказа (это тот случай, когда пользователь передумает позже).
Когда отчет запускается, существует набор данных dsParameters, представляющий собой текст SQL, который выходит и выбирает одну строку для этого идентификатора заказа, если он есть. Каждый из параметров в отчете получает значение по умолчанию из этого набора данных, а свой список выбора - из набора данных, выделенного для этого параметра.
У меня возникли проблемы с параметром множественного выбора. Я использовал команду join (@Value, ",") в списке параметров основного набора данных, передавая хранимой процедуре строку с разделителями-запятыми. Но как его восстановить? Невозможно передать строку с разделителями-запятыми обратно в поле значений по умолчанию для параметра.
Мне пришлось создать еще один набор данных, чтобы разделить параметр, аналогично тому, о чем вы говорите. Это выглядит так:
IF OBJECT_ID('tempdb..#Parse','U') IS NOT NULL DROP TABLE #Parse
DECLARE @Start int, @End int, @Desc varchar(255)
SELECT @Desc = fldDesc FROM dbCustomData.dbo.tblDirectReferralFormParameters WHERE fldFrom = @From and fldOrderID = @OrderID
CREATE TABLE #Parse (fldDesc varchar(255))
SELECT @Start = 1, @End = 1
WHILE @End > 0
BEGIN
SET @End = CHARINDEX(',',@Desc,@Start)
IF @End = 0
BEGIN
INSERT #Parse SELECT REPLACE(SUBSTRING(@Desc,@Start,LEN(@Desc)),',','') AS fldDesc
BREAK
END
ELSE
BEGIN
INSERT #Parse SELECT REPLACE(SUBSTRING(@Desc,@Start,@End-@Start),',','') AS fldDesc
END
SET @Start = @End + 1
END
SELECT * FROM #Parse
Каждый раз, когда открывается форма, этот набор данных проверяет в базе данных сохраненную строку для этого многозначного параметра. Если его нет, он возвращает ноль. Если он включен, он разбирает запятые и создает строку для каждого из значений.
Тогда для поля значений по умолчанию устанавливается этот набор данных и fldDesc. Оно работает! Когда я выбираю один или несколько, они сохраняются и пополняются при повторном открытии формы.
Надеюсь, это поможет. Я искал некоторое время и не нашел никаких упоминаний о сохранении строки соединения в базе данных и последующем ее разборе в наборе данных.