Member 12656334 Ответов: 0

Как создать отчет crystal динамически


Привет, у меня есть проблема с созданием монокристаллического отчета для динамической генерации данных нескольких SQL-запросов. Я много гуглил, но не мог найти правильного решения для решения своей проблемы.

Мое требование состоит в том, чтобы создайте монокристаллический отчет, который должен загрузить содержимое SQL-запрос передавался в это время динамически не создавать отчет с помощью мастера перетаскивания.

Например, у меня есть текстовое поле для ввода SQL-запроса и поле кнопки для создания отчета Crysrtal. если я нажму кнопку generate после предоставления sql-запроса,CR должен быть сгенерирован результат SQL-запроса внутри отчета crystal.

Это делается для того, чтобы избежать создания нескольких отчетов Crystal для нескольких запросов.

Что я уже пробовал:

Это код, который я пробовал до сих пор, я застрял, чтобы найти правильное решение.

VB код:
Частная суб loadlabe2()
Дим cryRpt в новом документе
Дим CNN в качестве объекта sqlconnection
Dim connectionString как строка
Dim sql как строка

параметр connectionString = "источник данных=файл mydata\MYAPP21;начальный каталог=XYZ_FrontOffice;идентификатор пользователя=АБВ;пароль=тест"
cnn = New SqlConnection(connectionString)
телеканал CNN.Открыть()
в SQL = procesSQL()
Dim dscmd как новый SqlDataAdapter(sql, cnn)
Dim ds как новый DataSet4
dscmd.Fill(ds, " DataTable1")
cryRpt.SetDataSource(ДС.Таблицы(1))
CrystLabl.ReportSource = "CrystalReport4.РПТ"
CrystLabl.RefreshReport()
Конец Подводной Лодки
Публичная функция procesSQL() в виде строки
Dim sql как строка
Дим в среде SQL как строку
Dim firstPart как строка
Dim lastPart как строка
Dim selectStart как целое число
Dim fromStart как целое число
Тусклые поля в виде строки()
Dim i как целое число
Тусклый мой текст, как кристаллические решения.CrystalReports.Двигатель.TextObject
Dim discreteVal1 как новые кристаллические решения.Общий.ParameterDiscreteValue()

в среде SQL = текстовое поле textbox1.Текст
в среде SQL = в среде SQL.Топпер

selectStart = inSql. IndexOf ("SELECT")
fromStart = inSql. IndexOf ("FROM")
selectStart = selectStart + 6
firstPart = inSql. Substring(selectStart, (fromStart-selectStart))
lastPart = inSql. Substring(fromStart, inSql. Length - fromStart)

поля = firstPart.Сплит(",")
firstPart = ""
Для i = 0 к полям.Длина - 1
Если i > 0, то
firstPart = firstPart &", " & amp; fields(i).ToString() & "AS COLUMN" & i + 1
mytext = ctype для(CrystLabl.ReportSource.ReportObjects("текст" & я + 1), TextObject)
мой текст.Текст = поля (i).Метод toString()
Ещё
firstPart = firstPart & fields (i).ToString() & "AS COLUMN" & i + 1
mytext = ctype для(CrystLabl.ReportSource.ReportObjects("текст" & я + 1), TextObject)
мой текст.Текст = поля (i).Метод toString()
Конец, Если
Следующий
среда SQL = "выбрать" &амп; firstPart &ампер; "" &амп; lastPart
Вернуться в SQL
Конечная Функция

an0ther1

Лично я бы так не поступил. В какой-то момент у вас возникнут проблемы с производительностью, и вы в основном позволяете пользователю запрашивать любую таблицу, которую он хочет, что, вероятно, плохо.
Вам также нужно будет обработать любой запрос, который пишет пользователь - помните, что crystal использует результат запроса для определения полей в отчете - вам нужно пройти через все варианты и создать соответствующее отображение.
Поиск в сети обнаружил следующее:;
http://stackoverflow.com/questions/5729434/how-can-i-pass-sql-query-to-crystal-report
Страница, на которой находится решение, содержит много примеров, но ссылки никуда не идут, вы можете найти примеры с небольшим усилием.

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

Однако удачи

0 Ответов