Quantcast
Channel: SCN : Discussion List - SAP HANA Developer Center
Viewing all articles
Browse latest Browse all 6412

Scripted calculation view - cursors, arrays - need to optimization

$
0
0

Dear all,

 

I am struggling with the following request while working on a scripted calculation view based on an ADSO (seen as a Calculation View in Hana Modeler) and a customized table. The required output should look like this:

 

Here is the customized table: ZTESTLMI

 

Here is the ADSO: Z_BWOH

 

 

So, basically the customized table explains which rows from the ADSO should be taken in account.

ZKF_ID and ZCOMP act like a "primary key" for the final output.

To translate the customized table, let's take as an example KF001 and company code 1000; this means that we should collect from the adso only the rows that respect the conditions from ZTESTLMI table: 4Z_BWOH_AUGDT = ‘’ and 4Z_BWOH_BSCHL in (01,50) and 4Z_BWOH_STATUSPS != ‘C’

 

I tried to obtain the required output in two ways:

- scripted calculation view using cursors - it takes 90 minutes for 10000 rows in the adso

- scripted calculation view using arrays instead of cursor - it takes 20 minutes for the same amount of data, the final result returns 372 rows

 

Is there any way to optimize my code? Or any other idea to implement this request?

Here is my script, using arrays:

 

/********* Begin Procedure Script ************/

BEGIN

 

DECLARE SW INTEGER;

DECLARE SW1 INTEGER;

 

DECLARE VAR1 VARCHAR(10);

DECLARE VAR2 VARCHAR(4);

 

DECLARE ARRAYZF NVARCHAR(30) ARRAY;

DECLARE BUFFER_COUNT INTEGER;

 

 

DECLARE ARRAY0 VARCHAR(7) ARRAY;

DECLARE ARRAY1 VARCHAR(10) ARRAY;

DECLARE ARRAY2 VARCHAR(4) ARRAY;

DECLARE ARRAY3 DECIMAL(13,2) ARRAY;

 

 

DECLARE ZAR_ZKEY NVARCHAR(10) ARRAY;

DECLARE ZAR_ZKF NVARCHAR(10) ARRAY;

DECLARE ZAR_ZCOMP NVARCHAR(4) ARRAY;

DECLARE ZAR_ZTFIELD NVARCHAR(30) ARRAY;

DECLARE ZAR_ZSIGN NVARCHAR(1) ARRAY;

DECLARE ZAR_ZOPTION NVARCHAR(2) ARRAY;

DECLARE ZAR_ZLOW NVARCHAR(10) ARRAY;

DECLARE ZAR_ZHIGH NVARCHAR(10) ARRAY;

DECLARE ZAR_ZCOMFIELD NVARCHAR(30) ARRAY;

 

DECLARE COUNTER INTEGER;

DECLARE COUNTC3 INTEGER;

DECLARE COUNTC1 INTEGER;

DECLARE COUNTC2 INTEGER;

 

 

 

DECLARE AR_BURKS NVARCHAR(4) ARRAY;

DECLARE AR_FISCPER NVARCHAR(7) ARRAY;

DECLARE AR_BELNR NVARCHAR(10) ARRAY;

DECLARE AR_DMSO3 DECIMAL(13,2) ARRAY;

DECLARE AR_BSCHL NVARCHAR(2) ARRAY;

DECLARE AR_AUGDT NVARCHAR(8) ARRAY;

DECLARE AR_STATUSPS NVARCHAR(1) ARRAY;

DECLARE AR_PROJK NVARCHAR(8) ARRAY;

DECLARE AR_FISCVAR NVARCHAR(2) ARRAY;

 

DECLARE AR_ZKF NVARCHAR(10) ARRAY;

DECLARE AR_ZCOMP NVARCHAR(4) ARRAY;

 

  VARR = SELECT ZKEY "ZKEY", ZKF_ID "ZKF_ID", ZCOMP "ZCOMP", ZTAR_FIELD "ZTAR_FIELD",

         ZOPTION "ZOPTION", ZSIGN "ZSIGN", ZLOW "ZLOW", ZHIGH "ZHIGH", ZCOM_FIELD "ZCOM_FIELD"

         FROM "SAPHBW"."ZTESTLMI";

        

--VAR_ZKEY = ARRAY_AGG(:VARR."ZKEY");

ZAR_ZKF = ARRAY_AGG(:VARR."ZKF_ID");

ZAR_ZCOMP = ARRAY_AGG(:VARR."ZCOMP");

ZAR_ZTFIELD = ARRAY_AGG(:VARR."ZTAR_FIELD");

ZAR_ZSIGN = ARRAY_AGG(:VARR."ZSIGN");

ZAR_ZOPTION = ARRAY_AGG(:VARR."ZOPTION");

ZAR_ZLOW = ARRAY_AGG(:VARR."ZLOW");

