




























































































Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
An Introduction to databases using ms access
Typology: Lecture notes
1 / 154
This page cannot be seen from the preview
Don't miss anything!





























































































Soren Lauesen
- Version 2.4b: July E-mail: [email protected] Print on A4 paper with 2-sided printing so that text and associated figures are on opposing pages.
Version 1 : October 2004.
Version 2.1 : November 2004. Changes: a. Restructured section 3.2 with small additions. b. Section 7.1 on action queries added. c. Small changes and additions to Chapter 6 with corresponding changes in the Reference Card. d. Index provided
Version 2.2 : April 2004. Changes: a. SQL HAVING introduced in section 4.2 and the example in section 4.4. b. More on aggregate functions in section 4.4. c. ColumnOrder, ColumnWidth discussed in section 5.5.7. d. Selection of an area in the datasheet is discussed in section 5.5.8. e. Section 5.7 (action queries) now moved to Chapter 7. f. Action queries, Union, Subqueries, Crosstab, etc. discussed in Chapter 7 (a new chapter). g. Various small changes and improved explanations here and there.
Version 2.3 : September 2006. Changes: a. Access 2003 dialog when opening a database changed (page 8). b. Look-up fields for foreign keys deleted (last part of section 2.4). Access's automatic creation of relationships caused too much confusion. c. Combo boxes described in sections 3.1.6 and 3.1.7. d. More events explained in section 5.2.3. e. Various misprints corrected.
Version 2.4 : August 2007 and July 2011. Changes: a. Partial integrity (page 12). b. Adding a label to a control (page 20). c. DateTime Picker (page 22). d. More Null rules (page 62, 77, 124). e. Access data model and experiments improved (page 68-70). f. Composite search criteria, more computed SQL, date comparison (page 76-77). g. Event sequence for textbox: small corrections, e.g. OldValue (page 78). h. Improved area selection (page 95-96). i. Error handling, user errors (page 97-98). j. Timer and loop breaking (page 98-99). k. Managing modules and class modules (page 112). l. Error handling, VBA errors, Err object (page 117). m. Enum type (page 121). n. Partition operator (page 124). o. Week number in the Format function (page 126). p. Dynamic matrix simplified (page 136). q. Minor corrections and improvements in many places. r. Version 2.4a: Note on AutoNumber added to Figures 2.1C and 2.4. s. Version 2.4b: Copyright notice more liberal. Misprint corrected (page 65, step 14 and 15). Figure 52B (page 75) shows quote-stuff more clearly. SendKeys on page 99 elaborated.
© Soren Lauesen, 2007 Permission is granted to use, print and copy the file on a non-profit basis as long as the source is clearly stated. The document is available on the author's web site on these conditions.
2 Preface
In this booklet we illustrate MS-Access by means of a system for supporting a hotel reception. The system is used as the main example in User Interface Design - a Software Engineering Perspective , by Soren Lauesen. If you know the book, skip this section and go straight to Chapter 2.
The hotel system consists of the screens shown in Fig- ure 1A.
Find guest. The Find guest screen allows the recep- tionist to find a guest or a booking in the database. The receptionist may enter part of the guest name and click the Find guest button. The system then updates the lower part of the screen to show the guests or bookings that match. The receptionist may also find the guest by his phone number, room number, or stay number (also called booking number ).
The receptionist can select the guest from the list and click the buttons to see details of the booking or create a new booking for the guest.
Room Selection. The Room Selection screen gives an overview of available rooms in a certain period. Avail- ability is shown as IN when the room is occupied, BOO when it is booked, etc. The receptionist may specify the period of interest and the type of room, then click the Find room button. The system updates the ta- ble at the bottom of the screen to show the rooms of interest. The receptionist can then choose a room and book it for the guest – or check a guest into the room.
Stay. The Stay screen shows all the details of a book- ing, for instance the guest and his address, the rooms he has booked and the prices. When the guest is checked in, the Stay screen also shows breakfast and other services he has received. The system shows these details on the Services tab. Here the receptionist can
record services that the guest has received. The system uses the term Stay to mean a booking or a guest who has checked in.
Breakfast list. The Breakfast screen shows the break- fast servings for a specific date. It handles just two kinds of breakfast: self-service breakfast in the restau- rant (buffet) and breakfast served in the room. The waiter in the restaurant has a paper copy of the list and records the servings here. Later the receptionist enters the data through the Breakfast screen.
Service list. The Service list shows the price for each kind of service. Hotel management uses this list to change service prices or add new kinds of service.
The system uses a database with several tables. They are shown as an E/R data model on Figure 1B.
tblGuest has a record for each guest with his address and phone number.
tblStay has a record for each stay (booking or checked in) with a booking number ( stay number ) and the pay method.
tblRoom has a record for each room in the hotel.
tblRoomState has a record for each date where a room is occupied. It connects to the room occupied and the stay that occupies it. If the room is occupied for repair, it doesn’t connect to a stay.
tblRoomType has a record for each type of room (room class) with a short description of the room type, the number of beds, and the prices.
tblService has a record for each type of service with its name and price per unit.
tblStay
tblRoomState
tblRoom
tblServiceReceived (^) tblServiceType
tblGuest
tblRoomType
tblServiceReceived has a record for each delivery of service to a guest. It connects to the type of service and to the stay where the service is charged (there is an in- voice for each stay).
4 1. The hotel system
Primary key. Right click
Possible data types
Field properties. Also use F1 - Help.
Table name. Access asks for it the first time you close the window.
One line per field
different). We have selected the Tables tab, but there are no tables or other things in the database as yet. However, you see three icons that can create tables for you. When you have created a table, it will appear in the table window and you can then Open it and enter data into it, or you can Design it, i.e. change the defi- nition of it. (In Access 97 the database window looks like a traditional tab form. There are no create-icons, but function buttons for the same purpose.)
Define a table
Now you get a window as shown on Figure 2.1B. Here you define the fields (attributes) of the table. The list of fields runs downwards with one line per field. Initially there are only empty lines. The table hasn't got a name yet. Access asks for the name when you close the win- dow.
The figure shows the finished guest table. You see the field names to the left. In the middle column is the type of the field - Data Type. The figure shows all the pos- sible types as a combo box. The most important data types are Text, Number, Date/Time, and AutoNumber. An AutoNumber is a counter that Access increases for each new record, so that it serves as a unique key. The value is a Long Integer (32-bit integer). We explain more about data types in the next section.
of type Text, except the guestID which is of type AutoNumber.
Note that although we say phone number and passport number , these fields are texts because the "numbers" contain parentheses, dashes and maybe letters.
When you have chosen a data type, you can choose a number of other field properties. They are in the lower part of the window. On the figure you can see that the name field is a text field with space for 50 characters. You can also see that the user doesn't have to enter anything in the name field ( Required =No). You should change this to Yes since it doesn't make sense to have a guest without a name.
Try to use Access's help to find more information about the data types and their properties. For instance, put the cursor in the Data Type of a field and click F1. Or point at one of the properties and click F1.
Lookup Wizard is not a field type. If you select Lookup Wizard, it makes the field into a combo box where the user can select a value instead of typing it into the field. We will look closer at Lookup in section 2.4.
Key fields Often you have to define a key field so that other tables can refer to this one. In our case, guestID must be the key field:
You can remove the key property again by once more selecting Primary Key. If the key consists of more than one field, you first select all the fields by clicking on their left-hand marker with Ctrl down. Then select Primary Key by right-clicking inside one of the field lines.
If you have not defined a primary key, Access will warn you and suggest that it makes one for you. Don't let it - do it yourself. Or at least check what Access makes in its excessive helpfulness.
Enter data After these efforts, it is time to record some guests. Fortunately it is easy:
Now the system shows the table in user mode ( Da- tasheet view ) so that you can enter guest data.
On Figure 2.1C we originally entered a guest that got guestID 4, later deleted this guest. Access will never reuse number 4 for a guest.
Close and reopen the database To feel confident with Access, it is a good idea to close and open the database now.
Notice that Access doesn't ask whether you want to save changes. Access saves them all along, for instance when you define a table or when you enter a record in the table.
Access 2003 is very security concerned and asks you several questions when you open the file. The dialog may vary from one installation to another, but is something like this:
As an alternative, you may say yes to blocking the unsafe expressions. This will save you some questions when you open the file in the future. However, some installations don't allow you to block expressions.
Note that Access 2003 shows that your database is in Access 2000 format. This is all right. It allows you to use it also from Access 2000. You can convert it to other formats with Tools -> Database Utilities -> Con- vert Database.
Undo. Use Esc to undo the changes you have made to the current record.
As soon as you move the cursor to the next line, Access stores the record in the database and you cannot make an automatic undo anymore. However, you can manually edit the stored record. Notice that the pencil disappears when the record is stored in the database.
Shortcut keys for data entry F2: Toggles between selecting the entire field and se- lecting a data entry point. Shift+F2: Opens a small window with space for the entire field. Useful for entering long texts into a field that is shown only partly in the table. How- ever, the text cannot be longer than you specified in the table definition. Alt+ArrowDown: Opens a combo box. Choose with the arrows and Enter.
Shortcut keys for navigation Tab and Shift+Tab: Moves from field to field. Ctrl+Tab: Moves from one tab form to the next, for in- stance in the lower part of the table definition win- dow. F6: Moves between upper and lower section of a win- dow, for instance in the table definition window. Ctrl+Enter: Opens the table in design mode (in the da- tabase window).
See also shortcuts on the reference card
8 2. Creating a database
2.2 Create more tables
You should now create the remaining tables for the hotel. The data model on Figure 2.2 shows the tables we will use. To simplify your job, we have shown all the keys, including the foreign keys and the artificial keys.
Make sure you define all the fields. Otherwise you will get stuck when later constructing the user interface. Here are a few notes about the various tables:
tblStay: stayID is the primary key of tblStay. Make it an Auto- Number. guestID is a foreign key that refers to the AutoNumber in tblGuest. The foreign key must have a matching data type - a long integer. Choose Data Type = Number and Field Size = Long Integer. Warning: Don't make the foreign key an AutoNumber. This would cause Access to fill in the foreign key fields automatically, and you cannot change the numbers so that they point to the primary keys in the guest table. paymethod is an enumeration type. Make it an integer (a 16-bit integer, not a long integer). Choose Data Type = Number and Field Size= Integer. We will use the value 1 to denote Cash, the value 2 to de- note Visa, etc. We will look closer at this in section 2.4. state must also be an enumeration type. Make it an in- teger. Here the value 1 will denote booked , 2 in , etc.
tblRoomType: Contains one record for each type of room, for instance one for double rooms, one for single rooms, etc. (In the book User Interface Design , we added this table late in the design process to illustrate the normalization con- cept.)
roomType is an artificial key. An AutoNumber is okay. description is a short text, for instance "double room, bath". bedCount is the number of beds in the room, including temporary beds. price1 and price2 are the standard price and a possible discount price. The price should be a decimal num- ber. Choose Data Type= Number, Field Size= Sin- gle , Decimal Places =2.
tblRoom: roomID is a natural key - the number on the door. So don't use an AutoNumber. Use an integer. roomType is a foreign key that refers to tblRoomType. (You should by know how to deal with it.)
tblRoomState: stayID and roomID are foreign keys. Ensure their types match what they refer to. Notice that roomID refers to a natural key, not to an AutoNumber. date should be a Date/Time field with Format = Short Date. personCount is the number of persons staying in the room. An integer should suffice. state is similar to state for tblStay, although the values are slightly different. The key consists of two fields: roomID and date. It is a bit tricky to specify this: select both fields by clicking on the left-hand marker (hold down Ctrl while selecting the second field). Then right-click somewhere on the text inside the line.
The following two tables are needed for the full sys- tem. However, you don't need to create them in order to follow the tutorial.
tblServiceType: serviceID is an artificial key. Should be an Auto- Number. name and price should be obvious. The price should be a decimal number. Choose Data Type= Number, Field Size= Single , Decimal Places =2.
tblServiceReceived: stayID and serviceID are foreign keys that refer to AutoNumbers. The foreign keys must thus be long integers. roomID is an optional reference to a room. An integer should suffice. (This reference is needed when a waiter records a service for a specific room and the guest has more than one room.) date should be a Date/Time field. Choose Format = Short Date. quantity is the number of items the guest has got - an integer should suffice.
Data is stored in the computer according to its type. Here is a description of the most important types in the data base. Visual Basic deals with almost the same types (see section 6.2 and the reference card under Declarations ).
Text. The field can contain any characters. The Field Size property defines the maximum number of charac- ters. The maximum cannot be above 255 characters.
Memo. Like a text field, but the maximum number of characters is 65,535. Access takes more time to process a memo field, so use text fields if adequate.
Number. The field can contain a number. The Field Size property defines what kind of number:
10 2. Creating a database
Numbers can be shown in many ways depending on the format property of the field. You may for instance show them with a fixed number of decimals, with a currency symbol, etc.
Some formats show data in a way that depends on the regional settings of the computer. If you for instance specify the format of a number as Currency , the number will show with a $ on a US computer and with a £ on a British computer.
Date/Time. The field gives a point in time. In the computer it is stored as the number of days since 30/12-1899 at 0:00. It is really a Double number, so the number of days may include a fraction of a day. In this way the field specifies the date as well as the time with high precision. As an example, the number 1 corre- sponds to 31/12-1899 at 0:00, the number 1.75 to 31/12-1899 at 18:00 (6 PM).
Usually we don't show a date field as a number, but as a date and/or a time. The format property specifies this.
Also here you can choose a format that adapts to the regional setting.
Yes/No. The field contains a Boolean value shown either as Yes/No, True/False, or On/Off. The format property specifies this.
AutoNumber. The field is a long integer (32 bits) that Access generates itself as a unique number in the table. Access numbers the records 1, 2,... as you enter the records. However, you cannot trust that the sequence is unbroken. For instance when you add a record and undo the addition before having completed it, Access uses the next number in the sequence anyway.
A foreign key is a field (or several fields) that refer to something unique in another table - usually the primary key. Be careful here. The foreign key and the primary key must have the same type. However, when the primary key is an AutoNumber, the foreign key must be a long integer.
Changing a data type. Access is quite liberal with changing a data type to something else - even if there are data in the records. It can also change an Auto- Number field to a number field, but not the other way around. If you need to change field B to an Auto- Number, create a new field C and make it an Auto- Number. Then delete field B and rename field C to B.
If you for some reason want to store a record with an AutoNumber of your own choice (for instance create a stay with stayID=728), you need to append the record with an INSERT query (see section 7.1). You cannot just type in the stayID.
stayID, roomID, date, personCount, state (booked | occupied | repair)
guestID, name, address1, address2, address3, phone, passport
roomID, roomType
stayID, serviceID, serviceID, name, price roomID, date, quantity
stayID, guestID, paymethod (cash | visa ...), state (booked | in |out | canceled)
roomType, description bedCount, price1, price
Right-click in database window. Select Relationships
Choose tables to show in the ER diagram
Create a relationship: Drag 1-side field to m-side field (or opposite). Edit the relationship - Referential integrity!
Right-click in ER diagram. Select Show Table
Primary key
Foreign key
2.4 Look-up fields, enumeration type
Your next task will be to fill in some data in all the ta- bles. However, some of the fields are cumbersome to fill in correctly. As an example, the pay method field is a code where 1 means Cash, 2 Visa, etc. The user should not have to remember these codes, so we will let the user choose the value from a list. It is an enumeration-type field:
paymethod(Cash | Visa |... )
Figure 2.4 shows what we want when the user fills in the paymethod field. We want the field to be a combo box where the user can select the mnemonic text while Access stores the number code. Here is how to do it:
Fill in some stay records You are now going to create some stay records and connect them to a guest.
How the look-up field works Open tblStay in design mode and study the Lookup tab for paymethod (bottom of Figure 2.4). The display control property is Combo Box. It means that when the user is to fill in the paymethod, he sees a combo box.
The values the user can choose between are listed in Row Source. You may edit the values here. Column Count shows that these values are to be displayed as two columns. Notice that Limit to List is No. It means that the user can enter other values than those in the list. In our case, it is not desirable, so set the property to Yes. Sections 3.1.6 and 3.1.7 explain more about combo boxes.
Undo the Lookup Wizard? How do you make the field an ordinary field rather than a lookup field? It doesn't help to make it an integer or a text. Choose the Lookup tab at the bottom of the table design window. Change Display Control to Text Box. (See bottom of Figure 2.4.)
Panic? Undo data entry When you enter data into the tables, Access checks against the rules you have defined for the tables and the relationships. For instance, when you enter the guestID in tblStay, this ID must correspond to a guest in the guest table. Access doesn't allow you to leave the record before this is fixed. The reason is that Access stores the record in the database as soon as you move the cursor away from the record. And the database must meet all the rules you have stated.
Sometimes you may not know what to type to satisfy Access, and on the other hand you cannot leave the re- cord to look at what to type. Many users panic here and even switch off the power to close down the system. The solution is to use Esc twice :
14 2. Creating a database
2.5 Dealing with trees and networks
E/R models can neatly describe complex relationships, for instance as we saw it for the flight routes in User Interface Design. Figure 2.5 shows the E/R model, but Access cannot show such a model directly.
The problem is that Access identifies a relationship by means of the two tables it connects. This means that Access cannot have two connectors between the same two tables. Also you cannot have a self-referential con- nector. In the flight route model we need both of these.
As a compensation, Access offers shadow copies of a table. The table and its shadow copies are the same ta- ble, but they have different names. You can now create connectors to the shadow copies and thus indirectly create multiple connectors between the same two ta- bles.
Figure 2.5 shows how to handle the flight routes in Access by means of shadow copies.
16 2. Creating a database
routeID, mon, tue, wed, thu, fri, sat, sun
legID, route, next, from, to deptTime, arrTime,
cityID, name
Relationship between Leg and Leg : Shadow copy of Leg****.
Two relationships between City and Leg : Shadow copy of City****.
Right-click -> Show table****. Show City once more.
Create a Form
List of forms (empty initially)
The Forms (user windows) of the database
The Form
ControlsControlsControls
Property box for the Form.
Set grid size to 5 units per cm.
Toolbox: Click Text Box control. Draw a box on the Form.
Click for Form properties
Using the fields You may wonder why Access writes unbound inside all the boxes. It means that the box is not bound to any record in the database. The user may enter something but it is not automatically stored in the database. Try this:
If you want a label without the text box, select the label tool from the toolbox and draw a label control.
If you want to add a label to a label-less text box, select some label, copy it (Ctrl+C), select the text box and paste the label (Ctrl+V).
try to move and resize the controls with the key- board, or drag them with the mouse.
Make sure you see all menu items Access 2000 and 2003 have an annoying feature where it shows only the last menu items you have used. It makes it difficult to follow the procedures below. Get rid of this feature:
The Format menu and the grid Open the form in design mode and select a control. Now look at the Format menu at the top of the Access window. There are several things here that can help you design the form:
You may notice that the form has things in the corners that we don't want in the final user window (bottom of Figure 3.1B). The title bar, for instance, holds our pro- grammer-oriented form name, frmFindStay. It should be Find Guest. There are also record selectors, naviga- tion buttons, and space for a scroll bar that we don't need in the final window. We can correct all of this by setting properties of the form:
20 3. Access-based user interfaces