Title: Advanced Report Writing
1Advanced Report Writing
IUAG Reports Forum May 11, 2006 Cathy
SalikaCARLI Staff
2Three BIG TopicsOuter JoinsThe BLOB
FunctionsMake Table Queries Subqueries
3Outer JoinsMost sources call them outer
joins. Access calls them left joins and
right joins. The distinction turns out to
be not very helpful, at least to me.
4Two reasons to use an outer join1) In case
there are no matching data in a table youre
linking to2) To find records that dont have
matching data in the table youre linking to
5In case there are no data in a table youre
linking to...What could go wrong with this query?
6ITEM
ITEM_BARCODE
The normal join on ITEM_ID will give you just one
record
Remember, you have to have matching ITEM_IDs in
both tables to get a record
7So what could go wrong with this query?
Items with no barcode will not appear. MFHDs with
no item will not appear.
8Think of some other examples where you might link
to a table in which matching data might be
missing.A list of patrons, some of whom might
not have barcodesA list of purchase orders,
some of which might not have invoices yet.A
list of items, some of which might not have
statistical categories. Others?
9ITEM
How do we fix this? We change the join.
ITEM_BARCODE
10Howd she do that?Right-click on the link...
... and select Join Properties
11You get this...
12Pick option 2, click OK, and the link turns into
an arrow.
So what if I had picked option 3 instead?
13The arrow would be pointing the other way.
This is the left and right aspect of joining,
but since this...
... is just the same as the picture above, I
dont find left and right very helpful.
14But it matters which table the arrow is pointing
to!A LOT!!!
15ITEM
ITEM_BARCODE
16A list of items, some of which might not have
statistical categories.
17Moral All the links beyond the arrow have to be
arrows too.
18A list of patrons, some of whom might not have
barcodes
19Two reasons to use an outer join1) In case
there are no matching data in a table youre
linking to2) To find records that dont have
matching data in the table youre linking to
20Suppose I want to find...... the items that
have no barcodes... the bibs that have no
holdings... the patrons who have no
barcodesUse an outer join and check for the
ltNullgt value.The criterion is Is Null
21Items with no barcodes
22Bibs with no holdings
23Patrons with no barcodes
24Any outer join questions?
25Next topic The BLOB Functions
26Voyager stores catalog data in two
ways Frequently used data are in their own
fields. Things like TITLE, AUTHOR,
DISPLAY_CALL_NO Fields that need to be
indexed Fields in multi-bib displays The whole
MARC record is stored as a Binary Large OBject.
The BLOB functions let you get at any piece of a
MARC record.
27The BLOB functions are indispensable, but theyre
slow, so Remember the Alternatives!
28Alternatives to the BLOB Queries is on the web
site. BIB_TEXT BIB_INDEX For fixed fields,
MARC_VW (e.g. MARCBOOK_VW) For URLs,
ELINK_INDEX But when you need the BLOB...
29There are just 7 BLOB functions to learn
GetAuthBlob GetBibBlob GetMFHDBlob
GetField
GetFieldAll
GetFieldRaw
GetSubField
30GetAuthBlob(auth_id) GetBibBlob(bib_id) GetMFHDBlo
b(mfhd_id) These three arent useful on their
own. They ask Voyager for a MARC record. You
use one of these as the building block for the
other functions.
31Your query should include at least one table in
which the ID field is unique, for
example GetBibBlob(BIB_TEXT.BIB_ID) GetBibBl
ob(BIB_MASTER.BIB_ID) GetAuthBlob(AUTH_MASTER
.AUTH_ID) GetMFHDBlob(MFHD_MASTER.MFHD_ID)
BTW, capitalization doesnt matter.
32GetAuthBlob GetBibBlob GetMFHDBlob
Youll wrap one of these
GetField GetFieldAll GetFieldRaw
around one of these
33GetField gives you a single occurrence of a MARC
field Syntax
One of the Blob functions
A MARC tag
Which one?
GetField(
,
,
)
Example the first 505 field in a bib
record GetField(GetBibBlob(BIB_TEXT.BIB_ID),5
05,1) Example the first subject (6xx field) in
a bib record GetField(GetBibBlob(BIB_TEXT.BIB_
ID),6,1)
34Example the first 505 field in a bib
record GetField(GetBibBlob(BIB_TEXT.BIB_ID),5
05,1) v. 1. Ancient Egypt through the Middle
Ages -- v. 2. The Renaissance to the
present. Example the first subject (6xx field)
in a bib record GetField(GetBibBlob(BIB_TEXT.B
IB_ID),6,1) Latin poetry, Medieval and modern
History and criticism
35GetFieldAll gives you all occurrences of a MARC
field Syntax
One of the Blob functions
A MARC tag
GetFieldAll(
,
)
Example all of the 650 fields in a bib
record GetFieldAll(GetBibBlob(BIB_TEXT.BIB_ID)
,650) Example all of the 866s in a
MFHD GetFieldAll(GetMFHDBlob(MFHD_MASTER.BIB_I
D),866)
36Example all of the 650 fields in a bib
record GetFieldAll(GetBibBlob(BIB_TEXT.BIB_ID)
,650) Job enrichment Employees' representation
in management Personnel management You might
have the expand the rows in Access to see them
all, because they all appear in one cell.
37Example all of the 866s in a MFHD GetFieldAll(Ge
tMFHDBlob(MFHD_MASTER.MFHD_ID),866) 0 no.1
(1958)-no. 6 (1962) 0 no. 8 (1964)-no. 11
(1966) 0 no. 16 (1968)-no. 18 (1973-1975)
38Advanced Features for GetField and
GetFieldAll You may add 2 more parameters to
these functions a list of subfields that you
want to see a separator to appear between
subfields
39Example the first 650 field, subfields a, x, and
z GetField(GetBibBlob(BIB_TEXT.BIB_ID),650,1
,axz) Forensic psychiatry Periodicals. Example
the first 650 field, subfields a, x, and z with
double dashes between subfields GetField(GetBibBlo
b(BIB_TEXT.BIB_ID),650,1,axz,-
-) Forensic psychiatry--Periodicals.
40GetFieldRaw give you one occurrence of a MARC
field, including the tag, indicators, and
subfield coding. Its the only way to get the
indicators. Its the only function that works
with GetSubField. Syntax
One of the Blob functions
A MARC tag
Which one?
)
GetFieldRaw(
,
,
,
Example the third 650 field in a bib
record GetFieldRaw(GetBibBlob(BIB_TEXT.BIB_ID
),650,3)
41Example the third 650 field in a bib
record GetFieldRaw(GetBibBlob(BIB_TEXT.BIB_ID
),650,3) 650 0aDay care centersxGovernment
policyzUnited States.
42GetSubField gives you one occurrence of a MARC
subfield. You need GetFieldRaw and a Blob
function with it. Syntax
A MARC subfield code
Which one?
,
GetSubField(GetFieldRaw(etc),
)
43Example The second x from the first 650 in a
bib record GetSubField(GetFieldRaw(GetBibBlob(BI
B_TEXT.BIB_ID),650,1),x,2) Bibliography.
44The Blob functions can be slow, especially for
large databases.Sounds familiar? Check this
outA Strategy for Using BLOB Functions on
Large Databases
45To sum up
GetAuthBlob GetBibBlob GetMFHDBlob
GetField
GetFieldAll
GetFieldRaw
GetSubField
46Questions about the BLOB?
47Make Table Queries and Subqueries Its an Art
48Make Table Queries and subqueries fill the same
need in different ways. Well focus on Make
Table Queries first.
49If you ever say to yourself...I know how to
write this query, except that one of the tables I
need doesnt exist, ...you need a Make Table
Query.
50Example List all the patrons who have duplicate
barcodes.Itd be pretty easy if you had this
table, right?
51So write a query that builds the table
52To save the table in your Access database, you
need to make it into a Make Table query
53Then Access asks what the table should be called.
54Ill call it Dup Patron Barcode TableTip
You cant have a table and a query with the same
name. If you do, you get an obscure error
message. To keep this from happening, I usually
include table in my table names.When the
query completes, youll get this message
55If you run the query a second time, Access will
delete the results of the previous run, but it
will ask you first
56Now, when I look at the tables I have
available...
57List all the patrons who have duplicate barcodes.
Thats easy now!
58Another example I want a list of the items that
are both charged out and damaged.That would be
easy if I had a table listing the charged items
and a table listing the damaged ones.
59A table of the charged items
60A table of the damaged items
61And a query to find the items in both
62(No Transcript)
63Another use for a Make Table queryIf you have
a Blob query that you know will run for a long
time, make it a Make Table query.Start it
before you leave work for the day.I lock my
workstation and tape a note to the power button
saying that its locked.With luck, in the
morning, it will be ready to paste my results
into the table.
64Subquery example patrons with duplicate barcodes
again.Write the subquery. Dont make it a
Make Table query. Dont run it (except to
examine and verify the results). Save it.
65(No Transcript)
66When Im about to select the tables for the main
query, click the Queries tab and select Dup
patron barcodes subquery.
67Then click the Tables tab and select the other
tables that you need.
68Add the links, save the query, and run it.
69Questions about Make Table queries and
subqueries?
70Its been a whirlwind tour!
Thank you!
71Documentation on functions in AccessTheyre
generally the same as Visual Basic Functions. I
use this web sitehttp//msdn.microsoft.com/libr
ary/default.asp?url/library/en-us/
vblr7/html/vaoriFunctionsVBA.asp