ZAR_ZHIGH = ARRAY_AGG(:VARR."ZHIGH");

   

  VARI = SELECT DISTINCT ZKF_ID "ZKF_ID", ZCOMP "ZCOMP" FROM "SAPHBW"."ZTESTLMI" ;

  AR_ZKF = ARRAY_AGG(:VARI."ZKF_ID");

  AR_ZCOMP = ARRAY_AGG(:VARI."ZCOMP");

 

VARIABILA = SELECT

     "4Z_BWOH_AUGBL",

     "4Z_BWOH_AUGDT",

     "4Z_BWOH_BELNR",

     "4Z_BWOH_BSCHL",

     "4Z_BWOH_BUDAT",

     "4Z_BWOH_BURKS",

     "4Z_BWOH_FISCPER",

     "4Z_BWOH_FISCVAR",

     "4Z_BWOH_PROJK",

     "4Z_BWOH_STATUSPS",

     "4Z_BWOH_DMSO3" FROM "MIHAIL"."lmi_view";

--lmi_view is a view created on the ADSO Z_BWOH (I got a strange behavior while applying sql queries directly on it so I had to create an intermediate view)

 

AR_BURKS = ARRAY_AGG(:VARIABILA."4Z_BWOH_BURKS");

AR_FISCPER = ARRAY_AGG(:VARIABILA."4Z_BWOH_FISCPER");

AR_BELNR = ARRAY_AGG(:VARIABILA."4Z_BWOH_BELNR");

AR_DMSO3 = ARRAY_AGG(:VARIABILA."4Z_BWOH_DMSO3");

AR_AUGDT = ARRAY_AGG(:VARIABILA."4Z_BWOH_AUGDT");

AR_PROJK = ARRAY_AGG(:VARIABILA."4Z_BWOH_PROJK");

AR_STATUSPS = ARRAY_AGG(:VARIABILA."4Z_BWOH_STATUSPS");

AR_FISCVAR = ARRAY_AGG(:VARIABILA."4Z_BWOH_FISCVAR");

AR_BSCHL = ARRAY_AGG(:VARIABILA."4Z_BWOH_BSCHL");

 

 

COUNTER := 0;

 

