Cognos 8のメタデータを照会して、すべてのレポート名と列名を見つけたいと思います。可能であれば、列の定義を含めたいと思います。
Cognos レポートを使用してこれを行うことはできますか? または、リポジトリにクエリを実行する必要がありますか?
ありがとう。
次のクエリを使用して、Content Store からレポートのリストを選択できます。
SELECT CMOBJNAMES_BASE.NAME AS ObjName, CMOBJECTS.PCMID, CMCLASSES.NAME AS ClassName, CMOBJPROPS7.spec
FROM CMOBJECTS
JOIN CMOBJNAMES_BASE ON CMOBJECTS.CMID = CMOBJNAMES_BASE.CMID
JOIN CMCLASSES ON CMOBJECTS.CLASSID = CMCLASSES.CLASSID
LEFT JOIN CMOBJPROPS7 ON CMOBJECTS.CMID = CMOBJPROPS7.CMID
WHERE CMOBJECTS.CLASSID IN (10, 37)
ORDER BY CMOBJECTS.PCMID;
私はそれをCognos 10で使用しています.Cognos 8では、CMOBJNAMES_BASEテーブルは実際には_BASEなしで「CMOBJNAMES」という名前になっていると思います。
更新: テスト済みで、Cognos 11r9 で動作します。
レポートのメタデータは、CMOBJPROPS7 の「SPEC」列に XML として保存されます。この XML を解析して、レポートで使用されている列を取り除くことができます。それは簡単な仕事ではありません。
時間はあってもお金がない場合は、独自のコードを記述してその XML を解析できます。時間よりお金に余裕がある場合は、Motio や BSP Metamanager などのサードパーティ プログラムを購入して、これを実現できます。
上記のクエリは、列のクリーンなリストを作成するのにはあまり役に立ちませんが、特定のデータ項目を検索するには優れています。たとえば、データ ソースに変更したい列があるが、どのレポートがその列を使用しているかがわからない場合があります。上記のクエリを実行し、データ項目を検索します。XML 内に Cognos MDX 形式で埋め込まれます。[プレゼンテーション ビュー].[売上概要].[売上]
編集: 以下で要求されているように、フォルダー パスを含むクエリを次に示します。
-- List of Reports, the folder they are in, and the package they are using
select distinct temp2.name as package,temp1.folder,temp1.name from
(SELECT temp.PARENTNAME AS FOLDER,CMOBJECTS.PCMID,CMOBJNAMES.CMID, CMOBJNAMES.LOCALEID, CMOBJNAMES.MAPDLOCALEID, CMOBJNAMES.ISDEFAULT, CMOBJNAMES.NAME,
CMOBJECTS.CLASSID
FROM CMOBJNAMES INNER JOIN
CMOBJECTS ON CMOBJNAMES.CMID = CMOBJECTS.CMID
INNER JOIN
(SELECT P.CMID AS PARENT,P.NAME AS PARENTNAME FROM CMOBJNAMES P where P.LOCALEID between 24 and 52) temp
ON CMOBJECTS.PCMID = TEMP.PARENT
WHERE (CMOBJECTS.CLASSID = 10)
AND SUBSTR(TEMP.PARENTNAME,1,1) NOT IN ('1','2','3','4','5','6','7','8','9') AND
TEMP.PARENTNAME NOT LIKE 'Backup%') temp1
inner join
(SELECT CMREFNOORD1.CMID AS PID, CMREFNOORD1.REFCMID, CMOBJNAMES.NAME
FROM CMREFNOORD1 INNER JOIN
CMOBJECTS ON CMREFNOORD1.REFCMID = CMOBJECTS.CMID INNER JOIN
CMOBJNAMES ON CMOBJECTS.CMID = CMOBJNAMES.CMID
WHERE (CMREFNOORD1.PROPID = 31 AND CMOBJNAMES.LOCALEID between 24 and 52)) temp2
on temp1.cmid = temp2.pid and LOCALEID between 24 and 52;
これが誰かの役に立つかどうかはわかりませんが、私たちのバージョンには CMOBJNAMES_BASE という名前のテーブルがありません。
これは私のために働くものです:
select ob2.cmid, c.name as classname, n.name as objectname, o.DELIVOPTIONS as deliveryoptions, z2.name as owner
from CMOBJPROPS2 p
inner join CMOBJPROPS26 o on p.cmid=o.cmid
inner join CMOBJECTS ob on ob.cmid=o.cmid
inner join CMOBJECTS ob2 on ob.pcmid=ob2.cmid
inner join CMOBJNAMES n on n.cmid=ob2.cmid
inner join CMCLASSES c on ob2.classid=c.classid
left join CMREFNOORD2 z1 on z1.cmid = p.cmid
left join CMOBJPROPS33 z2 on z2.CMID = z1.REFCMID
where ACTIVE = 1 order by z2.name, objectName