Службы отчетов и динамические поля - PullRequest
0 голосов
/ 13 февраля 2012

Я новичок в службах отчетности, поэтому этот вопрос может быть безумным.Я ищу способ создать пустой «шаблонный» отчет (который в основном представляет собой письмо в форме), а не создавать его для каждого клиента в нашей системе.Часть этой формы письма представляет собой раздел, который имеет любое количество из 25 определенных полей.Раздел устроен так:

Name:           Jesse James
Date of Birth:  1/1/1800
Address:        123 Blah Blah Street
                Anywhere, USA 12345
Another Field:  Data
Another Field2: More Data

Те (и любые другие поля, которые указывает клиент) могут быть расположены в любом порядке, а метка слева может быть любой, какой решит клиент (пример: 'DOB »вместо« Дата рождения »).ИДЕАЛЬНО, я бы хотел иметь веб-интерфейс, в котором вы можете щелкнуть по нужным полям, указать порядок, в котором они будут отображаться, и указать, что это за пользовательская метка.Я нашел способ указать метки и упорядочить их (и загрузить их «динамически» в отчете), но я хотел сделать еще один шаг вперед, если бы мог, и разрешить выбор и упорядочение динамического поля (справа).Суть в том, что я хочу сделать это без использования динамического SQL.Я пошел по пути, чтобы иметь таблицу конфигурации, которая содержит порядковый номер, пользовательский текст метки и фактическое имя столбца, и пытаться соединить эту таблицу с таблицей, которая на самом деле содержит данные через information_schema.columns.Возможно, запросив ВСЕ потенциальные поля и выполнив ВНУТРЕННЕЕ СОЕДИНЕНИЕ, выполните фильтрацию (если есть совпадение из таблицы «конфигурации» и т. Д.).Это не работает так, как я думал :) Я думаю, я думал, что смогу смоделировать функциональность набора данных (в котором значение и имя поля запечены в объекте).Я понимаю, что это не оптимальный инструмент для попытки такого подвига, это просто то, с чем я вынужден работать.

Таблица конфигурации будет содержать конфигурацию для многих клиентов / отчетов, и я буду фильтровать по идентификатору клиента.Таблица конфигурации будет выглядеть примерно так:

CustID LabelText ColumnName Порядковый номер 1 Имя FName 1 1 Фамилия LName 2 1 Дата рождения DOBirth 3 2 Идентификатор клиента ClientID 1 2 Фамилия LName 2 2 Адрес 1 Address1 32 Адрес 2 Адрес2 4

Все, что сказать:

  1. Есть ли способ выполнить вышеупомянутый запрос?
  2. Я слишком разборчив виспользование динамического SQL в качестве рассматриваемого раздела будет тянуть только одну строку?Однако есть сотни клиентов, которые запускают этот отчет (письмо) два или три раза в день.

Кроме того, имейте в виду, что я не пытаюсь динамически создавать текстовые поля в отчете.Я либо просто объединю поля в одну строку и добавлю их в текстовое поле, либо получу несколько отчетов, каждый из которых содержит определенное количество текстовых полей, ожидающих общего имени поля («field1» и т. Д.).Чем больше я печатаю, тем безумнее это звучит ... Если нет способа сделать это, я, скорее всего, что-то найду в пользовательском коде;но моя сторона OCD хочет верить, что есть SQL вне моих нынешних полномочий, который может сделать это более изящным способом.

1 Ответ

0 голосов
/ 14 февраля 2012

Не уверен, зачем вам все это возвращать в одной строке: похоже, SSRS хотел бы, чтобы это нормализовалось дальше: возвращать строку для каждой строки в таблице конфигурации для текущего отчета.Если вам действительно нужно объединить, сделайте это с помощью встроенного кода в отчете или просто поместите таблицу в форме письма.Запрос ниже делает некоторые предположения о вашей таблице конфигурации.Содержит ли он только конфигурацию для текущего отчета, или он содержит конфигурацию для многих клиентов / отчетов одновременно?Также вы не дали много информации о том, как вы будете фильтровать соответствующую запись, поэтому я просто использовал идентификатор клиента.

SELECT
   config.ordinal,
   config.LabelText,
   CASE config.ColumnName
      WHEN 'FName' THEN DataRecord.FirstName
      WHEN 'LName' THEN DataRecord.LastName
      WHEN 'ClientID' THEN DataRecord.ClientID
      WHEN 'DOBirth' THEN DataRecord.DOB
      WHEN 'Address' THEN DataRecord.Address
      WHEN 'Field' THEN DataRecord.Field
      WHEN 'Field2' THEN DataRecord.Field2
      ELSE
      NULL
      END AS response
FROM
   ConfigurationTable AS config
LEFT OUTER JOIN
   DataTable AS DataRecord
ON config.CustID = DataRecord.CustomerID 
WHERE DataRecord.CustomerID = @CustID
ORDER BY
   config.Ordinal

Есть другие способы сделать это, в SSRS или в SQL,зависит от более подробной информации о ваших требованиях.

...