create pdf thumbnail image c# : Best way to create pdf forms Library software component asp.net winforms web page mvc AccessTutorial10-part956

Fig 5.5F F Resizing a form 
Private Sub Form_Resize()
Static formWidth As Long ' Initially zero, survives calls
Dim dif As Long ‘ The width adjustment
dif = IIf(formWidth = 0, 0, Me.WindowWidth -formWidth)
If Me.txtTest.Width + dif > 0 Then
Me.txtTest.Width = Me.txtTest.Width + dif
Me.subTest.Width = Me.subTest.Width + dif
formWidth = Me.WindowWidth
End If
End Sub
Resizing and moving a form:
DoCmd.MoveSize  right, down, width, height   
right =
WindowLeft
down =
WindowTop
width =
WindowWidth
height =
WindowHeight
stead of setting the width, set the ColumnWidth prop-
erties of the controls (see section 5.5.7). You might for 
instance extend all the columns in a proportional way. 
5. Access through Visual Basic 
101
Best way to create pdf forms - C# PDF Field Edit Library: insert, delete, update pdf form field in C#.net, ASP.NET, MVC, Ajax, WPF
Online C# Tutorial to Insert, Delete and Update Fields in PDF Document
pdf form maker; changing font size in pdf form
Best way to create pdf forms - VB.NET PDF Field Edit library: insert, delete, update pdf form field in vb.net, ASP.NET, MVC, Ajax, WPF
How to Insert, Delete and Update Fields in PDF Document with VB.NET Demo Code
add jpg to pdf form; best way to create pdf forms
5.6 Record sets (DAO) 
When we need complex record handling, there are two 
ways to go: through SQL statements that update 
records, or through programmed record access. In this 
section we look at the latter possibility. The SQL way 
is explained in section 7.1) 
Select the database model. Before you can try the 
following example, you should make sure that your 
program accesses the database with the right method. 
Over the years, Access has used different methods to 
access the tables, trying at all times to be compatible 
with earlier versions. Below we will use the DAO ap-
proach which works across all Access versions. Access 
97 is born with DAO, but in Access 2000 and 2003 you 
have to select DAO. Do as follows: 
1.  Open Visual Basic and select Tools -> References. 
You now see a list of the libraries that Access may 
use. At the top of the list, you see those selected at 
present. When VBA looks for a built-in class name, 
it first looks in the top library. If the name is not 
there, it looks in the next library, and so on. 
2.  If MicroSoft DAO 3.6 Object Library is not se-
lected, go far down the list and select it. Next move 
it to the top of the list. The easiest way is to close 
the list, then reopen it. Now DAO 3.6 is in the top 
list. Move it further up as far as it can go. Then 
VBA will find the DAO 3.6 names first. 
There is no reason to restart the system. You may no-
tice that in the Object Browser and with Ctrl+J you will 
now see two RecordSet classes. Use the one with an 
Edit property. 
5.6.1 Programmed record updates 
As the first example we will outline how the CheckIn 
button on the Stay form could work (Figure 5.6A). 
3. Open frmStay in design view. (If you followed the 
earlier exercises closely, there are no buttons on the 
form.) 
4.  Create a Book button and a CheckIn button and 
give them names with the cmd prefix. 
5.  Define the event procedure for the OnClick event 
on the CheckIn button. Figure 5.6A shows the body 
of the procedure. It demonstrates many new things 
that we explain below. 
Declarations. The first lines of the procedure declare 
two variables. The variable s can hold a text string. The 
variable rs can hold a Recordset, or more precisely, it 
holds a reference (a pointer) to a Recordset. These 
variables are local for the procedure, which means that 
VBA creates them when it calls the procedure, and de-
letes them when it returns from the procedure. Initially 
they both have the value Nothing
Computed SQL 
The statement s="SELECT . . . " computes a text and 
stores it in the variable s. If the form shows stay 728, 
then s will hold this text: 
SELECT * FROM tblRoomState  
WHERE stayID=728;
It is an SQL statement that selects all fields from the 
RoomState records that belong to the stay. As you see, 
the program computes this SQL statement from three 
parts, the text "SELECT . . . ", the expression 
Me.stayID and the text ";". 
If you are not fluent in SQL, it may be easier to make 
the query with the query grid. Then switch to SQL-
view and copy and paste the statement into the pro-
gram. VBA makes a lot of noise about this non-VBA 
statement, but just modify the statement with quotation 
marks, &-operators, and so on. As usual, don't care 
about capitalization. SELECT may for instance be 
written with small letters. VBA doesn't look at what is 
inside the quotes and the SQL-engine doesn't care 
about caps. 
Warning. You may wonder why we have to compute 
the SQL. When working with the query grid, we could 
write things like 
WHERE stayID=Forms!frmStay!stayID
Why don't we write something similar here, for in-
stance 
WHERE stayID=Me.stayID
The answer is that in VBA we compose the final SQL-
statements directly. When working with the query grid, 
Access translates our SQL-statement into the final SQL 
version. As part of this, Access finds the current value 
of Forms!frmStay!stayID and inserts it into the SQL-
string that it passes to the database engine. In other 
words, it does the same kind of work that our VBA 
program does. 
Open the Recordset. The statement  
Set rs = CurrentDB.OpenRecordset(s)
creates a Recordset and stores a reference to it in rs
The command Set says that we want to store the ref-
erence, not the Recordset itself. CurrentDB is the da-
tabase currently used by the program, and we ask it to 
open a record set that gives us the records specified by 
the SQL statement in s. When Access has opened the 
record set, the first record in the set becomes the cur-
rent record. If the set is empty, there is no current 
record, and End Of File (EOF) is true. 
While loop. The statements from While to Wend are a 
loop. The four statements inside the loop are repeated 
until rs.EOF becomes True. This happens when the 
program tries to move the current record beyond the 
102 
5. Access through Visual Basic 
Online Convert PDF file to Tiff. Best free online PDF Tif
tool, which can perform high-fidelity PDF to TIFF conversion in an easy way. Download and try RasterEdge.XDoc.PDF for .NET with online support.
change font size in pdf form field; change font size pdf form reader
VB.NET Create PDF Library SDK to convert PDF from other file
Best VB.NET component to convert Microsoft Office Word, Excel a PDF document is a good way to share MS Visual Studio .NET applications to create PDF with just
change font in pdf fillable form; change font size pdf fillable form
Private Sub cmdCheckin_Click()
Dim s As String
Dim rs As Recordset
s = "SELECT * FROM tblRoomState WHERE stayID=" & Me.stayID & ";"
Set rs = CurrentDb.OpenRecordset(s)
While Not rs.EOF
rs.Edit
rs!state = 2 ‘ CheckedIn
rs.Update
rs.MoveNext
Wend
Me!state = 2
rs.Close ‘ Not needed when rs is a local variable
End Sub
Fig 5.
6A
Recordset
, updating records
frmStay
Declare variables.
Local for this procedure.
Set StayState to CheckedIn and
set all its RoomStates to CheckedIn
Compute SQL
Repeat to End Of File
Update FindGuest window
Me.Recordset.Move (0) ‘ Save records
Forms!frmFindStay!subStayList.Requery
end of the set. If the record set is empty, EOF is True 
from the beginning and the loop terminates immedi-
ately. 
Updating a record. The first statement inside the loop 
starts editing the current record. VBA transfers the 
fields to an edit buffer. If we don't transfer the fields to 
the edit buffer, the program can read the fields but not 
change them. 
The next statement changes the state of the RoomState 
record to 2, meaning CheckedIn. The change takes 
place in the edit buffer - not in the database table. No-
tice the bang-operator that ensures that we get the field, 
not a possible built-in property. 
The rs.Update statement transfers the changed fields to 
the database table. At this time Access checks that 
mandatory fields are filled in, that referential integrity 
is okay, etc. There are several ways the program can 
catch these errors so that the user doesn't see the cryp-
tic messages produced by Access. See sections 5.5.10 
and 6.1. 
Move to next record. The rs.MoveNext statement 
moves to the next record, that now becomes the current 
record. If there is no next record, EOF becomes True 
and the loop will terminate. When EOF is true, there is 
no current record in the record set, and attempts to 
address fields in it will fail. 
Updating the stay record. When the loop is finished, 
the program sets Me!state to 2, thus updating the stay 
record as well. 
Close the Recordset. The last statement closes the re-
cord set. It is customary to do so, but in this case it is 
unnecessary. When the procedure returns, VBA will 
delete the local variables. Since rs contains a reference 
to a record set, it will close it before deleting rs
Try the program 
6.  Close the program and try out the CheckIn button. 
You should see the state field change in the stay 
window. 
7.  To ease experimentation with the system, program 
the Book button so that it  does exactly the same as 
5. Access through Visual Basic 
103
VB.NET TWAIN: VB Code on Image TWAIN Acquisition Object of
been perfectly designated to offer users the best image TWAIN supporting file (like png, jpeg, bmp, gif & pdf). the TWAIN scanned image into the way of local
create a fillable pdf form from a pdf; pdf form creation
C# Image: Zoom Image and Document Page in C#.NET Web Viewer
This "Best Fit" function will help developers and users To put it in another way, after you activate powerful & profession imaging controls, PDF document, tiff
change font in pdf form; allow saving of pdf form
CheckIn, but sets the states to one, meaning 
Booked
Update the stay list. You may notice that the Find-
Guest window doesn't update its own stay list auto-
matically. In this list, the stay doesn't seem to change to 
CheckedIn, etc. It is tempting to repair it by letting 
CheckIn make a requery on the stay list. Try it: 
8. Insert this statement at the end of the CheckIn and 
Book procedures: 
Forms!frmFindStay!subStayList.Requery
9. Try to book and check in while watching the stay 
list. Nothing changes in the list. Why? 
Because the stay state is not yet saved in the table. 
Saving doesn't happen until the user closes the stay 
window, but at that time the Requery has been per-
formed already. 
One way to deal with the requery is to do it in the 
AfterUpdate procedure for the stay form. This event is 
intended for things to be done after the update, i.e. after 
saving the stay and guest records from the query. How-
ever, in our user dialog we don't want the user to close 
the stay window all the time. He might want to change 
other things for the stay. Here is a tricky way to update 
the stay record before doing the requery: 
10. 
Insert this magical statement in CheckIn and Book 
just before the Requery: 
Me.Recordset.Move(0) 
This statement works on the open recordset bound to 
the form. It moves current record back or forth a num-
ber of records, and as part of this it saves the current 
record. In our case we move zero records away - to the 
same record. But we got the update anyway. (See more 
in section 5.6.3.) 
11. Try to book and check in while watching the stay 
list. It should now update automatically. 
Notice that this version of CheckIn and Book is very 
experimental. In the real system we have to check 
many things. For instance we shouldn't be able to book 
someone if he hasn't any rooms. The action of Book 
should also depend on the current state of the stay, for 
instance so that if the user tries to book a stay that is 
checked in, the system asks him whether he wants to 
undo the checkin. 
5.6.2 How the record set works 
Figure 5.6B shows how a record set works. The record 
set consists of a record list and some properties for 
navigating in it. The current record is the one the pro-
gram can access with rs!fieldX. The operations 
rs.MoveNext
and 
rs.MovePrevious
move current one record ahead or back. There are other 
Move operations too: 
rs.Move(n), rs.MoveLast
and 
rs.MoveFirst
The first one moves current n records (forward or 
backwards depending on the sign of n). The next two 
move current to the last or first record in the record set. 
If the program tries to move beyond the last record, 
rs.EOF becomes True. If it tries to move before the 
first record, rs.BOF becomes True. 
In order to edit the current record, we have to move it 
to the edit buffer with the operation 
rs.Edit
When we have finished editing it, we move it back to 
the record set with 
rs.Update
If we move to another record without using rs.Update
the changes will be lost. 
Clone. Figure 5.6B also shows a Clone object. It is 
another set of navigation properties working on the 
same record list. It has its own current record pointer. 
By means of clones, the program can access several 
records in the list at the same time. It may for instance 
compare two records in the list, one accessed with the 
record set and one accessed with the clone.  
To the right in the figure, you see how a Clone is cre-
ated and used. You declare the clone rc exactly as a 
record set. However, instead of opening the clone, you 
ask the record set rs to create a clone of itself. You may 
now use rc exactly as the record set itself, for instance 
moving the current record of rc back and forth. We 
have shown how you could compare the current record 
of rc with the record of rs
Add a record. The figure also shows how to create 
new records. First we use rs.AddNew to fill in the edit 
buffer with a Null record. Next we fill in the fields we 
want, and then we use rs.Update to create a new record 
in the record set and transfer the edit buffer to it. Be-
fore doing rs.Update, Access will check that referential 
integrity is okay, that mandatory fields are filled in, etc.  
Delete a record. Finally the figure shows how to de-
lete a record. We simply use rs.Delete. After this there 
is no current record. When we execute rs.MoveNext
the record after the deleted record will be the current 
record.
104 
5. Access through Visual Basic 
VB.NET PowerPoint: Merge and Split PowerPoint Document(s) with PPT
merging control in VB program, we can create a new Then the best way to reach this target is to use a Note: If you want to see more PDF processing functions in
cannot save pdf form; acrobat create pdf form
VB.NET Image: VB.NET Rectangle Annotation Imaging Control
annotate source digital document image file in a programming way? Therefore, if you want to create a customized rectangle annotator SDK will be your best choice
create a pdf form online; change pdf to fillable form
. . .
Dim rs As Recordset, rc As Recordset
s = "SELECT * . . . “
Set rs = CurrentDb.OpenRecordset(s)
Set rc = rs.Clone
If rs.roomID = rc.roomID Then . . .
While . . .
rs.AddNew
rs!fieldX = . . .
rs.Update
rs.MoveNext
Wend
While Not rs.EOF
rs.Delete
rs.MoveNext
Wend
Fig 5.
6B
Recordset
, clone, add and delete
Delete
records
Add
records
BOF
EOF
Edit buffer
MovePrevious
Current record
MoveNext
Edit buffer
Clone
MovePrevious
Current record
MoveNext
Recordset
Recordset
5. Access through Visual Basic 
105
C# PDF Text Box Edit Library: add, delete, update PDF text box in
A best PDF annotator for Visual Studio .NET supports to add Able to create a fillable and editable text box to Adding text box is another way to add text to
pdf form change font size; add picture to pdf form
C# PDF Markup Drawing Library: add, delete, edit PDF markups in C#
A best PDF annotator control for Visual Studio .NET This demo code illustrates the way of adding page = (PDFPage)doc.GetPage(1); // create the annotation
pdf form save in reader; convert word doc to pdf with editable fields
5.6.3 The bound record set in a Form 
Above, the program has explicitly created a record set. 
However, when we open a form such as frmStay it be-
comes bound to a record set. Can our program refer-
ence this record set explicitly? Yes, it can.  
Figure 5.6C shows how it works. We have opened 
frmStay directly from the database window, and al-
though the form shows only one stay at a time - the 
current record, we can scan through all the stays with 
PageDown. Behind the form is a record set with all the 
stays. We can access this record set with Me.Recordset
Furthermore, Access offers a clone of this record set, 
called Me.RecordsetClone.  
Access uses Me.Recordset in much the same way as 
our program would do with a record set. There are 
small differences, however. When the user for instance 
types something into a field, Access doesn't use the edit 
buffer, but a hidden buffer of its own. (This hidden 
buffer deals with the Value and Text properties of text 
controls.) If our program tries to do something with 
Me.Recordset, Access will first save the hidden buffer 
and call  BeforeUpdate and AfterUpdate for the 
changed record. 
Try the mechanisms at work (also shown on Figure 
5.6C): 
1.  Set a breakpoint in the beginning of the CheckIn 
procedure on frmStay. 
2.  Open frmStay in form view and also open tblGuest 
to see what happens. 
3.  Change a letter in the name field on the form. Then 
click CheckIn. You will now be at the breakpoint in 
the CheckIn procedure. Open the Immediate win-
dow with Ctrl+G and adjust window sizes so that 
you see the guest table, the form, and the Immediate 
window at the same time. 
4.  Notice that the name of the guest hasn't changed in 
the guest table. Now enter this statement in the Im-
mediate window 
Me.Recordset.Move(0)
Notice that this changes the guest name in the guest 
table. What happened? Access was editing the name 
field through the hidden buffer, but now updated the 
record in the table to allow current to move. This is the 
trick we used at the end of CheckIn to update the data-
base and then update frmFindStay. 
5. Try this statement in the Immediate window 
Me.Recordset.MoveNext
The current record moves one record ahead and the 
form will show the next stay. 
6. Use the clone. Try moving the current record of the 
clone with this statement 
Me.RecordsetClone.FindFirst("stayID=740")
This causes the clone to point to the first record with 
stayID=740 (use another stayID to match your own 
data). You cannot see any effect of this on the form, 
because the form is bound to the record set, not to the 
clone. 
7. Now try to move the record set to the same place as 
the clone. To do this we use the Bookmark concept.  
Bookmarks are built-in, unique identifications of 
the records in the record set. They are generated 
when the recordset is opened and don't survive 
closing the set. The property Recordset.Bookmark 
is the bookmark of the current record. You can read 
the bookmark property and set it. Try this: 
Me.Recordset.Bookmark = 
Me.RecordsetClone.Bookmark
The form should now show stay 740 (or the stay you 
have chosen). What happened? VBA read the book-
mark for the current record in the clone. Then VBA 
moved current to this bookmark. 
This approach is often useful when we want to let the 
user move from one record to another, for instance 
based on a complex criterion. The program first finds 
the record using the clone, in that way avoiding that the 
user sees intermediate steps of the search or sees un-
successful attempts. When the search succeeds, the 
program moves current to the right place. 
Me versus Me.Recordset. Notice that we can access a 
field in the current record in two ways: through the 
form with Me.field and through the record set with 
Me.Recordset.field. There are some important differ-
ences between these two approaches. 
If the program reads past the last record in the record 
set, EOF becomes true and there is no current record in 
the record set. If we try to use Me.Recordset.field we 
will get an error message. However, there is a current 
record in the form  - the last record - and we can access 
it in the program with Me.field
If the record set is empty, EOF is true and there is no 
current record in the record set. However, there is a 
Null record in the form, the user sees blank fields, and 
the program can access them with Me.field. The fields 
are all Null and we cannot store anything in them. 
106 
5. Access through Visual Basic 
VB.NET TIFF: An Easy VB.NET Solution to Delete or Remove TIFF File
delete from a TIFF file in an easy way. appreciate your online user guide." Best regards, Charles powerful & profession imaging controls, PDF document, image
chrome pdf save form data; changing font size in a pdf form
VB.NET Image: Tutorial for Converting Image and Document in VB.NET
Image Conversion SDK is your best choice for supports multiple image conversions in a simple way. powerful & profession imaging controls, PDF document, tiff
add text field to pdf; adding text to pdf form
Fig 5.
6C
Me.Recordset
Me.RecordsetClone
BOF
EOF
Edit buffer
MovePrevious
Current record
MoveNext
Edit buffer
Me.RecordsetClone
MovePrevious
Current record
MoveNext
Recordset
Me.Recordset
Me.Recordset.Move(0)
‘ Updates Me-changes.
Me.Recordset.MoveNext ‘ Updates Me-changes. Moves to next record.
Me.RecordsetClone.FindFirst(“stayID=740”)
Me.Recordset.Bookmark=Me.RecordsetClone.Bookmark
Hidden buffer
(Text)
5. Access through Visual Basic 
107
5.6.4 Record set properties, survey 
In this section we give a summary of the record-set 
properties. There are more properties than those shown, 
but they are for special, technical use. Section 5.6 is a 
tutorial introduction to record sets. 
AbsolutePosition (attribute, read and write). The po-
sition in the record set of the current record. The 
first record in the set has AbsolutePosition 0, the 
next AbsolutePosition 1, and so on. Setting Abso-
lutePosition to x will make record x current. If you 
- or a concurrent user of the database - insert or de-
lete records, the Absolute positions may change. 
AddNew( ). Sets a Null record in the edit buffer. The 
Update operation will transfer the edit buffer as a 
new record to the record set. 
BOF (attribute, read only). True if the program has 
tried to move current record before the first record. 
Also True for empty record sets. When True there 
is no current record. 
Bookmark (attribute, read and write). A unique iden-
tification of the current record in the record set. 
You can set the bookmark property to the book-
mark of some other record in the same record set. 
This will make this record current. The method is 
advantageous to setting AbsolutePosition because 
bookmarks don't change when records are inserted 
or deleted. 
Clone( ). Creates a clone object that behaves like a re-
cord set but works on the same set of records. It has 
its own pointer to a current record. Returns a refer-
ence to the Clone object. Example:  
Set cloneRecordset = rs.Clone 
Close( ). Closes the record set and frees the associated 
memory.  
DateCreated (attribute, read only). The date and time 
the current record was created. Only available when 
the record set is based on a table, not on an SQL-
query. This means that it must be opened like this: 
Set rs = currentDB.OpenRecordset ("tblGuest")
(See also OpenRecordset below.) 
Delete( ). Deletes the current record. After Delete there 
is no current record, but after a MoveNext the 
record after the deleted record will be current. 
Edit( ). Transfers the current record to the edit buffer. 
Edits can then take place in the edit buffer. The 
Update operation will transfer the edit buffer to the 
current record in the record set. Any operation that 
moves current record (e.g. MoveNext or Find) will 
cancel what is in the edit buffer. 
EOF (attribute, read only). True if the program has 
tried to move beyond the last record. Also True for 
empty record sets. When true there is no current re-
cord. 
FindFirst(criterion As String). Finds the first record 
in the set that matches the criterion. Makes this re-
cord current. The attribute NoMatch is False or 
True depending on whether a matching record was 
found or not. The criterion is a text looking like a 
Where-clause in SQL but without the word Where. 
For instance "stayID=740". 
FindLast(Criterion As String). Similar to FindFirst, 
but finds the last matching record in the set. 
FindNext(Criterion As String). Similar to FindFirst, 
but searches forwards from the current record. 
FindPrevious(Criterion As String). Similar to Find-
First, but searches backwards from the current 
record. 
GetRows(n As Long). Copies n records to an array of 
variant data. The first record is current. Moves cur-
rent forward n records to the first record after the 
ones copied. If there are less than n records left, 
GetRows only transfers what is left.  
Example: Assume that rs is a record set. The 
records have 3 fields. 
Dim A( ) 
A = rs.GetRows(7) 
' A(f, r) is now field f of record r 
This program piece transfers the next 7 records and 
sets the range of A to A(0 To 2, 0 To 6). The in-
dexes of A are zero-based and A(0, 3) will thus 
contain the first field of the fourth record. 
LastUpdated (attribute, read only). The date and time 
the current record was last changed. Only available 
when the record set is based on a table, not on an 
SQL-query. This means that it must be opened like 
this: 
Set rs = currentDB.OpenRecordset ("tblGuest")
(See also OpenRecordset below.) 
Move(n As Long). Moves current n records away. 
When n>0 the movement is forward, if n<0 back-
ward. Move(0) is useful in bound record sets 
(Me.Recordset) to make Access store the current 
record in the database. 
MoveFirst( ), MoveLast( ). Moves current to the first 
or last record in the record set. 
MoveNext( ) , MovePrevious( ). Moves current one 
record forward or one record backward. If the 
movement goes beyond the ends of the record set, 
EOF or BOF become True. 
108 
5. Access through Visual Basic 
Name (attribute, read only). The SQL query behind the 
record set. In order to define the SQL-statement, 
use OpenRecordSet. 
RecordCount (attribute, read only). Shows the number 
of records in the set that are presently loaded by the 
SQL-engine. After a MoveLast, it will show the 
total number of records in the set. When the record 
set has just been opened, it will be zero for an 
empty set, usually one in other cases. Use EOF as a 
safe way to determine whether the set is empty. 
NoMatch (attribute, read only). Is False or True de-
pending on whether the previous Find operation 
found a record or not. 
OpenRecordSet(s As String). This is not an operation 
in the record set but in a database object. Opens a 
record set and returns a reference to it. The text s 
may be an SQL-statement, a table name, or a query 
name. Examples: 
Requery( ). Re-computes the query behind the record 
set. Useful if the records behind the query have 
been changed by other means than this record set. 
Update( ). Transfers the edit buffer to the record set, 
either to the record from which it came (after Edit) 
or as a new record (after AddNew). 
Dim rs As Recordset 
Set rs = currentDB.OpenRecordset ("SELECT * FROM 
tblGuest WHERE . . . ; ") 
. . . 
Set rs = currentDB.OpenRecordset ("tblGuest")
5. Access through Visual Basic 
109
5.7 Modules and menu functions 
One way to implement functions is by means of com-
mand buttons and the Click event. Another important 
way is through a menu. This section explains how to 
implement menu functions. Figure 5.7A shows the 
principle. 
For command buttons, we utilize that each Form has a 
module with code. In this Form module you write the 
event procedures that responded to clicks and other 
events. For menus, the situation is slightly different - a 
menu doesn't belong to any particular Form. Where 
should we write the procedures that handle clicks in the 
menu? The answer is to make a simple module - one 
that doesn't belong to a form. In this module we write 
the procedures. Next we set the OnAction properties 
for the menu items so that they will call the procedures. 
We explain the details below. 
5.7.1 Create a menu function 
We will show how to implement the menu item Can-
celStay. If you followed the book closely, your hotel 
system should already have this menu point under the 
menu heading Stays, but it doesn't work yet (see sec-
tion 3.5.2). Proceed as follows: 
1. Create module. In the database window, select the 
Module tab. There is no Wizard here to help you 
create a module, so click New in the database 
window heading. You should now be in the VBA 
editor. 
2.  Enter the procedure mniCancelStay as shown on 
Figure 5.7A. The central part of the procedure is 
similar to cmdCheckin (Figure 5.6A), so you may 
simply copy the check-in event procedure and 
modify it. (We use the prefix mni for menu-item 
procedures.) 
The CancelStay procedure uses several new VBA con-
cepts. Look at the first line: 
Public Function mniCancelStay() As Integer 
First of all it is not a Private Sub like the event proce-
dure, but a Public Function. It is public because it must 
be accessible from other modules and from the menu 
mechanisms. It is function because it has to return a 
result. We have arbitrarily specified As Integer mean-
ing that it returns an integer value. The only reason to 
make it a function is that the menu mechanisms insist 
on it being that way. The result is not used for anything 
as far as I can tell. 
The first part of the procedure body tries to find the 
stay that was selected when the user clicked Cancel-
Stay. This statement does it: 
Stay = Screen.ActiveForm!stayID 
Screen is the VBA concept of the computer screen. The 
property ActiveForm gives us the form that was in fo-
cus. Finally, we use the bang-operator to find the 
stayID of this form. 
However, what happens if there is no open stay win-
dow when the user clicks CancelStay? VBA would not 
be able to find stayID and would show strange mes-
sages to the user. It would also halt the program. For-
tunately, VBA has a mechanism that allows us to catch 
such errors: 
On Error GoTo NoStay
After this statement, any error will cause the program 
to continue at the line NoStay. In VBA terms this 
statement has enabled the error handler of the proce-
dure. (See more on error handling in section 6.1.) 
In the line NoStay, the program uses MsgBox to tell the 
user to open a stay window. 
The central part of the procedure is like CheckIn 
(Figure 5.6A), but sets the states to 4, meaning 
Canceled. We might delete the stay and the connected 
room states entirely, but for auditing purposes and 
undo-purposes, we just change the states. By the way, 
it also allows you to experiment with the procedure 
easily, since you can cancel a stay, then book it again, 
etc. 
Note that we set the state of the stay itself through this 
statement: 
Screen.ActiveForm!state = 4 
This will always work since the program has checked 
that a stay form is active. 
Finally, we have to let the program return from the 
procedure without continuing into the error handling, 
where it would ask the user wrong things. The state-
ment 
Exit Funtion
takes care of this.  
3. Save the module. Use File -> Save (or Ctrl+S). 
This saves the module, but keeps it open. Give the 
module the name basCommon for common base 
module
If you just close the VBA window, the window 
disappears and the module is not visible in the database 
window. Very scaring! It is not gone, however, just 
hidden. The VBA window shows it. When you close 
the database, Access will ask for a name for the 
module. Section 5.7.3 explains more about creating and 
naming modules. 
110 
5. Access through Visual Basic 
Documents you may be interested
Documents you may be interested