我将一个tableName从一个报告传递到SSRS中的另一个钻取报告。我的钻取报告应基于动态数据集动态创建表。
这是可能的,还是我想要实现不可能?
答案 0 :(得分:1)
Reporting Services中的几乎所有内容都是表达式,包括Sql查询语句。您可以将表名作为参数传递,然后使用它来动态构建查询。
右键单击数据集,单击fx
,然后单击查询框旁边的表达式编辑器,即="SELECT Code, Description "
&" FROM " & Parameters!TableName.Value
&" ORDER BY Code "
按钮。现在我们可以将查询编辑为字符串表达式。
假设您希望报表从各种查找表中打印代码和描述,并在向下钻取时将特定的表名作为参数传递。编辑数据集的Sql表达式如下所示:
Fields
当Sql语句基于表达式时,Dataset Properties
集合不会自动更新,因此您必须手动添加字段。在Fields
编辑Fields
集合中,添加数据集中的字段。请注意,即使您使用的是不同的表,数据集中的字段也需要保持一致,以便将它们链接到表格单元格。
如果表中的字段具有不同的名称,则需要将它们别名为已添加到Sql中ThisTable
集合的名称。可以说Id
包含字段Name
和ThatTable
,Code
包含Description
和="SELECT " & IIF(Parameters!TableName.Value = "ThisTable", "Id", "Code") & " AS Code, "
& IIF(Parameters!TableName.Value = "ThisTable", "Name", "Description") & " AS Description "
&" FROM " & Parameters!TableName.Value
&" ORDER BY Code "
。
Code
因此,我们将所有字段别名为Description
和/**
* Builds map of anagrams
*/
private void buildAnagramMap() {
System.out.println("Starting build anagrams map at thread " + Thread.currentThread().getName());
if (glossary != null) {
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < availableProcessors.get(); i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
end.set(start.get() + glossary.size() / availableProcessors.get());
int startAt = start.get();
start.set(end.get() + 1);
// if not divisible by number of available processors then we add residue to last thread
if ((glossary.size() % availableProcessors.get() > 0) &&
((glossary.size() - end.get()) < (glossary.size() / availableProcessors.get()))) {
end.set(glossary.size());
}
for (int i = startAt; i < end.get(); i++) {
String key = sortString(glossary.get(i));
HashSet<String> val = anagrams.get(key);
if (val == null) {
val = new HashSet<>();
anagrams.put(key, val);
}
val.add(glossary.get(i));
}
}
});
}
executorService.shutdown();
while (!executorService.isTerminated()) {
try {
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} else {
System.err.println("Glossary doesn't exist");
}
}
/**
* Splits glossary on fragments to search
* @return point to start
*/
private synchronized int fragmentation() {
end.set(start.get() + glossary.size() / availableProcessors.get());
int startAt = start.get();
start.set(end.get() + 1);
return startAt;
}
。
当然,如果您有许多不同的字段名称和许多不同的表格,这将变得混乱。在这种情况下,您可能最好创建视图以便为您执行别名并使用数据集中的视图或使用存储过程。