Presentation is loading. Please wait.

Presentation is loading. Please wait.

NEVUG - August 2004 To Boldly Go: Using Perl and the Perl DBI as an Adjunct to MS Access for Custom Reports Maggie Rioux MBLWHOI Library Woods Hole, Mass.

Similar presentations


Presentation on theme: "NEVUG - August 2004 To Boldly Go: Using Perl and the Perl DBI as an Adjunct to MS Access for Custom Reports Maggie Rioux MBLWHOI Library Woods Hole, Mass."— Presentation transcript:

1 NEVUG - August 2004 To Boldly Go: Using Perl and the Perl DBI as an Adjunct to MS Access for Custom Reports Maggie Rioux MBLWHOI Library Woods Hole, Mass.

2 NEVUG - August 2004 Using Perl and the Perl DBI as an Adjunct to MS Access for Custom Reports

3 NEVUG - August 2004 What is the Perl DBI An add-on Perl module You already have it as part of the standard Voyager install Lets you write a Perl program that talks to the Oracle tables just like MS Access does from your PC Then you can use all the power of Perl to play with the results

4 NEVUG - August 2004 How to Use the Perl DBI Develop your query using MS Access Translate the Access SQL into Oracle SQL Interfacing the Perl with Oracle is all in the book: Programming the Perl DBI Automate running the program using cron

5 NEVUG - August 2004 And now some examples:

6 NEVUG - August 2004 Active Holds/Recalls: The Access Report

7 NEVUG - August 2004 Active Holds/Recalls: The Access SQL SELECT [LAST_NAME]+", "+[FIRST_NAME] AS Name, WHOIDB_BIB_TEXT.TITLE, WHOIDB_MFHD_MASTER.DISPLAY_CALL_NO, WHOIDB_ITEM_BARCODE.ITEM_BARCODE, WHOIDB_HOLD_RECALL.HOLD_RECALL_TYPE, WHOIDB_HOLD_RECALL.CREATE_DATE, WHOIDB_PATRON_ADDRESS.ADDRESS_LINE1 FROM ((WHOIDB_ITEM_BARCODE INNER JOIN ((WHOIDB_BIB_MFHD INNER JOIN (WHOIDB_MFHD_ITEM INNER JOIN ((WHOIDB_HOLD_RECALL INNER JOIN WHOIDB_HOLD_RECALL_ITEMS ON WHOIDB_HOLD_RECALL.HOLD_RECALL_ID = WHOIDB_HOLD_RECALL_ITEMS.HOLD_RECALL_ID) INNER JOIN WHOIDB_PATRON ON WHOIDB_HOLD_RECALL.PATRON_ID = WHOIDB_PATRON.PATRON_ID) ON WHOIDB_MFHD_ITEM.ITEM_ID = WHOIDB_HOLD_RECALL_ITEMS.ITEM_ID) ON WHOIDB_BIB_MFHD.MFHD_ID = WHOIDB_MFHD_ITEM.MFHD_ID) INNER JOIN WHOIDB_BIB_TEXT ON WHOIDB_BIB_MFHD.BIB_ID = WHOIDB_BIB_TEXT.BIB_ID) ON WHOIDB_ITEM_BARCODE.ITEM_ID = WHOIDB_HOLD_RECALL_ITEMS.ITEM_ID) INNER JOIN WHOIDB_MFHD_MASTER ON WHOIDB_MFHD_ITEM.MFHD_ID = WHOIDB_MFHD_MASTER.MFHD_ID) INNER JOIN WHOIDB_PATRON_ADDRESS ON WHOIDB_PATRON.PATRON_ID = WHOIDB_PATRON_ADDRESS.PATRON_ID WHERE (((WHOIDB_ITEM_BARCODE.BARCODE_STATUS)="1") AND ((WHOIDB_HOLD_RECALL_ITEMS.HOLD_RECALL_STATUS)="1") AND ((WHOIDB_PATRON_ADDRESS.ADDRESS_TYPE)="3")) ORDER BY [LAST_NAME]+", "+[FIRST_NAME];

