SQL Queries - CAST Knowledge Base - Queries on metrics and diagnostics - How to run DETAIL and TOTAL procedures manually

Purpose of Query

This page explains how to execute the DETAIL and TOTAL procedures manually against the KB (i.e. execute them out of snapshot's generation process) to identify the objects that are involved in a Quality Rule computation.

Applicable in CAST Version
Release
Yes/No
8.3.x(tick)
8.2.x(tick)
Query for CSS

Get the DETAIL and TOTAL procedure

Follow SQL Queries - CAST Knowledge Base - Queries on metrics and diagnostics - How to get DETAIL and TOTAL procedures

Note: All the procedure's scripts are available under CAST installation folder in the InstallScript\<RDBMS>\DIAG or \InstallScripts\<RDBMS>\DSS\4_u - CAST_LOCAL_DSS_PACKAGE.SQL

Clean the Procedure script

Here to explain the process we have taken an example quality rule - ABAP: Avoid using "SELECT DISTINCT", use DELETE-ADJACENT with Metric_ID=7594


Example - DIAG_ABAP_ANA_ARTIF_T_TOTAL

CREATE OR REPLACE FUNCTION DIAG_ABAP_ANA_ARTIF_T_TOTAL
                                                        (
                                                                I_SNAPSHOT_ID IN                                              INT,
                                                                               - the metric SNAPSHOT id I_METRIC_PARENT_ID IN INT,
                                                                               - the metric parent id I_METRIC_ID IN          INT,
                                                                               - the metric id I_METRIC_VALUE_INDEX IN        INT
                                                        )
        RETURN INT
IS
        ERRORCODE INT := 0;
BEGIN
        --<<NAME>>DIAG_ABAP_ANA_ARTIF_T_TOTAL<</NAME>>*/
        --<<COMMENT>> Template name = DSSGENERICTOTAL. <</COMMENT>>
        --<<COMMENT>> Definition = Number of ABAP Artifacts with OpenSQL queries. <</COMMENT>>
        INSERT
        INTO   DSS_METRIC_RESULTS
               (
                      METRIC_NUM_VALUE  ,
                      METRIC_OBJECT_ID  ,
                      OBJECT_ID         ,
                      METRIC_ID         ,
                      METRIC_VALUE_INDEX,
                      SNAPSHOT_ID
               )
        SELECT   COUNT( T1.OBJECT_ID),
                 0                   ,
                 SC.OBJECT_PARENT_ID ,
                 I_METRIC_ID         ,
                 I_METRIC_VALUE_INDEX,
                 I_SNAPSHOT_ID
        FROM     ObjInf T2          ,
                 DSSAPP_ARTIFACTS T1,
                 DSSAPP_MODULES MO  ,
                 DSS_METRIC_SCOPES SC
        WHERE    SC.SNAPSHOT_ID      = I_SNAPSHOT_ID
        AND      SC.METRIC_PARENT_ID = I_METRIC_PARENT_ID
        AND      SC.METRIC_ID        = I_METRIC_ID
        AND      SC.COMPUTE_VALUE    = 0
        AND      MO.TECHNO_TYPE      = -15 - Technologic ABAP object
        AND      MO.MODULE_ID        = SC.OBJECT_ID
        AND      T1.APPLICATION_ID   = SC.OBJECT_ID
        AND      NOT EXISTS
                 ( SELECT 1
                 FROM    DSS_OBJECT_EXCEPTIONS E
                 WHERE   E.METRIC_ID = I_METRIC_ID
                 AND     E.OBJECT_ID = T1.OBJECT_ID
                 )
                 - OPEN SQL
        AND      T1.OBJECT_ID = T2.IdObj
        AND      T2.InfTyp    = 9
        AND      T2.InfSubTyp = 1538
        AND      T2.InfVal    > 0
        GROUP BY SC.OBJECT_PARENT_ID,
                 SC.OBJECT_ID ;
        
        RETURN ERRORCODE;
END DIAG_ABAP_ANA_ARTIF_T_TOTAL;

Remove the header and the footer and only keep the SELECT statement

You will have as result the following:

SELECT   COUNT( T1.OBJECT_ID),
         0                   ,
         SC.OBJECT_PARENT_ID ,
         I_METRIC_ID         ,
         I_METRIC_VALUE_INDEX,
         I_SNAPSHOT_ID
FROM     ObjInf T2          ,
         DSSAPP_ARTIFACTS T1,
         DSSAPP_MODULES MO  ,
         DSS_METRIC_SCOPES SC
WHERE    SC.SNAPSHOT_ID      = I_SNAPSHOT_ID
AND      SC.METRIC_PARENT_ID = I_METRIC_PARENT_ID
AND      SC.METRIC_ID        = I_METRIC_ID
AND      SC.COMPUTE_VALUE    = 0
AND      MO.TECHNO_TYPE      = -15 - Technologic ABAP object
AND      MO.MODULE_ID        = SC.OBJECT_ID
AND      T1.APPLICATION_ID   = SC.OBJECT_ID
AND      NOT EXISTS
         ( SELECT 1
         FROM    DSS_OBJECT_EXCEPTIONS E
         WHERE   E.METRIC_ID = I_METRIC_ID
         AND     E.OBJECT_ID = T1.OBJECT_ID
         )
         - OPEN SQL
AND      T1.OBJECT_ID = T2.IdObj
AND      T2.InfTyp    = 9
AND      T2.InfSubTyp = 1538
AND      T2.InfVal    > 0
GROUP BY SC.OBJECT_PARENT_ID,
         SC.OBJECT_ID

Remove the exceptions in the Select Statement

Remove the select clause for thr table DSS_OBJECT_EXCEPTIONS. As result of this removal, you will have the following: 

SELECT   COUNT( T1.OBJECT_ID),
         0                   ,
         SC.OBJECT_PARENT_ID ,
         I_METRIC_ID         ,
         I_METRIC_VALUE_INDEX,
         I_SNAPSHOT_ID
FROM     ObjInf T2          ,
         DSSAPP_ARTIFACTS T1,
         DSSAPP_MODULES MO  ,
         DSS_METRIC_SCOPES SC
WHERE    SC.SNAPSHOT_ID      = I_SNAPSHOT_ID
AND      SC.METRIC_PARENT_ID = I_METRIC_PARENT_ID
AND      SC.METRIC_ID        = I_METRIC_ID
AND      SC.COMPUTE_VALUE    = 0
AND      MO.TECHNO_TYPE      = -15 - Technologic ABAP object
AND      MO.MODULE_ID        = SC.OBJECT_IDAnd T1.APPLICATION_ID = SC.OBJECT_ID-- Open SQL
AND      T1.OBJECT_ID        = T2.IdObj
AND      T2.InfTyp           = 9
AND      T2.InfSubTyp        = 1538
AND      T2.InfVal           > 0
GROUP BY SC.OBJECT_PARENT_ID,
         SC.OBJECT_ID

Remove all the sections refering to procedure parameter

Remove all the sections refering to procedure parameter starting with I_ and only keep the count column and substitute the value of Metric ID for the condition SC.METRIC_ID =

SELECT   COUNT( T1.OBJECT_ID)
FROM     ObjInf T2          ,
         DSSAPP_ARTIFACTS T1,
         DSSAPP_MODULES MO  ,
         DSS_METRIC_SCOPES SC
WHERE    SC.METRIC_ID   = 7594 
AND	SC.COMPUTE_VALUE = 0
AND      MO.TECHNO_TYPE = -15 - Technologic ABAP object
AND      MO.MODULE_ID   = SC.OBJECT_ID And T1.APPLICATION_ID = SC.OBJECT_ID-- Open SQL
AND      T1.OBJECT_ID   = T2.IdObj
AND      T2.InfTyp      = 9
AND      T2.InfSubTyp   = 1538
AND      T2.InfVal      > 0
GROUP BY SC.OBJECT_PARENT_ID,
         SC.OBJECT_ID

Remove the GROUP BY clause

Remove the GROUP BY clause if exists

SELECT COUNT( T1.OBJECT_ID)
FROM   ObjInf T2          ,
       DSSAPP_ARTIFACTS T1,
       DSSAPP_MODULES MO  ,
       DSS_METRIC_SCOPES SC
WHERE  SC.METRIC_ID   =7594
AND	SC.COMPUTE_VALUE = 0
AND    MO.TECHNO_TYPE = -15 - Technologic ABAP object
AND    MO.MODULE_ID   = SC.OBJECT_ID And T1.APPLICATION_ID = SC.OBJECT_ID-- Open SQL
AND    T1.OBJECT_ID   = T2.IdObj
AND    T2.InfTyp      = 9
AND    T2.InfSubTyp   = 1538
AND    T2.InfVal      > 0

Remove SC.COMPUTE_VALUE = 0

Below is the SQL Query which can be executed. It will return the results on Application Level

Select
Count( T1.OBJECT_ID)
From
ObjInf T2 , DSSAPP_ARTIFACTS T1, DSSAPP_MODULES MO, DSS_METRIC_SCOPES SC
Where
WHERE  SC.METRIC_ID   =7594
MO.TECHNO_TYPE = -15 - Technologic ABAP object
And MO.MODULE_ID = SC.OBJECT_ID And T1.APPLICATION_ID = SC.OBJECT_ID-- Open SQL
and T1.OBJECT_ID = T2.IdObj
and T2.InfTyp = 9
and T2.InfSubTyp = 1538
and T2.InfVal > 0

Populate the working tables

If the procedure contains tables that begin with WK then Populate the working tables using the page - SQL Queries - CAST Knowledge Base - Queries on metrics and diagnostics - How to populate the working tables present in DETAIL and TOTAL procedure

Run the Cleaned Procedure

select all the objects from KEYS table and add a constraint on IdKey.

 SELECT k.*
FROM   ObjInf T2           ,
       DSSAPP_ARTIFACTS T1 ,
       DSSAPP_MODULES MO   ,
       DSS_METRIC_SCOPES SC,
       Keys k
WHERE  SC.METRIC_ID      = 7594
AND    MO.TECHNO_TYPE    = -15 -- Technologic ABAP object
AND    MO.MODULE_ID      = SC.OBJECT_ID
AND    T1.APPLICATION_ID = SC.OBJECT_ID
       -- Open SQL
AND    T1.OBJECT_ID = T2.IdObj
AND    T2.InfTyp    = 9
AND    T2.InfSubTyp = 1538
AND    T2.InfVal    > 0
AND    T1.OBJECT_ID = k.IdKey