FOR COUNTC1 IN 1..CARDINALITY(:AR_ZKF) DO

 

   VAR1 := :AR_ZKF[:COUNTC1];

   VAR2 := :AR_ZCOMP[:COUNTC1];

 

   VARIAB = SELECT DISTINCT ZTAR_FIELD as "ZTAR_FIELD" FROM "SAPHBW"."ZTESTLMI" WHERE ZKF_ID=:VAR1 AND ZCOMP=:VAR2 ;

   ARRAYZF = ARRAY_AGG(:VARIAB."ZTAR_FIELD");

 

   FOR COUNTC3 IN 1..CARDINALITY(:AR_BURKS) DO

    IF (:AR_ZCOMP[:COUNTC1]=:AR_BURKS[:COUNTC3]) THEN

    SW1 := 1; 

    FOR BUFFER_COUNT IN 1..CARDINALITY(:ARRAYZF) DO

     SW := 0;

     FOR COUNTC2 IN 1..CARDINALITY(:ZAR_ZKF) DO 

       IF (:ZAR_ZKF[:COUNTC2]=:AR_ZKF[:COUNTC1] AND :ZAR_ZCOMP[:COUNTC2]=:AR_ZCOMP[:COUNTC1]) THEN

         IF (:ARRAYZF[:BUFFER_COUNT]=:ZAR_ZTFIELD[:COUNTC2] AND :ARRAYZF[:BUFFER_COUNT]='4Z_BWOH_BSCHL' AND

            ((:AR_BSCHL[:COUNTC3]=:ZAR_ZLOW[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='I' AND :ZAR_ZOPTION[:COUNTC2]='EQ')

            OR (:AR_BSCHL[:COUNTC3]<>:ZAR_ZLOW[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='E' AND :ZAR_ZOPTION[:COUNTC2]='EQ')

             OR (:AR_BSCHL[:COUNTC3]>=:ZAR_ZLOW[:COUNTC2] AND :AR_BSCHL[:COUNTC3]<=:ZAR_ZHIGH[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='I' AND :ZAR_ZOPTION[:COUNTC2]='BT')

             ))

             OR

             (:ARRAYZF[:BUFFER_COUNT]=:ZAR_ZTFIELD[:COUNTC2] AND :ARRAYZF[:BUFFER_COUNT]='4Z_BWOH_AUGDT' AND

            ((:AR_AUGDT[:COUNTC3]=:ZAR_ZLOW[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='I' AND :ZAR_ZOPTION[:COUNTC2]='EQ')

            OR (:AR_AUGDT[:COUNTC3]<>:ZAR_ZLOW[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='E' AND :ZAR_ZOPTION[:COUNTC2]='EQ')

             OR (:AR_AUGDT[:COUNTC3]>=:ZAR_ZLOW[:COUNTC2] AND :AR_AUGDT[:COUNTC3]<=:ZAR_ZHIGH[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='I' AND :ZAR_ZOPTION[:COUNTC2]='BT')

             ))

             OR

             (:ARRAYZF[:BUFFER_COUNT]=:ZAR_ZTFIELD[:COUNTC2] AND :ARRAYZF[:BUFFER_COUNT]='4Z_BWOH_STATUSPS' AND

            ((:AR_STATUSPS[:COUNTC3]=:ZAR_ZLOW[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='I' AND :ZAR_ZOPTION[:COUNTC2]='EQ')

            OR (:AR_STATUSPS[:COUNTC3]<>:ZAR_ZLOW[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='E' AND :ZAR_ZOPTION[:COUNTC2]='EQ')

             OR (:AR_STATUSPS[:COUNTC3]>=:ZAR_ZLOW[:COUNTC2] AND :AR_STATUSPS[:COUNTC3]<=:ZAR_ZHIGH[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='I' AND :ZAR_ZOPTION[:COUNTC2]='BT')

             ))

             OR

             (:ARRAYZF[:BUFFER_COUNT]=:ZAR_ZTFIELD[:COUNTC2] AND :ARRAYZF[:BUFFER_COUNT]='4Z_BWOH_FISCPER' AND

            ((:AR_FISCPER[:COUNTC3]=:ZAR_ZLOW[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='I' AND :ZAR_ZOPTION[:COUNTC2]='EQ')

            OR (:AR_FISCPER[:COUNTC3]<>:ZAR_ZLOW[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='E' AND :ZAR_ZOPTION[:COUNTC2]='EQ')

             OR (:AR_FISCPER[:COUNTC3]>=:ZAR_ZLOW[:COUNTC2] AND :AR_FISCPER[:COUNTC3]<=:ZAR_ZHIGH[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='I' AND :ZAR_ZOPTION[:COUNTC2]='BT')

             ))

             OR

             (:ARRAYZF[:BUFFER_COUNT]=:ZAR_ZTFIELD[:COUNTC2] AND :ARRAYZF[:BUFFER_COUNT]='4Z_BWOH_FISCVAR' AND

            ((:AR_FISCVAR[:COUNTC3]=:ZAR_ZLOW[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='I' AND :ZAR_ZOPTION[:COUNTC2]='EQ')

            OR (:AR_FISCVAR[:COUNTC3]<>:ZAR_ZLOW[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='E' AND :ZAR_ZOPTION[:COUNTC2]='EQ')

             OR (:AR_FISCVAR[:COUNTC3]>=:ZAR_ZLOW[:COUNTC2] AND :AR_FISCVAR[:COUNTC3]<=:ZAR_ZHIGH[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='I' AND :ZAR_ZOPTION[:COUNTC2]='BT')

             ))

             OR

             (:ARRAYZF[:BUFFER_COUNT]=:ZAR_ZTFIELD[:COUNTC2] AND :ARRAYZF[:BUFFER_COUNT]='4Z_BWOH_PROJK' AND

            ((:AR_PROJK[:COUNTC3]=:ZAR_ZLOW[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='I' AND :ZAR_ZOPTION[:COUNTC2]='EQ')

            OR (:AR_PROJK[:COUNTC3]<>:ZAR_ZLOW[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='E' AND :ZAR_ZOPTION[:COUNTC2]='EQ')

             OR (:AR_PROJK[:COUNTC3]>=:ZAR_ZLOW[:COUNTC2] AND :AR_PROJK[:COUNTC3]<=:ZAR_ZHIGH[:COUNTC2] AND :ZAR_ZSIGN[:COUNTC2]='I' AND :ZAR_ZOPTION[:COUNTC2]='BT')

             ))

--I will add the same conditions for all the field in the adso, in case that the customized table will be changed and new fields will be added

         THEN

         SW := 1;     

          END IF;

       END IF;

     END FOR;

       IF (:SW!= 1) THEN

       SW1 := 0;  

       END IF;

     END FOR;

     IF :SW1 = 1 THEN

     COUNTER := :COUNTER + 1;

     ARRAY0[:COUNTER] := :AR_FISCPER[:COUNTC3];

     ARRAY1[:COUNTER] := :AR_ZKF[:COUNTC1];

     ARRAY2[:COUNTER] := :AR_BURKS[:COUNTC3];

     ARRAY3[:COUNTER] := :AR_DMSO3[:COUNTC3];

    

     END IF;

     END IF;

    END FOR;

END FOR;

 

   var_out = UNNEST(:ARRAY0,:ARRAY1,:ARRAY2,:ARRAY3) as ("FISCPER","ZKF","COMP","DEBIT");

 

END /********* End Procedure Script ************/

 

 

Thanks a lot for your proposals,

Luminita


Viewing all articles
Browse latest Browse all 6412

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>