Upload
alan-manifold
View
96
Download
4
Tags:
Embed Size (px)
DESCRIPTION
This presentation was given at the Getty Research Library and other locations through the years to sites that had already had Alan Manifold's Using Microsoft Access for Reporting from Voyager workshop. There is some overlap between the two, but this one goes into more depth on some special techniques that help create more complex reports and queries.
Citation preview
The ART of Voyager Accessdvanced
eporting
echniques
Getty Research Institute Library
14 February 2002
Alan ManifoldSystems Implementation
ManagerPurdue University [email protected]
TheART
ofVoyager Access
VOYAGER
SQL
BLOB PROGRAMMING
ACCESSWE’LL BE COVERING LOTS OF TOPICS. WATCH FOR THESE ICONS TO HELP YOU FOLLOW WHAT WE’RE FOCUSING ON.
TheART
ofVoyager Access
WHAT’S IN IT FOR ME?
EACH MODULEHASITSOWNTABLES.
WE’LLLOOK ATEACH INTURN.
TheART
ofVoyager Access
ACQUISITIONS
ACQUISITIONS IN VOYAGER IS COMPLEX
LET’S DO SOME EXPLORING!
TheART
ofVoyager Access
SERIALS CHECK-IN
LINE_ITEM
PO STUFF
PO_ID
COMPONENT
SUBSCRIPTIONLINE_ITEM_ID
COMPONENT_PATTERN
PATTERN
ISSUES_RECEIVED
SERIAL_ISSUES
UNPREDICTABLE_ISSUES
COMPONENT_ID ISSUE_ID
ISSUE_ID
SUBSCRIPTION_ID
COMPONENT_ID
PATTERN_ID
TheART
ofVoyager Access
PURCHASE ORDER LINKS
PURCHASE_ORDER
LINE_ITEM
PO_ID
PO_NOTESPO_STATUS
PO_TYPE
PO_STATUS
PO_TYPEPO_ID
BIB TABLES
BIB_ID
LINE_ITEM_FUNDS
LINE_ITEM_COPY_STATUS
LINE_ITEM_COPYLINE_ITEM_ID
LINE_ITEM_ID
COPY_ID FUNDLEDGER_ID
FUND_ID
TheART
ofVoyager Access
INVOICES
INVOICE
INVOICE_NOTEINVOICE_STATUS
INVOICE_STATUS INVOICE_ID
INVOICE_ID
INVOICE_LINE_ITEM
LINE ITEM TABLES
LINE_ITEM_ID
INVOICE_LINE_ITEM_FUNDS
INV_LINE_ITEM_ID
FUNDLEDGER_ID
FUND_ID
TheART
ofVoyager Access
APPLICATION 1
FOR EACH FUND, LIST THE FUND NAME AND EACH PO TYPE THAT APPLIES TO IT.
USE THE INVOICE_LINE_ITEM_FUNDS TABLE TO DETERMINE THE FUNDS USED. LINK THE INVOICE LINE ITEMS TO THE APPROPRIATE PURCHASE ORDERS AND DETERMINE THE PO_TYPE_DESC OF EACH SUCH ORDER. GROUP BY ALL FIELDS OR INDICATE UNIQUE VALUES.
TheART
ofVoyager Access
THE RIGHT STUFFLINE_ITEM_FUNDS
funds assigned to PO line items in “Copies/Funds”box (amounts in foreign currency)
PO_FUNDSfunds assigned to PO line items, plus funds for PO adjustments until invoice is approved (base currency)
LINE_ITEM_COPYfunds assigned to line item copies on the PO (no amounts)
FUND_PAYMENTfunds used for prepayments and invoice adjustments
(foreign)INVOICE_LINE_ITEM_FUNDS
funds assigned or used for invoice line items (foreign)INVOICE_FUNDS
funds assigned or used for invoice line items, plus funds for invoice adjustments, after approval (base)
TheART
ofVoyager Access
EXPRESSIONS
AN EXPRESSION, OR CALCULATED FIELD, USES MULTIPLE FIELD VALUES TOGETHER OR USES FUNCTIONS TO CREATE NEW VALUES.
X + YÖW
ABS(ALLOCATION-EXPENDITURE)RO
UN
D(N
)UCASE(NAME)
I - (K * L)
TheART
ofVoyager Access
FUNCTIONS TRANSFORM DATA
GROCERYLIST
GROCERIES
EGGS
QUICHE
TO END UP WITHQUICHE, YOU START WITH A GROCERY LIST AND TRANSFORM IT STEP BY STEP
TheART
ofVoyager Access
FUZZY MATH
QUICHE = BAKE(EGGS,4)
EGGS = UNPACK(GROCERIES,“EGGS”)
GROCERIES = SHOP(GROCERY LIST)
( , 4)
( ,“EGGS”)
( )
QUICHE = BAKE(UNPACK(SHOP(GROCERY LIST),“EGGS”),4)
=
=
=
SHORTHAND METHOD:
TRANS: GO TO THE GROCERY AND BUY THE THINGS ON THE LIST.
TRANS: UNPACK THE GROCERIES AND FIND
THE EGGS.
TRANS: BAKE FOUR OF THE EGGS (AND SOME OTHER STUFF) INTO A QUICHE.
TheART
ofVoyager Access
CREATING EXPRESSIONSACCESS PROVIDES AN EXPRESSION BUILDER
THE BEST THING ABOUT IT IS THAT IT GIVES YOU A LIST OF THE FUNCTIONS THAT ARE BUILT INTO ACCESS.
ONCE YOU KNOW THE FUNCTIONS, YOU CAN TYPE THEM DIRECTLY.
TheART
ofVoyager Access
EXPRESSIONS IN QUERIES
EXPRESSIONS GO WHERE YOU WOULD OTHERWISE PUT A FIELD
IF YOU DON’T SUPPLY A LABEL, IT WILL BE “Expr1”
TheART
ofVoyager Access
AS CRITERIA, TOO
YOU CAN ALSO USE EXPRESSIONS IN CRITERIA
ZOOM! ZOOM!
PUT YOUR CURSOR HERE AND PRESS SHIFT-F2
WHEN YOU NEED TO ENTER OR EDIT COMPLEX EXPRESSIONS, THE ZOOM FEATURE OF ACCESS IS VERYHANDY.
TheART
ofVoyager Access
ALSO IN REPORTSYOU CAN USE AN EXPRESSION AS THE VALUE OF A TEXT BOX IN AN ACCESS REPORT.
TheART
ofVoyager Access
SOME FUNCTIONSCCur Convert to currency CCur(AMOUNT)
CCur(5396/100) = $53.96Val Numeric value of text Val(MFHD_COUNT)
Val(“13”) = 13UCase Convert to upper case UCase(LAST_NAME)
UCase(“Getty Library”) = “GETTY LIBRARY”Mid Part of text Mid(CALLNUM,5,2)
Mid(“004.12 A324d”,5,2) = “12”Left Left part of text Left(CALLNUM,3)
Left(“004.12 A324d”,3) = “004”Date Current date Date()
Date() = #2/14/2002#InStr Find a substring Instr(LOC,”refe”)
Instr(“ugrl,refe”,“refe”) = 6DateAdd Date math DateAdd(“m”,1,[Start of Month])
DateAdd(“yyyy”,-1,Date()) = #2/14/2001#
TheART
ofVoyager Access
APPLICATION 2PREDICT THE RESULTS OF THE FOLLOWING FUNCTION CALLS. TO CHECK YOURSELF, YOU CAN PUT THEM INTO THE QUERY SHOWN (IN PLACE OF THE CCur() CALL.Date()CCur(16.89)CCur(“12705”/100)Val(“2002”)Val(“341.23 H23p”)UCase(“101 Dalmations”)LCase(“The C++ Programming Language”)Mid(“821027s1974 nyu 00010 engm”,13,3)Mid(“PR4253.23 H551n”,3,7)Instr(“Jefferson on democracy”,“on”)Instr(“Working : people talk about what they do all day”, “:”) + 2
Mid(“0 v.34”, 3)Left(“ugrl,refe”,4)Right(“ugrl,refe”,4)DateAdd(“q”,1,Date())
TheART
ofVoyager Access
SQUARE BRACKETS, ETC.SEVERAL DIFFERENT KINDS OF THINGS CAN BE FOUND INSIDE SQUARE BRACKETS. TABLE NAMES, FIELD NAMES AND PROMPTS CAN ALL BE THERE.
IF A FIELD HAS NO SPACES, YOU DON’T NEED SQUARE BRACKETS, BUT ACCESS SOMETIMES PUTS THEM THERE, ANYWAY
PATRON_ID[AMOUNT]
[PO Number]BIB_MFHD.MFHD_ID
[BIB_MFHD.MFHD_ID][BIB_MFHD].[MFHD_ID]
WHEN YOU NEED TO SPECIFY WHICH TABLE A FIELD COMES FROM, YOU PUT A DOT BETWEEN THE TABLE NAME AND FIELD NAME. BRACKETS ARE OPTIONAL.
[Start Date:][Days overdue?][Location code]
IF AN ACCESS QUERY OR REPORT DOESN’T RECOGNIZE WHAT IS IN THE SQUARE BRACKETS AS A FIELD NAME, IT PROMPTS FOR A VALUE. THIS IS HOW PROMPTING FOR CRITERIA WORKS. IF IT PROMPTS YOU FOR THE VALUE OF A FIELD, IT MEANS IT ISN’T IN YOUR QUERY.
TheART
ofVoyager Access
BASE CURRENCY CONVERSION
BASE CURRENCY CONVERSION (FOR DOLLARS AND OTHER 100-BASED CURRENCIES):
AMT: CCur([AMOUNT]/100)
MORE GENERALLY, INCLUDE THE BASE_CURRENCY TABLE IN YOUR QUERY AND USE:
AMT: CCur([AMOUNT]/10^[BASE_DECIMALS])
TheART
ofVoyager Access
FOREIGN CURRENCIESAMT: CCur(([LINE_PRICE] / ([CONVERSION_RATE] / 100000)) /10 ^ [BASE_DECIMALS])
THIS SHOWS THE CURRENCY USED
TheART
ofVoyager Access
APPLICATION 3FOR EACH LINE ITEM THAT USES A FOREIGN CURRENCY, SHOW THE VALUE OF THE LINE_PRICE FIELD CALCULATED BY THE CURRENT CONVERSION RATE FOR THAT CURRENCY.
THE CURRENT CONVERSION RATE FOR A CURRENCY CAN BE FOUND IN THE CURRENCY_CONVERSION TABLE. YOU’LL NEED TO LINK TO THIS TABLE USING THE CURRENCY_CODE FIELD (IN THE PURCHASE_ORDER TABLE). THE CONVERSION RATE ASSUMES FIVE DIGITS AFTER THE DECIMAL. YOU CAN ASSUME THAT THE BASE CURRENCY IS USD. ROUND THE AMOUNT TO THECLOSEST CENT (USE THE Round() FUNCTION).
TheART
ofVoyager Access
CONDITIONALS
SOMETIMES YOU WANT YOUR RESULTS TO VARY, BASED ON SOME CRITERION. THIS IS CALLED A CONDITIONAL. IN A TYPICAL PROGRAMMING LANGUAGE, THIS LOOKS SOMETHING LIKE THIS:
if (sun is up) then“day”;
else“night”;
if (name = “GARFIELD”) thentype = cat;
else if (name = “ODIE”) thentype = dog;
elsetype = human;
OR:
TheART
ofVoyager Access
IMMEDIATE IF (IIf)THERE IS NO PROGRAM STRUCTURE IN SQL, BUT THE IIf() OR “IMMEDIATE IF” FUNCTION ALLOWS FOR CONDITIONALS.
IIf (expr, truepart, falsepart)
If the expression, “expr” turns out to be true, the value of IIf is “truepart”. If the expression is not true, the value of IIf is “falsepart”.
if (expr) thentruepart;
elsefalsepart;
TheART
ofVoyager Access
IIf EXAMPLESPREZ: IIf (Katherine Harris is Republican,
George W. Bush, Al Gore)
IIf(InStr([LINE_ITEM_NOTES].[NOTE],“xn!”)<>0, Mid([LINE_ITEM_NOTES].[NOTE], InStr([LINE_ITEM_NOTES].[NOTE], “xn!”)), “”)
IIf(Mid(ISSN,5,1)=“-”,Mid(ISSN,1,4) & Mid(ISSN,6,4),ISSN)
IIf([BIB_FORMAT] Like “*s”,Mid([FIELD_008],19,1),“ ”)
IIf(ADDRESS_LINE1 Is Not Null,ADDRESS_LINE1,“”)
TheART
ofVoyager Access
IIf() IN ACTIONWE WANT THE PHONE NUMBER ASSOCIATED WITH EACH PATRON’S PERMANENT ADDRESS. A PHONE NUMBER IS NOT REQUIRED, HOWEVER, SO WE HAVE TO USE AN OUTER JOIN, THEN WE USE AN IIf() FUNCTION TO PUT “NO PHONE” IF THERE IS NO PHONE NUMBER.
PH: IIf([PHONE_NUMBER] Is Null,“NO PHONE”,[PHONE_NUMBER])
TheART
ofVoyager Access
APPLICATION 4CHANGE THE PREVIOUS EXERCISE SO IT WORKS FOR ALL LINE ITEMS, WHETHERIN THE BASE CURRENCY OR IN AFOREIGN CURRENCY.
THIS IS PRETTY TRICKY. IF YOU DO A NORMAL LINK TO THE CURRENCY_CONVERSION TABLE, YOU WILL LOSE ALL LINE ITEMS IN THE BASE CURRENCY, BECAUSE ITS CURRENCY_CODE IS NOT IN THE CURRENCY_CONVERSION TABLE. SO, YOU’LL NEED TO CHANGE THE JOIN PROPERTIES TO RETAIN ALL LINE ITEMS. THEN YOU’LL HAVE TO USE THE IIf() FUNCTION TO CONVERT ONLY THOSE LINE ITEMS THAT ARE NOT IN THE BASE CURRENCY AND TO RETURN THE RAW FIELD FOR THOSE IN THE BASE CURRENCY.
TheART
ofVoyager Access
CATALOGING
YOU CAN’T REALLY SEPARATE THE CATALOGING MODULE FROM THE OTHERS, BUT THERE ARE SOME INTERESTING TABLES
TheART
ofVoyager Access
LEFT-ANCHORED INDEXES
LEFT-ANCHORED INDEXES ARE STORED IN THE BIB_INDEX AND AUTH_INDEX TABLES. OY! SUCH A GOOD SOURCE OF DATA, YOU WOULDN’T BELIEVE!
TheART
ofVoyager Access
HEADINGS
HEADINGS ARE EXTRACTED FROM BOTH BIB AND AUTH RECORDS INTO THE HEADING TABLE
TheART
ofVoyager Access
APPLICATION 5
FIND THE AUTHOR, TITLE AND ALL SUBJECT HEADINGS FOR EACH RECORD WHOSE BIB_ID IS LESS THAN 100. PUT THEM IN ORDER BY AUTHOR, THEN BY TITLE.
THERE ARE AT LEAST TWO GOOD WAYS TO GO ABOUT THIS. YOU CAN USE THE BIB_INDEX TABLE TO LOOK FOR ALL HEADINGS FROM A “6XX” FIELD OR YOU CAN USE THE BIB_HEADINGS TABLE TO LINK TO THE HEADINGS TABLE AND FIND ALL HEADINGS WITH AN INDEX_CODE FIELD OF “S”.
TheART
ofVoyager Access
BLOB FIELDS
SOME FIELDS ARE NOT PART OF ANY OF THE “BROKEN OUT” TABLES, BUT MIGHT BE USEFUL FOR A QUERY. IN THAT CASE, YOU HAVE TO GET THEM FROM ONE OF THE BLOBS.
TheART
ofVoyager Access
ADDING BLOB FIELDS
AS WITH OTHER EXPRESSIONS, YOU ADD THE BLOB FUNCTIONS INTO THE FIELD LINE OF A QUERY
TheART
ofVoyager Access
GETFIELDALL RESULTS
SO, IF WE “GOT” “ALL”, WHERE ARE THESE?FOR THE ANSWER, WE GO TO “REPORTS”
TheART
ofVoyager Access
REPORTING GETFIELDALL
WITH NO INTERVENTION, THIS IS HOW THAT RECORD’S INFORMATION WOULD APPEAR IN A REPORT.
TheART
ofVoyager Access
PERMIT GROWTH
SET “CAN GROW” FOR THE HOLD TEXT BOX
TheART
ofVoyager Access
AND VOILA!
A TEXT BOX SET FOR “CAN GROW” WILL EXPAND (VERTICALLY) TO WHATEVER SIZE IS REQUIRED TO SHOW ALL OF THE DATA FOR ITS FIELD
TheART
ofVoyager Access
SPEAKING OF PROPERTIES
WHEN FINE-TUNING A REPORT, CHANGING A REPORT’S, SECTION’S OR CONTROL’S PROPERTIES DIRECTLY GIVES YOU NEARLY ABSOLUTE CONTROL OVER THE RESULTS.
TheART
ofVoyager Access
APPLICATION 6CREATE A QUERY THAT GETS THE BIB_ID AND ALL NOTES (5XX) FIELDS FROM RECORDS WITH BIB_ID LESS THAN 500. THEN CREATE A REPORT BASED ON THIS QUERY THAT SHOWS ALL THE RESULTS.
TO GET ALL 5XX FIELDS, USE GetFieldAll WITH A SECOND PARAMETER OF “5”. THAT WILL MATCH ANY FIELD THAT STARTS WITH A “5”--IN OTHER WORDS, ALL 5XX FIELDS. IN THE REPORT, YOU’LL NEED TO MANUALLY CHANGE THE NOTES TEXT BOX TO SET THE “CAN GROW” PROPERTY. TRY THE REPORT WITH AND WITHOUT THAT SET AND SEE THE DIFFERENCE.
TheART
ofVoyager Access
CIRCULATION
CIRCULATION IS OFTEN THE FIRST TARGET FOR AD HOC REPORTING, SINCE THE SYSTEM PROVIDES ONLY A FEW OF THE STATISTICS THAT MOST LIBRARIES WANT.
UNFORTUNATELY, CIRCULATION ISN’T AS SIMPLE AS YOU MIGHT HOPE.
TheART
ofVoyager Access
CIRCULATIONBIB_TEXT
MFHD_MASTER
ITEM
BIB_MFHD
MFHD_ITEM
CIRC_TRANSACTIONS(and RENEW_TRANSACTIONS)
CIRC_TRANS_ARCHIVE(and RENEW_TRANS_ARCHIVE)
PATRON
PATRON_BARCODE
ITEM_TYPE
ITEM_BARCODE
ITEM_STATUS
ITEM_STATS
PATRON_GROUPLOCATION
ITEM_STAT_CODE
ITEM_STATUS_TYPE
COURSERESERVES
STUFF
HOLDS/RECALLS
FINES & FEES PATRON_STATS
SHORT LOANS
CALL SLIPS
MEDIA
PATRON_STAT_CODE
PROXY_PATRON
AL
MO
ST
AS
CO
MP
LE
X
AS
AC
QU
ISIT
ION
S
TheART
ofVoyager Access
HOLDS AND RECALLS
PATRON
PATRON_ID
HOLD_RECALL
HOLD_RECALL_ITEMS ITEM
BIB_ITEM
BIB_TEXT
HOLD_RECALL_ARCHIVE
HOLD_RECALL_ITEMS
HOLD_RECALL_ID
ITEM_ID
ITEM_ID
BIB_ID
BIB_ID
HOLD_RECALL_ID
THE ONLY THING HERE THAT IS NOT FAIRLY OBVIOUS IS THAT HOLDS AND RECALLS CAN BE PLACED AT THE COPY (ITEM) OR TITLE (BIB) LEVEL.
HOLD_RECALL_TYPEH=HOLD, R=RECALLREQUEST_LEVELT=TITLE, C=COPY
TheART
ofVoyager Access
COURSE RESERVESITEMS GO ON RESERVE BY PUTTING THEM ON A LIST AND SETTING THE ON_RESERVE FIELD, BUT SEARCHING IS BY COURSE INFORMATION, WHICH IS LINKED TO THE RESERVE_LIST_COURSES TABLE.
RESERVE_LIST_COURSES
RESERVE_LIST_ID
INSTRUCTOR
RESERVE_LIST_ITEMS
RESERVE_LIST
COURSE
DEPARTMENT
CLASS_SECTION
RESERVE_LIST_EITEMSITEM
EITEM
EITEM_ID
ITEM_ID
COURSE_ID
INSTRUCTOR_ID
DEPARTMENT_ID
SECTION_ID
TheART
ofVoyager Access
APPLICATION 7
FIND THE TITLES OF ALL ITEMS ON RESERVE FOR ANY COURSES TAUGHT BY INSTRUCTOR, MICHELE ARMS.
YOU’LL WANT TO LOOK AT THE INSTRUCTOR FILE TO SEE HOW THE INFORMATION THERE IS LAID OUT SO YOU CAN SET YOUR CRITERIA CORRECTLY. THEN YOU’LL HAVE TO CONSTRUCT A BRIDGE BETWEEN THE INSTRUCTOR TABLE AND WHEREVER YOU’RE GOING TO GET THE TITLE (HOW ABOUT BIB_TEXT?).
TheART
ofVoyager Access
FULL CIRC HISTORY
ITEM CIRC_TRANSACTIONS PATRON
TO GET FULL CIRCULATION HISTORY, YOU HAVE TO GO TO AT LEAST FOUR TABLES. WHILE AN ITEM IS CHECKED OUT, THE TABLES LOOK LIKE THIS:
RENEW_TRANSACTIONS
ITEM_ID PATRON_ID
CIRC_TRANSACTION_ID
AFTER THE ITEM IS CHECKED BACK IN, THE TABLES LOOK LIKE THIS:
ITEM CIRC_TRANS_ARCHIVE PATRON
RENEW_TRANS_ARCHIVE
ITEM_ID
ONLY IF “RETAIN PATRON ID FOR CIRC HISTORY”PATRON_ID
CIRC_TRANSACTION_ID
PATRON_STAT_CODE
PATRON_STATS
CIRC_TRANSACTION_STATS
PATRON_STAT_CODE
CIRC_TRANSACTION_ID
LOTS MORE
LOTS MORE
LOTS MORE
LOTS MORE
TheART
ofVoyager Access
FULL CIRC HISTORY 2TO GET CHARGE-ONLY STATS FOR ITEMS THAT HAVE BEEN RETURNED, YOU MIGHT DO:
TheART
ofVoyager Access
FULL CIRC HISTORY 3TO GET RENEWAL STATS FOR ITEMS THAT HAVE BEEN RETURNED, YOU MIGHT DO:
TheART
ofVoyager Access
FULL CIRC HISTORY 4TO GET THESE TOGETHER, YOU HAVE TO USE A UNION QUERY. A UNION QUERY TAKES TWO TABLES WITH THE SAME FIELDS AND MAKES ONE LONGER TABLE OUT OF THEM:
SELECT LOCATION_CODE, PATRON_GROUP_CODE, CHARGE_DATE AS TRANS_DATEFROM (PATRON_GROUP INNER JOIN CIRC_TRANS_ARCHIVE ON PATRON_GROUP.PATRON_GROUP_ID = CIRC_TRANS_ARCHIVE.PATRON_GROUP_ID) INNER JOIN LOCATION ON CIRC_TRANS_ARCHIVE.CHARGE_LOCATION = LOCATION.LOCATION_IDUNION SELECT LOCATION_CODE, PATRON_GROUP_CODE, RENEW_DATE AS TRANS_DATEFROM ((RENEW_TRANS_ARCHIVE INNER JOIN CIRC_TRANS_ARCHIVE ON RENEW_TRANS_ARCHIVE.CIRC_TRANSACTION_ID = CIRC_TRANS_ARCHIVE.CIRC_TRANSACTION_ID) INNER JOIN PATRON_GROUP ON CIRC_TRANS_ARCHIVE.PATRON_GROUP_ID = PATRON_GROUP.PATRON_GROUP_ID) INNER JOIN LOCATION ON RENEW_TRANS_ARCHIVE.RENEW_LOCATION = LOCATION.LOCATION_ID;
IN ACCESS, UNION QUERIES ARE SQL-ONLY QUERIES, SO LET’S LEARN SOME SQL!
TheART
ofVoyager Access
ACCESS SQL VIEW
TheART
ofVoyager Access
READING SQL
SELECTLOCATION_CODE, PATRON_GROUP_CODE,CHARGE_DATE AS TRANS_DATE
FROM(PATRON_GROUP
INNER JOINCIRC_TRANS_ARCHIVE
ON PATRON_GROUP.PATRON_GROUP_ID =CIRC_TRANS_ARCHIVE.PATRON_GROUP_ID)
INNER JOINLOCATION
ON CIRC_TRANS_ARCHIVE.CHARGE_LOCATION = LOCATION.LOCATION_ID;
TheART
ofVoyager Access
SQL KEYWORDSHERE IS A PARTIAL LIST OF SQL KEYWORDS :
SELECT List the fields you wantDISTINCT Keep only unique valuesFROM List the tables from which to get dataINNER JOIN Standard join -- fields in both tables are equalOUTER JOIN Special join -- if no matching value in 2nd table, keep record anywayINTO Make a table from the results of your queryAS Rename a field or a table within the queryORDER BY Sort the results by these fields, left to rightASC Do the sort in ascending order (default)DESC Do the sort in descending orderGROUP BY Aggregate the records where these fields are the sameWHERE Keep only records that match these criteriaAND Additional WHERE criteriaHAVING When you use GROUP BY, the WHEREs turn to HAVINGs !?!UNION Combine two tables into one long tableUNION ALL Do a UNION, but don’t delete duplicate records (this is a “gotcha”)
TheART
ofVoyager Access
A SQL EXAMPLE
SELECT DISTINCTLAST_NAME AS DEADBEAT
FROMPATRON
INNER JOINCIRC_TRANSACTIONS
ON PATRON.PATRON_ID =CIRC_TRANSACTIONS.PATRON_ID
WHERE CURRENT_DUE_DATE < Date()AND OVERDUE_NOTICE_COUNT > “3”ORDER BY
CURRENT_DUE_DATE DESC;
TheART
ofVoyager Access
APPLICATION 8LOOK AT THE SQL VIEW FOR THE QUERY, “DUPLICATE ITEM BARCODES” AND TRY TO UNDERSTAND ALL OF IT. NOTE ANY QUESTIONS YOU HAVE FOR DISCUSSION.
LOOK AT THE SQL VIEW FOR THE QUERY, “REQUESTOR LIST” AND TRY TO UNDERSTAND ALL OF IT.
LOOK AT THE QUERY, “ITEM NOTE SEARCH” IN DESIGN VIEW. SEE IF YOU CAN CREATE CORRECT SQL CODE FOR THE QUERY. CHECK YOURSELF AGAINST THE SQL VIEW WHEN YOU HAVE FINISHED.
TheART
ofVoyager Access
BEFORE WE LEAVE SQL…
HARD TO TRANSLATE FROM ONE TO THE OTHER, BUT THEY ARE NOT COMPATIBLE.
ACCESS SQL:SELECT
LAST_NAMEFROM
PATRONINNER JOIN
PATRON_GROUPON PATRON.PATRON_GROUP_ID =
PATRON_GROUP.PATRON_GROUP_IDWHERE PATRON_GROUP_CODE Like “fac*”AND CREATE_DATE > #1/1/2001#AND HISTORICAL_CHARGES > “0”;
SQL*Plus:SELECT
LAST_NAMEFROM
PATRON,PATRON_GROUP
WHERE PATRON.PATRON_GROUP_ID =PATRON_GROUP.PATRON_GROUP_ID
AND PATRON_GROUP_CODE Like ‘fac%’AND CREATE_DATE > TO_DATE(‘1/1/2001','mm/dd/yyyy')AND HISTORICAL_CHARGES > 0;
THE VOYAGER SERVER USES SQL*Plus, WHICH IS SLIGHTLY DIFFERENT FROM ACCESS SQL. IT’S NOT TOO
TheART
ofVoyager Access
FULL CIRC HISTORY 5TO GET ALL OF THE CIRC STATS:
SELECT LOCATION_CODE, PATRON_GROUP_CODE, CHARGE_DATE AS TRANS_DATEFROM (PATRON_GROUP INNER JOIN CIRC_TRANS_ARCHIVE ON PATRON_GROUP.PATRON_GROUP_ID = CIRC_TRANS_ARCHIVE.PATRON_GROUP_ID) INNERJOIN LOCATION ON CIRC_TRANS_ARCHIVE.CHARGE_LOCATION = LOCATION.LOCATION_IDUNIONSELECT LOCATION_CODE, PATRON_GROUP_CODE, RENEW_DATE AS TRANS_DATEFROM ((RENEW_TRANS_ARCHIVE INNER JOIN CIRC_TRANS_ARCHIVE ON RENEW_TRANS_ARCHIVE.CIRC_TRANSACTION_ID = CIRC_TRANS_ARCHIVE.CIRC_TRANSACTION_ID) INNER JOIN PATRON_GROUP ON CIRC_TRANS_ARCHIVE.PATRON_GROUP_ID = PATRON_GROUP.PATRON_GROUP_ID) INNER JOIN LOCATION ON RENEW_TRANS_ARCHIVE.RENEW_LOCATION = LOCATION.LOCATION_IDUNIONSELECT LOCATION_CODE, PATRON_GROUP_CODE, CHARGE_DATE AS TRANS_DATEFROM (PATRON_GROUP INNER JOIN CIRC_TRANSACTIONS ON PATRON_GROUP.PATRON_GROUP_ID = CIRC_TRANSACTIONS.PATRON_GROUP_ID) INNER JOIN LOCATION ON CIRC_TRANSACTIONS.CHARGE_LOCATION = LOCATION.LOCATION_IDUNIONSELECT LOCATION_CODE, PATRON_GROUP_CODE, RENEW_DATE AS TRANS_DATEFROM ((RENEW_TRANSACTIONS INNER JOIN CIRC_TRANSACTIONS ON RENEW_TRANSACTIONS.CIRC_TRANSACTION_ID = CIRC_TRANSACTIONS.CIRC_TRANSACTION_ID) INNER JOIN PATRON_GROUP ON CIRC_TRANSACTIONS.PATRON_GROUP_ID = PATRON_GROUP.PATRON_GROUP_ID) INNER JOIN LOCATION ON RENEW_TRANSACTIONS.RENEW_LOCATION = LOCATION.LOCATION_ID
TheART
ofVoyager Access
WITH FULL CIRC HISTORY,NOW WHAT?
THE QUERY ON THE PREVIOUS SLIDE PRODUCES RAW DATA. RATHER THAN CHANGE THE QUERY EVERY TIME TO SELECT DATA, YOU COULD USE IT AS A SUBQUERY TO MORE SPECIFIC QUERIES.
TheART
ofVoyager Access
CIRCCHARGES_VWTHIS VIEW DOES HALF OF WHAT THE PREVIOUS SLIDE SHOWS -- THE TWO “CHARGE” PARTS. SHOULD YOU USE IT OR NOT?
IT DOES SOME OF WHAT YOU WANT, BUT IT MAY DO TOO MUCH. THE MORE TABLES IT USES AND THE MORE FIELDS IT GRABS, THE LONGER IT TAKES TO COMPLETE.
SELECT22 FIELDS (6 CALCULATED)
FROMCIRC_TRANSACTIONS,9 OTHER TABLES
UNIONSELECT
22 FIELDS (6 CALCULATED)FROM
CIRC_TRANS_ARCHIVE,9 OTHER TABLES;
TheART
ofVoyager Access
CIRCRENEW_VWTHERE IS ALSO A CIRCRENEW_VW THAT DOESN’T GET LINKED, BUT YOU CAN LINK IT MANUALLY.
TheART
ofVoyager Access
SEEING VIEW SOURCEYOU CAN SEE THE VIEW “SOURCE CODE” IN THE TEXT FIELD OF THE ALL_VIEWS TABLE THROUGH SQL*Plus:
SQL> set long 4000SQL> select text from all_views 2 where owner = 'WLAFDB' 3 and view_name = 'CIRCCHARGES_VW';
TEXT---------------------------------------------select c1.patron_group_id, pg1.patron_group_code, pg1.patron_group_name, c1.item_id, mi.mfhd_id, bm.bib_id,
...
TheART
ofVoyager Access
OPAC DISPLAYS
WHERE DO THESE FIELDS COME FROM?
TheART
ofVoyager Access
OPAC INDEX SCREEN
SEARCHPARM.SEARCHNAME
BIB_TEXT.[SEARCHPARM.DISPLAYFIELD1]
BIB_TEXT.[SEARCHPARM.DISPLAYFIELD2]
BIB_TEXT_DISPLAYFIELD.DISPLAY_NAME
LOCATION.LOCATION_DISPLAY_NAMEWHERE LOCATION_ID = MFHD_MASTER.LOCATION_ID
MFHD_MASTER.DISPLAY_CALL_NO
WEBVOYAGE opac.ini FILE [Title_Page] STANZA WHERE ITEM STATUS CODE CORRESPONDS TO ITEM_STATUS_TYPE.ITEM_STATUS_TYPE FOR ITEM_STATUS WHERE ITEM_ID IS FOR THIS ITEM (IF SINGLE ITEM TITLE)
BIB_INDEX.DISPLAY_HEADING
TheART
ofVoyager Access
OPAC RECORD SCREEN
WEBVOYAGE display[n].cfg FOR FIELDS SELECTED FROM MARC RECORD
TEXT FROM MARC FIELD, HOTLINKED IF HOTLINK FIELD IS PRESENT IN display[n].cfg
WEBVOYAGE displayh.cfg FOR FIELDS SELECTED FROM MFHD AND RELATED RECORDS
LOCATION.LOCATION_DISPLAY_NAME FOR ITEM.PERM_LOCATION
WEBVOYAGE OPAC.INI AS ON INDEX SCREEN
MFHD_MASTER.DISPLAY_CALL_NO
TheART
ofVoyager Access
APPLICATION 9DO AN AUTHOR SEARCH FOR “ZOLA” AND RETURN ALL OF THE FIELDS THAT YOU WOULD SEE IN AN OPAC TITLES LIST: AUTHOR, TITLE, DATE, LOCATION NAME, CALL NUMBER AND ITEM STATUS.
TO DO AN AUTHOR SEARCH, MATCH BIB_INDEX ENTRIES WITH AN INDEX_CODE THAT BEGINS WITH “1”. TITLE AND DATE (BEGIN_PUB_DATE) YOU CAN GET FROM BIB_TEXT. FOR ITEM STATUS, THE ITEM_STATUS_DESC FIELD IN THE ITEM_STATUS_TYPE TABLE IS SUFFICIENT.
SORTA LIKE THIS:
TheART
ofVoyager Access
SYSADMIN
MOST OF WHAT IS DONE THROUGH THE SYSADMIN CLIENT IS EITHER UNINTERESTING FOR REPORTING (E.G. “BIB DUPLICATION DETECTION PROFILES” OR “DEFAULT ADDRESS”) OR IT IS NATURALLY RELATED TO OTHER TABLES (E.G. “LOCATIONS” OR “VENDOR TYPES”).
TheART
ofVoyager Access
OPERATORS
UNLIKE MOST TABLES, THE KEY TO THE OPERATOR TABLE IS NOT NUMERIC, BUT TEXT. THIS WAY, YOU CAN READ IT EASILY IN OTHER RECORDS.
TheART
ofVoyager Access
XXX_OPID = OPERATOR_IDIN MANY TABLES, THE OPERATOR_ID FIELD HAS A NAME LIKE XXX_OPID. IT WON’T LINK AUTOMATICALLY TO THE OPERATOR_ID, BUT IT’S THE SAME THING.
DON’T CONFUSE THE CREATE_OPID IN THE OPERATOR TABLE WITH THE CREATE_OPID IN OTHER TABLES. THE ONE IN THE OPERATOR TABLE IS THE OPERATOR WHO CREATED THIS OPERATOR.
TheART
ofVoyager Access
OPERATOR PROFILESTO FIND OUT WHAT EACH OPERATOR IS AUTHORIZED TO DO, YOU TYPICALLY HAVE A THREE-TABLE JOIN:
THE SAME PATTERN APPLIES TO ACQ, CIRC, MEDIA AND THE MASTER PROFILE
TheART
ofVoyager Access
CIRC MATRIX
ZOOM
SEEING THE CIRC MATRIX ISN’T TERRIBLY HARD
TheART
ofVoyager Access
APPLICATION 10
CREATE A QUERY THAT SHOWS FOR EACH OPERATOR HOW MANY ITEMS THAT OPERATOR CREATED. INCLUDE THE LAST AND FIRST NAMES OF THE OPERATOR AND THE ITEM COUNT.
EASY AS PIE!
CREATING FORMS
IT’S EASY TO CREATE A FORM TO PRINT A REPORT. START BY CLICKING NEW FROM THE FORMS TAB. CHOOSE DESIGN VIEW OR THE FORM WIZARD.
CREATING FORMS
FIND THE COMMAND BUTTON ICON AND CLICK IT, THEN POSITION YOUR COMMAND BUTTON ON THE BLANK FORM.
CREATING FORMSWHEN YOU PLACE THE BUTTON, YOU’LL GET THE WIZARD. TO PRINT A REPORT CHOOSE PRINT REPORT.DUH!
CREATING FORMS
WHAT THE BUTTON LOOKS LIKE DEPENDS ON THE CHOICES YOU MAKE IN THE BUTTON WIZARD. I CHOSE AND SPECIFIED TEXT, BUT THE DEFAULT IS A PICTURE.
CREATING FORMS
SWITCH TO FORM VIEW TO SEE THE FORM AS A USER WOULD SEE IT. IF YOU DON’T LIKE IT, GO BACK TO DESIGN VIEW AND FIX IT BY MOVING THINGS OR CHANGING PROPERTIES.
TheART
ofVoyager Access
HOW THE FORM WORKS
THE FORM’S PROPERTIES INCLUDE AN EVENT PROCEDURE THAT RUNS WHEN THE BUTTON IS CLICKED.
TheART
ofVoyager Access
EVENT PROCEDURES
EVENT PROCEDURES ARE VISUAL BASIC SUBROUTINES WITH SPECIAL NAMES. BY STUDYING THEM A BIT, YOU MIGHT LEARN ENOUGH VB TO WRITE YOUR OWN FUNCTIONS.
TheART
ofVoyager Access
APPLICATION 11CREATE A FORM TO PRINT THE “ITEM STATUS - WITHDRAWN” REPORT. LOOK AT THE VISUAL BASIC SOURCE AND CHANGE IT TO RUN THE “ITEM STATUS - IN TRANSIT” REPORT INSTEAD.
YOU JUST SAW HOW TO CREATE THE FORM. ONCE IT’S THERE, YOU CAN SEE THE VISUAL BASIC BY CLICKING ON THE ELLIPSIS AFTER THE “ON CLICK” PROPERTY EVENT PROCEDURE. YOU MAY NOT UNDERSTAND ALL OF THE VISUAL BASIC, BUT YOU CAN PROBABLY SEE FAIRLY QUICKLY HOW TO CHANGE IT AS REQUESTED. DON’T CHANGE ANYTHING ELSE IF YOU DON’T UNDERSTAND IT.
TheART
ofVoyager Access
WHAT ELSE?
IS THERE ANYTHING WE DIDN’T COVER THAT YOU WOULD LIKE TO DISCUSS?
PLEASE FILL OUT EVALUATION FORMS!
ALWAYS FEEL FREE TO CONTACT ME:[email protected]
“Please, sir, may I have some more?”