8 NEVUG - August 2004 Active Holds/Recalls: The Perl DBI/Oracle SQL $SQL = "SELECT WHOIDB.PATRON.LAST_NAME, WHOIDB.PATRON.FIRST_NAME, WHOIDB.BIB_TEXT.TITLE, WHOIDB.MFHD_MASTER.DISPLAY_CALL_NO, WHOIDB.ITEM_BARCODE.ITEM_BARCODE, WHOIDB.HOLD_RECALL.HOLD_RECALL_TYPE, WHOIDB.HOLD_RECALL.CREATE_DATE, WHOIDB.PATRON_ADDRESS.ADDRESS_LINE1 FROM WHOIDB.ITEM_BARCODE, WHOIDB.BIB_MFHD, WHOIDB.MFHD_ITEM, WHOIDB.HOLD_RECALL, WHOIDB.HOLD_RECALL_ITEMS, WHOIDB.BIB_TEXT, WHOIDB.MFHD_MASTER, WHOIDB.PATRON_ADDRESS, WHOIDB.PATRON …….

9 NEVUG - August 2004 Active Holds/Recalls: The Perl DBI/Oracle SQL …… WHERE WHOIDB.HOLD_RECALL.HOLD_RECALL_ID = WHOIDB.HOLD_RECALL_ITEMS.HOLD_RECALL_ID AND WHOIDB.HOLD_RECALL.PATRON_ID = WHOIDB.PATRON.PATRON_ID AND WHOIDB.MFHD_ITEM.ITEM_ID = WHOIDB.HOLD_RECALL_ITEMS.ITEM_ID AND WHOIDB.BIB_MFHD.MFHD_ID = WHOIDB.MFHD_ITEM.MFHD_ID AND WHOIDB.BIB_MFHD.BIB_ID = WHOIDB.BIB_TEXT.BIB_ID AND WHOIDB.ITEM_BARCODE.ITEM_ID = WHOIDB.HOLD_RECALL_ITEMS.ITEM_ID AND WHOIDB.MFHD_ITEM.MFHD_ID = WHOIDB.MFHD_MASTER.MFHD_ID AND WHOIDB.PATRON.PATRON_ID = WHOIDB.PATRON_ADDRESS.PATRON_ID AND WHOIDB.ITEM_BARCODE.BARCODE_STATUS = '1' AND WHOIDB.HOLD_RECALL_ITEMS.HOLD_RECALL_STATUS = '1' AND WHOIDB.PATRON_ADDRESS.ADDRESS_TYPE = '3' ORDER BY WHOIDB.PATRON.LAST_NAME, WHOIDB.PATRON.FIRST_NAME";

10 NEVUG - August 2004 Active Holds/Recalls: The Meat of the Perl DBI Code First set this important variable Connect to the database Set $SQL = the SQL you “fixed” #set environment variable $ENV{ORACLE_HOME} = "/oracle/app/oracle/product/8.0.5"; # connect to whoidb $dbh = DBI->connect( "dbi:Oracle:LIBR", “xxxread", “Cxxx" ) || die "Can't cconnect to Oracle database: $DBI:errstr\n" $SQL = "SELECT … ";

