2016-12-10 21 views
0

Ist es möglich, das in Cognos-Abfragen verwendete SQL anzuzeigen?Wie erhält man eine Abfragedefinition von Cognos?

z.B. Um die XML-Definition eines Bericht erhalten Sie die folgenden SQL verwenden können (kopiert von https://stackoverflow.com/a/24335760/361842):

SELECT  CMOBJNAMES.NAME AS ObjName 
, CMOBJECTS.PCMID 
, CMCLASSES.NAME AS ClassName 
, cast(CMOBJPROPS7.spec as xml) ReportDefinition 
FROM  CMOBJECTS 
INNER JOIN  CMOBJNAMES ON CMOBJECTS.CMID = CMOBJNAMES.CMID 
INNER JOIN  CMCLASSES  ON CMOBJECTS.CLASSID = CMCLASSES.CLASSID 
LEFT OUTER JOIN CMOBJPROPS7  ON CMOBJECTS.CMID = CMOBJPROPS7.CMID 
WHERE  CMOBJECTS.CLASSID IN (10, 37) 
ORDER BY CMOBJECTS.PCMID; 

... und von diesem XML können Sie oft sqltext Elemente geben den zugrunde liegenden SQL finden. Wo jedoch vorhandene Abfragen verwendet werden, ist es schwer zu erkennen, woher diese Daten stammen.

Ich möchte das Äquivalent des obigen SQL, um Abfragedefinitionen zu finden; obwohl es bisher keine solche Kolumne gab.

Fehlt das, gibt es eine Möglichkeit, diese Definition über die Benutzeroberfläche zu finden? Ich schaute unter Query Studio und fand die lineage der Abfrage, die einige Informationen über die Abfrage-Spalten gibt, aber die Quelle der Daten nicht klar macht.

NB: Nach Abfrage Ich beziehe mich auf jene wie R5BZDDAN_GRAPH in dem unten stehenden Screenshot von Query Studio:

Cognos Queries

..., die in einer Art und Weise in einem Cognos Report bezeichnet würde eine solche wie:

<query name="Q_DEMO"> 
    <source> 
    <model/> 
    </source> 
    <selection autoSummary="false"> 
    <dataItem aggregate="none" name="REG_REG" rollupAggregate="none"> 
     <expression>[AdvRepData].[Q_R5BZDDAN_GRAPH].[REG_REG]</expression> 
    </dataItem> 
    <dataItem aggregate="none" name="REG_ORG" rollupAggregate="none"> 
     <expression>[AdvRepData].[Q_R5BZDDAN_GRAPH].[REG_ORG]</expression> 
    </dataItem> 
    <!-- ... --> 

UPDATE

Zum Wohle der anderen, hier ist eine geänderte Version des obigen Code für Bericht definitons zurückziehen:

;with recurse 
as (

    select Objects.CMID Id, ObjectClasses.Name Class, ObjectNames.NAME Name 
    , cast('CognosObjects' as nvarchar(max)) ObjectPath 
    from CMOBJECTS Objects 
    inner join CMOBJNAMES ObjectNames 
     on ObjectNames.CMID = Objects.CMID 
     and ObjectNames.IsDefault = 1 --only get 1 result per object (could filter on language=English (LocaleId=24/select LocaleId from CMLOCALES where Locale = 'en')) 
    inner join CMCLASSES ObjectClasses on ObjectClasses.CLASSID = Objects.CLASSID 
    where Objects.PCMID = objects.CMID --cleaner than selecting on root since not language sensitive 
    --where ObjectClasses.NAME = 'root' 

    union all 

    select Objects.CMID Id, ObjectClasses.Name Class, ObjectNames.NAME Name 
    , r.ObjectPath + '\' + ObjectNames.NAME ObjectPath --I use a backslash rather than forward slash as using this to build a windows path 
    from recurse r 
    inner join CMOBJECTS Objects 
     on objects.PCMID = r.Id 
     and Objects.PCMID != objects.CMID --prevent ouroboros 
    inner join CMOBJNAMES ObjectNames 
     on ObjectNames.CMID = Objects.CMID 
     and ObjectNames.IsDefault = 1 --only get 1 result per object (could filter on language=English (LocaleId=24/select LocaleId from CMLOCALES where Locale = 'en')) 
    inner join CMCLASSES ObjectClasses 
     on ObjectClasses.CLASSID = Objects.CLASSID 

) 
select * 
from recurse 
where Class in ('report','query') 
order by ObjectPath 
+0

Alle Abfragedefinitionen für einen Bericht in dem Bericht XML sind, wenn das, was Sie ist bedeuten. Was genau meinen Sie mit "Abfragedefinitionen" und "vorhandenen Abfragen"? Meinst du Abfrageabkürzungen in Berichten, SQL-Quelle in Berichten? Wenn es im Bericht ist, dann ist es in der XML. Der schwierigste Teil ist, wenn ein Bericht von Abfragesubjekten in einem Paket erstellt wird - das unter Verwendung der Berichtsdefinition für das Paket ausgewertet werden muss und nirgendwo gespeichert wird –

+0

Danke @NickMcDermaid. Ich habe jetzt einen Screenshot hinzugefügt, um meine Frage zu klären. Ich bin vertraut mit wird verwendet, um SQL-Anweisungen direkt in Berichte einzubetten; aber in diesem Fall hoffe ich, die vordefinierten Abfragen zu verstehen; Ich nehme an, dass Sie 'Query Subjects' nennen; obwohl ich mit der Cognos-Terminologie nicht vertraut genug bin. Danke noch einmal. – JohnLBevan

Antwort

1

Terminologie:

  • Abfragesubjekt eine Tabelle
  • Abfrageelement angesehen werden kann kann eine Spalte

Für Ihr Beispiel betrachtet werden die SQL Macht wird im Abfragesubjekt R5BZDDAN_GRAPH definiert, das wiederum im Framework Manager-Modell definiert wird. Das Framework-Manager-Modell wird in einer Datei .cpf definiert, die überhaupt nicht im Content Store vorhanden ist. (Es ist jedoch eine XML-Datei). Diese Datei wird in Cognos veröffentlicht, um Pakete zu erstellen.

Es gibt auch eine im Cache gespeicherte Version der Frameworks Manager-Datei auf dem tatsächlichen cognos Server (.cqe Datei), obwohl es in der Regel nicht empfohlen, auf diesen

verläßt ich sage, dass Ihr SQL könnte definiert werden. Wenn das Abfragesubjekt ein SQL Abfragesubjekt ist, dann ist dies der Punkt, an dem es definiert ist. Wenn das Abfragesubjekt ein Modell Abfragesubjekt ist, dann ist es nur eine Liste von Abfrageelementen von anderen Abfragesubjekten. Diese können von vielen anderen Abfragesubjekten stammen, die dann in Framework Manager definierte Joins haben.So gibt es keine tatsächlichen SQL dort definiert - es zur Laufzeit generiert wird

Ich bin nicht sicher von Ihrer Seite Anforderung, aber es gibt drei weitere Möglichkeiten, SQL zu erhalten:

  • In Report Studio können Sie " Show generierten SQL‘auf jede Abfrage
  • In Framework Manager Sie eine oder mehrere Abfragesubjekten auswählen und anzeigen SQL erzeugt
  • Sie können ein Monitoring-Tool auf Ihrer Datenbank verwenden, um zu sehen, was SQL
  • vorgelegt wird

Wenn Sie nur wissen möchten, wie Zahlen in Ihrem Bericht generiert werden, ist die direkteste Lösung die Überwachung Ihrer Datenbank.

schließlich bedenken, dass in einigen seltenen Fällen SQL definiert in Framework Manager könnte durch die Art und Weise verändert werden, der Bericht geschrieben wird

+0

Danke Nick; fantastische Antwort. FYI: In Bezug auf meine Anforderung ging es hauptsächlich darum, zu verstehen, wie die Dinge in Cognos zusammenpassen. Dies wurde dadurch ausgelöst, dass ich zuvor einen Bericht für unser Unternehmen optimiert hatte, nachdem er in der 'sqltext' -Definition einige schlecht geschriebene sql entdeckt hatte und dann angeboten hatte, den Bericht eines Community-Mitglieds zu optimieren, unter der Annahme, dass es gleich aussehen würde bei der Verwendung von Abfragen, für die ich das SQL nicht finden konnte. – JohnLBevan

+0

ps. Die oben erwähnte Community ist ein sicheres Forum; Falls jemand Zugang hat und interessiert ist, ist dieser Thread hier: https://community.inforxtreme.com/infor-eam-7-ee-be-product-group/f/infor-eam-7i-ee-be-product -group --- Diskussion/8187/work-order-print-performance – JohnLBevan

+1

Danke für die Klärung. Viel Glück bei Ihren Bemühungen –

Verwandte Themen