我的客户已决定要重命名一个非常常用的数据项名称。 因此,例如,数据库有一个名为“Cost”的列,他们在一堆报告中看到“Cost”。 客户现在希望到处都能看到“净成本”。 因此,我们需要更改“成本”的每次出现并将其更改为“净成本”
我可以在Framework Manager中轻松完成,我甚至可以运行Tools>报告依赖关系以查找使用“成本”列的所有报告。但如果有4,000个,那么更新它们需要做很多工作。
一个想法是将整个内容存储库部署到Cognos Deployment zip文件中,然后将其提取出来。进行全球搜索&替换XML。但那将是凌乱的&危险。
选项2是使用MotioPI进行搜索&更换。我不认为客户会因为这项任务而购买此产品。
还有其他选择吗?
任何想法都会受到欢迎......
答案 0 :(得分:0)
你的第一个选择是要走的路。这基本上归结为XML查找和替换方案。您需要仅隔离单词" Cost"的实例。哪些与你有关。这可能涉及开始和结束标记。
要更改报告中的数据源参考,您需要查找并替换三部分名称[Presentation Layer].[Namespace].[Cost]
。如果项目上有过滤器,则它们可能只引用查询中的一个部件名称。同样,任何派生的查询都会引用两部分名称。通过查看XML报告规范并找出如何隔离文本来处理这些内容。
我假设您的列名设置为从模型继承商家名称而不是硬编码(Source Type
应该是Data Item Label
,而不是Text
)。如果没有,您也需要处理这些问题。查看XML,您会看到<staticValue>Cost</staticValue>
。
因为你有备份,所以并不是很危险。只需多次通过,每次通过尽可能多的查找和替换。
Motio只会查看代码中的值,因此您无法隔离Cost
,因此无法将其用于此目的。但是,在查找和替换后对报告进行大规模验证会很方便。这一年的单座位许可证可以通过它可以节省的开发时间来证明。
答案 1 :(得分:0)
您是否尝试过使用DRU? (http://www-01.ibm.com/support/docview.wss?uid=swg24021248) 我之前使用过这个工具来做你正在描述的事情。
祝你好运。答案 2 :(得分:0)
您至少可以使用以下内容搜索Content Store(v10.2.1)中的文本:
set define off
select distinct T4.name as folder_name, T2.name as report_name
from cmobjprops7 T1
inner join cmobjnames T2 on T1.cmid=T2.cmid
inner join cmobjects T3 on T1.cmid=T3.cmid
inner join cmobjnames T4 on T3.pcmid=T4.cmid
inner join ( -- only want the latest version (this still shows reports that have been deleted)
Select T4.name as folder_name, T2.name as report_name, max(T3.modified) as latest_version_date
from cmobjnames T2
inner join cmobjects T3 on T2.cmid=T3.cmid
inner join cmobjnames T4 on T3.pcmid=T4.cmid
Where T2.Name like ‘%myReport%’ -- search only reports with 'myReport' i the name
and substr(T4.name,1,1) in ('Project Zeus','Project Jupiter') -- search only folders with this in the name
Group by T4.name, T2.name
) TL on TL.folder_name=T4.name and TL.report_name=T2.name and TL.latest_version_date=T3.modified
where T1.spec like '%[namespace].[column_name]%' -- text you want to find
and substr(T4.name,1,2) in ('Project Zeus','Project Jupiter')
order by 1 desc, 2;