Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Join us in Bucharest on Sept 18th for Qlik's AI Reality Tour! Register Now
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Incremental load - scripting problems

Hi!

I have som problem writing my script that should be used for incremental load of data. As always when using incremental load I just want to load the posts that is new by looking at the field called CREATE_TIMESTAMP.

The problem is that i have to tables that i want to perform incremental load on, lets call it table1 and table2, in an Oracle database. It works fine when i am loading only from table1, only the new posts is loaded in to my qvd-file each time. When this is done i just want to load the data in table2 that is connected to the loaded posts in table1 since the other data already should be loaded. Here's the catch, the CREATE_TIMESTAMP is only in table1 and table2 is associated with table1 with an key (table1.ID = table2.ID2). I ONLY want to load the posts from table2 that is associated via the key on the loaded posts in table1.

Hope you understand my problem.

Thank you.

Hannes

1 Solution

Accepted Solutions
Not applicable
Author

          select TABLE_NAME from SYS.ALL_TABLES

           WHERE TABLESPACE_NAME=USERS  AND OWNER=OWNER_NAME;

          

Left Join

          SELECT A.TABLE_NAME  , B.COLUMN_NAME 

          from all_constraints A ,

          all_cons_columns B

          WHERE A.CONSTRAINT_TYPE ='P' AND  A.CONSTRAINT_NAME = B.CONSTRAINT_NAME

          ORDER BY A.TABLE_NAME;

This quarry Return Pk for all table and that pk is used in script.

View solution in original post

9 Replies
shantanu73
Creator II
Creator II

Hello Hannesse,

I am not so very clear. If u provide me the script I may understand. And then I may provide you the solution.

Thank

Shantanu

Not applicable
Author

shantanu73, heres the script:

/* Setup for incremental load. */

SET vQvdFile='File.qvd';

SET vPKID='ID1';

// Set a variable indicating if the QVD exists or not. -1 is True, 0 is False

LET vQvdExists = if(FileSize('$(vQvdFile)') > 0, -1, 0);

IF $(vQvdExists) THEN                    // QVD exists, we will do an incremental reload

          maxdateTab:

          // Get the max date from this QVD for use in incremental SELECT

          LOAD max(CREATE_TIMESTAMP) as maxdate

          FROM $(vQvdFile) (qvd);

  LET vIncrementalExpression = 'WHERE CREATE_TIMESTAMP >= ' & chr(39) & timestamp(peek('maxdate')) & chr(39);

          DROP table maxdateTab;

 

ELSE                                                            // QVD does not exist

          LET vIncrementalExpression = '';           // No QVD. Force full reload

END IF

ODBC CONNECT TO [database;DBQ=DATABASE ] (XUserId is XXXXX, XPassword is YYYY);

Table1:

SQL SELECT BIRTHDATE,

    "FIRST_NAME",

    GENDER,

    "CREATE_TIMESTAMP",

    ID as "ID1",                                        //Primary Key

    "LAST_NAME",

    "WORK_TITLE",

FROM PROD.TABLE1; 

//Heres the problem, i only want to load the posts that is associated with the newly loaded posts from table1

//Maybe i need to store old posts from table2 in another qvd-file as well and concatenate the new posts to that?

Table2:

SQL SELECT "DATE",

    "RESULT",

    ID2,

    ID1 as "Table2_ID"    //NOTE THAT ID2 is the field that should be associated with ID1 in table1

FROM PROD.TABLE2;

/*

Update the QVD with changes.

*/

Directory;

IF $(vQvdExists) THEN

          // Use CONCATENATE in case we've added any new fields.

          CONCATENATE (Table1) LOAD * FROM $(vQvdFile) (qvd)

          WHERE NOT exists($(vPKID))          // Load only QVD rows that were not already loaded in the data load.

          ;

END IF

//Overwrite the QVD with the QV datatable. 

STORE Table1 INTO $(vQvdFile);

THANKS!

/Hannes

shantanu73
Creator II
Creator II

Hello Hannes,

Sorry of Late Answer,

Check the following Script. If you get some idea.

//Start from Here:

Let ThisExecTime = ReloadTime();

QV_Table:
SQL SELECT PrimaryKey, X, Y FROM DB_TABLE
WHERE ModificationTime >= #$(LastExecTime)#
       AND ModificationTime < #$(ThisExecTime)#;

Concatenate LOAD PrimaryKey, X, Y FROM File.QVD
WHERE NOT EXISTS(PrimaryKey);

Inner Join SQL SELECT PrimaryKey FROM DB_TABLE;

If ScriptErrorCount = 0 then
STORE QV_Table INTO File.QVD;
Let LastExecTime = ThisExecTime;
End If

//End from Here:

Regards

Shantanu

Not applicable
Author

Thank you Shantanu, after some modification it works fine!

Aanother problem: I want to count how many times the PrimaryKey occurs in the table. Problem is that one post in table1 can be connected to several posts in table2, but still, i only want to count it once. If I do count(PrimaryKey) it returns to many!

Thank you in advance!

Hannes

Not applicable
Author

Hi Hannes,

Maybe you can do this.

table1:

Load *,

PrimaryKey as pKey

From xxx

Then count the number of pKey in table 1 should give you the correct count.

Regards,

Xue Bin

Not applicable
Author

You Chek this One.


Table_Name:

                              LOAD *;

                              SQL  SELECT  * FROM Table_Name

                                        where TO_CHAR(to_DATE($(vModificationTime),'YYYY/MM/DD HH24:MI:SS'),'YYYYMMDDHH24MISS')>='$(T)';

 

                              Concatenate ([Table_Name])

Table_Name:

                              LOAD * from Table_Name .qvd (qvd)

                              WHERE NOT Exists ($(Y));

 

                              inner join ([Table_Name])

 

 

                              sql select Pk  FROM Table_Name;

          ENDIF

 

                    store Table_Name into Table_Name.qvd ;

 

//..............................................................................................//

 

                    LET T= (DATE(NOW(),'YYYYMMDD')  & ((hour(NOW()))*10000)  + (MINUTE(NOW())*100)  + SECOND(NOW()));

Not applicable
Author

adityatiwari, that looks pretty much the same as my script. It still returns to many of PrimaryKey...

Hannes

Not applicable
Author

          select TABLE_NAME from SYS.ALL_TABLES

           WHERE TABLESPACE_NAME=USERS  AND OWNER=OWNER_NAME;

          

Left Join

          SELECT A.TABLE_NAME  , B.COLUMN_NAME 

          from all_constraints A ,

          all_cons_columns B

          WHERE A.CONSTRAINT_TYPE ='P' AND  A.CONSTRAINT_NAME = B.CONSTRAINT_NAME

          ORDER BY A.TABLE_NAME;

This quarry Return Pk for all table and that pk is used in script.

Not applicable
Author

Thank you, I think i solved it!

/Hannes