11 NEVUG - August 2004 Active Holds/Recalls: The Meat of the Perl DBI Code “Prepare” and execute Deal with each returned line as an element in an array Disconnect from the database when done $sth = $dbh->prepare($SQL); $sth->execute(); while ( @row = $sth->fetchrow_array ) { … # disconnect from database & close output file $dbh->disconnect || warn "Disconnection failed: $DBI:errstr\n";

12 NEVUG - August 2004 Active Holds/Recalls: Perl Program Output

13 NEVUG - August 2004 Patrons Leaving with Books Out: Output of the Access Query

14 NEVUG - August 2004 Patrons Leaving with Books Out: The Access SQL SELECT DISTINCTROW WHOIDB_PATRON.LAST_NAME AS [Last Name], WHOIDB_PATRON.FIRST_NAME AS [First Name], WHOIDB_PATRON.CURRENT_CHARGES AS [Books Out], WHOIDB_PATRON.EXPIRE_DATE AS Leaving, WHOIDB_PATRON_ADDRESS.ADDRESS_LINE1 AS [Address Info] FROM WHOIDB_PATRON INNER JOIN WHOIDB_PATRON_ADDRESS ON WHOIDB_PATRON.PATRON_ID = WHOIDB_PATRON_ADDRESS.PATRON_ID WHERE (((WHOIDB_PATRON.CURRENT_CHARGES)>"0") AND ((WHOIDB_PATRON.EXPIRE_DATE)<DateAdd("d",1,[Enter criterion date:])) AND ((WHOIDB_PATRON_ADDRESS.ADDRESS_TYPE)="1")) ORDER BY WHOIDB_PATRON.EXPIRE_DATE, WHOIDB_PATRON.LAST_NAME, WHOIDB_PATRON.FIRST_NAME;

15 NEVUG - August 2004 Patrons Leaving with Books Out: Editing the Access SQL Step 1 - Separate lines, change all WHOIDB_ to WHOIDB., take out the field labels (AS […]) SELECT DISTINCTROW WHOIDB.PATRON.LAST_NAME, WHOIDB.PATRON.FIRST_NAME, WHOIDB.PATRON.CURRENT_CHARGES, WHOIDB.PATRON.EXPIRE_DATE, WHOIDB.PATRON_ADDRESS.ADDRESS_LINE1, FROM WHOIDB.PATRON INNER JOIN WHOIDB_PATRON_ADDRESS ON WHOIDB.PATRON.PATRON_ID = WHOIDB.PATRON_ADDRESS.PATRON_ID WHERE (((WHOIDB.PATRON.CURRENT_CHARGES)>"0") AND ((WHOIDB.PATRON.EXPIRE_DATE)<DateAdd("d",1,[Enter criterion date:])) AND ((WHOIDB.PATRON_ADDRESS.ADDRESS_TYPE)="1")) ORDER BY WHOIDB.PATRON.EXPIRE_DATE, WHOIDB.PATRON.LAST_NAME, WHOIDB.PATRON.FIRST_NAME;

16 NEVUG - August 2004 Patrons Leaving with Books Out: Editing the Access SQL Step 2 - Change DISTINCTROW to DISTINCT or possibly UNIQUE, but probably not necessary in this case since there’s an address type used Step 3 - Change the joins to regular SQL format

17 NEVUG - August 2004 Patrons Leaving with Books Out: Editing the Access SQL SELECT WHOIDB.PATRON.FIRST_NAME, WHOIDB.PATRON.CURRENT_CHARGES, WHOIDB.PATRON.EXPIRE_DATE, WHOIDB.PATRON_ADDRESS.ADDRESS_LINE1 FROM WHOIDB.PATRON, WHOIDB.PATRON_ADDRESS WHERE WHOIDB.PATRON.PATRON_ID = WHOIDB.PATRON_ADDRESS.PATRON_ID AND WHOIDB.PATRON.CURRENT_CHARGES > ’0’ AND WHOIDB.PATRON.EXPIRE_DATE < $cutoffdate AND WHOIDB.PATRON_ADDRESS.ADDRESS_TYPE = ‘1’ ORDER BY WHOIDB.PATRON.EXPIRE_DATE, WHOIDB.PATRON.LAST_NAME, WHOIDB.PATRON.FIRST_NAME;

18 NEVUG - August 2004 Patrons Leaving with Books Out: The Final Perl DBI SQL Put this into a proper SQL statement = to a variable & also change $cutoffdate to something that actually works $SQL = “SELECT WHOIDB.PATRON.FIRST_NAME, WHOIDB.PATRON.CURRENT_CHARGES, WHOIDB.PATRON.EXPIRE_DATE, WHOIDB.PATRON_ADDRESS.ADDRESS_LINE1 FROM WHOIDB.PATRON, WHOIDB.PATRON_ADDRESS WHERE WHOIDB.PATRON.PATRON_ID = WHOIDB.PATRON_ADDRESS.PATRON_ID AND WHOIDB.PATRON.CURRENT_CHARGES > ’0’ AND WHOIDB.PATRON.EXPIRE_DATE < SYSDATE + $days_to_add AND WHOIDB.PATRON_ADDRESS.ADDRESS_TYPE = ‘1’ ORDER BY WHOIDB.PATRON.EXPIRE_DATE, WHOIDB.PATRON.LAST_NAME, WHOIDB.PATRON.FIRST_NAME”;

19 NEVUG - August 2004 Patrons Leaving with Books Out: Output of the Perl Program


Download ppt "NEVUG - August 2004 To Boldly Go: Using Perl and the Perl DBI as an Adjunct to MS Access for Custom Reports Maggie Rioux MBLWHOI Library Woods Hole, Mass."

Similar presentations


Ads by Google