COMPUTER PROGRAM

Computer programs are of two categories (1)Packaged programs (2)Custom Programs are usually designed for a specific purpose within a particular organization. The main difference between packaged program and custom program is that a custom program can be modified as per the change in requirement but packaged programs generally cannot be modified by the users. Visual Basic is a descendant of BASIC. BASIC (Beginners All purpose Symbolic Instruction Code) VB is the Visual version of basic. VB is also referred to as a Rapid Application Development (RAD) tool.

CREATING PROGRAM’S USER INTERFACE
A programs user interface means part(s) of the program that the user sees and communicate with. When you want to create any program is VB, start with creating a new project. In VB, each and every system that you create is known as a project. A project is a set of files that stores information about the components that make up an appointment program. On starting visual basic a new project window will appear. New project dialogbox has following three tabs: New: Allows to choose one of the several types of project to create. Existing: Allow to open an exsiting project that is already created and saved. Recent: Gives the list of projects that have been worked on previously. This window shows types of projects that can be made in VB.

After that by clicking OK, VB’s design environment will be displayed.

Initially VB displays word “design” in the task bar, it indicates that you are in design made. When you run your program, VB will be in the Run mode. VB applications are comprised of one or more components such as forms, code modules and classes, controls and other components.

VB building Components
(1) (2) (3) Forms Controls Properties Forms and controls are the components that users see and interact with, so these objects are collecting known as program’s visual component. And the program code that the program creates is known as program’s code component.

(1)

FORMS
A form is a container that holds all the other controls like text boxes,

pictures etc that make up part of a program’s user interface. Program can have single or multiple forms. It is possible to create VB program that contains no forms at all. The design time form contains a grid of dots that allows to line up controls easily on the form. Behavior of the design grid can be controlled through the options dialog box(Tool menu, options). Using options dialog box size of the grid can be changed or if can be turned off completely. Automatic alignment of controls to grid can also be turn on / off from options dialog box.

Functions of forms
(1) (2) Forms represent program’s user interface. Forms are the containers for the controls that users works with like text box, buttons etc. (3) Program code related to all the objects on a particular form is stored as a part of form its if.

CONTROLS
Visual Basic controls are objects designed to perform specific tasks. Controls have associated properties, events and methods. Control is just like a mini program that performs certain tasks for you. Controls are prepackaged objects that perform specific tasks. Ex. If you assign 20 size of the text of text box the it will display character of size 20 only for that a text box contains inter code that allows to perform the task. Toolbox for common controls is displays in left pane of the screen.

PROPERTIES
A property is an adjective that describes one specific thing about an object. By changing value of one or more property, object’s appearance can be customized. Form appears as a rectangular window on screen. This window’s appearance can be defined by form properties, like position of form on screen, size of form by width and height properties, content of title bar by caption property. Using some properties it can also be specified that which control buttons will appear in title bar. When any form is saved as a part of a project, VB creates a text file with an FRM extension. This file stores information about form, its properties objects of the form, objects properties and program code that is generated for that form.

Common Properties
Name Index Left Top Height Width Enabled Visible

CONTROLS

(1) Label Control
A label control is used to display text to the user. This control is typically used to identify input areas directly to right or below the label. Common properties of label : font, fore color, height (0) (1) (2) Appearance : O-flat / 1-3D Alignment : To align text left, right / center within the label. Auto size : This property will automatically size (True/ false) the

control to the height and width of the text that is displayed in it. (0 None, 1 fixed size) (3) (4) (5) (6) (7) Border style : displays border around the label Caption : Name : Visible : display text inside the label. To identify the name of the control. Indicates whether the control is visible True/False.

Word Wrap : It set to true, this property or not allows True/False the caption to wrap to another line.

(2) Text Box Control
A text box control is used to retrieve information from the user when any new textbox is added in the form it’s name and text property is set to “taxation”.

Common text box properties
(1) Enabled : True : The user may type text into the text box. False: The user will not be able to type text in text box or more the cursor into the textbox. The control will be grayed. (2) Locked : True : User may move cursor into the textbox but will not be able to change any of the characters. The textbox will not be grayed. (3) Maxlength:To set the maximum number of characters the user will be allowed to type in the text box. If it is, set to 0, any number of characters up to 2,048 can be entered. If multiline property is true then up to 32kb text may be input.

(4) Multi line :

True : The user may scroll the text box up and down but not left and right.

(5) Name : (6) Scroll bar :

To assign name to the control, to be referred to in code. To display horizontal or vertical or both scroll bars on the text box. Typically used with multi line property.

(7) Tab Index :

It is set to the number that reflects the order in which you want to have your users tab through all the controls on the form.

(8) Tab stop :

True : Textbox control gets focus as the user tabs thru controls on the form. False : Text box will not focus thru tab but can be focused using mouse.

(9) Tool Tip Text : Textual value of this property will be displayed as a tool tip when user keeps cursor over the textbox for a few seconds. (10) Visible : Indicates whether the control is visible or not.

(3) Command Button Controls
A command button control is used to perform some action on a form. User can click command button with the mouse or tab to it and press spacebar. When command button is clicked, it will generate an event programmer can write code in that event to perform an appropriate action.

Common properties
(1) Cancel : If it is true, then it generates its click event when ESC key is pressed only one command button on a form may have this property set to true. (2) Caption : The text in this property is displayed on the command button. If and is placed before any letter in caption, that letter will have underline and user can press Alt + that letter to have click event of that button.

(3) Default : True : When user presses Enter key then click event will be tired. Only one command button on the form may have this property set to True. (4) Enabled : True – user is able to click on button false user is not to click on button is grayed. (5) Cause Validation : True : This cause validate event on other controls to occur. It not is numeric (Text 1) Then MsgBox “Please enter another” (6) Name : To assign name, that is used to refer to the command button in your code. (7) Style : 0 – standard – to display text on button 1 – Graphical – to display a picture on the command button. (8) Picture : Can be set to a bitamp, GIF / JPEG file if you want to display picture on the command button instead of the text in the caption.

(4) Option Button Control
An option button / radio button is used to create manually exclusive options. Ex : If users wants to design system for online shopping and in that payment mode field will be there, by credit card direct transfer by debit card

At a time, user should be allowed to select only on options from given options. It more than one group of option buttons are need to added then group options buttons by placing each group in separate frames.

Common Option button properties
(1) Alignment : Right justify Option button will appears on the right side to text left justify option button will appear on the left side of text.

(2) Name :

Set this property to the name you want to use in code preface name with option.

(3) Caption :

Set this property to the text that you want to display with the option button.

(4) Style :

0 – standard – To display text beside the option button. 1 – graphical – To display a picture beside the option button.

(5) Picture:

This property can be set to a bitmap GIF or JPEG file. The selected picture will be displayed beside the option button instead of text.

(6) Value:

If it is set to true, the option button is selected by default. Only one option button in a group can have, true value.

(5) Check Box Control:
A checkbox allows the user to select one or more choices from a list of values. These choices are not manually exclusive, user can select multiple values at a time. Common Checkbox Properties: (1) (2) (3) (4) (5) (6) Name Caption Alignment Picture Style Value  0 – Unchecked 1 – Checked 2 – Grayed means checkbox is not available.

Frame Control:
The frame control allows to insert a group of controls into a box and add a caption to describe the purpose of these controls. It’s a contain into a frame, those controls can be identified as part of a group.

[ A container control is any control that acts as a parent to all the controls within it].

Common Properties:
(1) Caption : Set this property to the value you want to display on the top-left side of the frame. (2) Enabled: If it is set to false so all the controls in the frame are disabled. (3) Visible : If it is false then all the controls in the frame will become invisible. (4) Border style 0 - None – No border 1 – Fixed single If border style is set to none then no border is displayed and the caption is also not displayed because it is also a part of the border. If you change the control on the frame that are already on the form then those controls are not contained by the frame. Controls cannot be moved in or out of the frame by change & chop method. To move the control from other part of the form into the frame, cut that control and paste it in the frame.

List Box control:
A list box control is used to provide a list of items to user form which user can make choice. User can make selection only from the available items. New items can not be added by the user.

When it is added to a form, it will look as it is shown in the figure. A vertical scrollbar is added to listbox automatically when more items are added to it.

Properties: List property is used to add the items to the listbox at design time. It’s an array of items added to the list box control. Name property is used to assign meaningful name to the listbox control. Preface the name with ‘lst’. Columns property is used to display list items in more than one columns to avoid vertical scrollbar. It’s default value is zero. Set this property to a value greater than zero to create more columns.

Sorted property: Set it to true to display list items in a sorted order. If it is false then items will be displayed in an order in which they are added to the listbox. MultiSelect Property : 0 – None : User is allowed to select only one of the available items at a time. 1 – Simple : User can select multiple items at a time through mouse clicks. 2 – Extended : After first selection user has to hold down Ctrl key for more selection. Shift key can also be used to select all items between the first selection and last selection IntergalHeight Property: If it is true, the listbox calculates the number of rows it can display and keeps the height of listbox so it can display only full rows of data without cutting a row in half. If it is set to false, the list box can be set to any size of your choice.

Style Property : 0- Standard 1- Checkbox. Example:

Combo Box Control:
Combo box is a combination of a text box and a list box. It also gives list of items to user from which user can do selection. The list of items will be displayed in a drop down box when user clicks on the combo box. User can also type the new item that is not available in the list.

Properties:

List property is used to add the items to the combo box at design time. It’s an array of items added to the combo box control. Name property is used to assign meaningful name to the combo box control. Preface the name with ‘cbo’. Sorted property: Set it to true to display list items in a sorted order. If it is false then items will be displayed in an order in which they are added to the combo box.

IntergalHeight Property: If it is true, the combo box calculates the number of rows it can display and adjusts the height of combo box so it can display only full rows of data without cutting a row in half. If it is set to false, the combo box can be set to any size of your choice. Style Property: 0 – DropDown Combo: With this style, user can either type text into the text portion of the combo box or select a value from the drop down list. 1 – Simple Combo: This style will not give list of items as a drop down list but it provides it in form of list box only. This will require more space on the form.

2 – DropDown List: This style allows to select item only from the available list. It does not allow to type any text in the text portion.

Timer Control :
The timer control works like a stopwatch or an alarm clock. It executes code written in it’s timer event, when the specified interval is complete. It counts down repeatedly as long as the enabled property is set to true.

Properties: (1) Enabled: True then timer control enabled of the code in the timer event is executed at the end of the time specified in interval property. (2) Interval: Set this property to any value between zero & 65,635. If it is set to zero then timer control is disabled. Time can be specified in milliseconds. Ex:Private Sub Timer1_timer( ) Picture. Left = Picture1.left + 100 If picture. left > Form1.width Then picture. left = 0 End sub. In VB, two control are available to display picture on the form. Image control & Picture box control.

Image Control:
This control allows to display picture of the form, that can be placed anywhere on the form. To display image within image control, picture property is used. Another important property of image control stretch. If stretch-false the image control is automatically resized to fit the picture within it . If it is set to true, the picture is automatically resized so that the entire picture fits with in image control’s boundaries.

Picture Control:
It can be used as a container for other controls. Controls within a group can be treated as a group. It will more or resize with from. The main difference between picture box & image control is that the picture doesn’t allow resizing of the picture. It shoes only as much of a picture as if can fit in its current bound. Authorize  True – Resize the picture box so it can fir the entire picture with if.

Align  More /Align left / Align Right / Align Top / Align Bottom. To make picture control align or not align to the sides of from.

Responding To The User With Event Procedure:
Visual basic is an event driver programming means the flow of program execution is controlled by the events that occur as the program is running. Most of the events are generated by actions initiated by the users. Some events are invoked by other objects or by program it self. Program events can be triggered by actions such as the user clicking a mouse button, pressing a key, moving the mouse, changing value of information in a control or switching to another window in the program. Set the name property of all controls prior to writing source code of them. Event procedures are bits of code that ran when something happens, to a form or control. An event procedure must be defined in a very specific format.

Common Events:
(1) Click : This event occurs when users clicks a particular control of form. (2) Change: This event occurs when data in a text box or a combo box is changes. (3) DblClick: When user double clicks a control or a form. (4) Gotfocus: This event happens as user tab into a control. When an object receives focus. (5) LostFocus: When user move form one control to another. (8) KeyDown: A key is pressed while an object has the focus. (9) KeyPress: A key is released while an object has the focus. (10) KeyUp: A key is released while an object has the focus. (11) MouseDown: A mouse button is pressed while the mouse pointer is over an object. (12) MouseMove: The mouse cursor is moved over an object. (13) MouseUp: A mouse button is released while the mouse pointer is over an object. Ex: Form1. Caption = Mouse Co-ordinates Are (“& x &”, “& y &”)

Form Events:
(1) From Initialize( ) This is the first event to occur when user presses F5 or Run Button to start application. This event invokes show method on the form NO controls are yet loaded. Generally used to initialize memory variables. (2) Form Load ( ) In this event, the form is loaded into memory. Form & control are loaded in memory this event is used for setting properties at runtime. Ex: Private sub form_load( ) Picture1.widhth=100 Endsub. (3) From Resize ( ) When form is resized by user at runtime or by succeeded. (4) Form Activate ( ) Occurs when form gets focus. (5) Form Deactivate ( ) Occurs when form losses focus. Ex: Private sub form_Deactivate ( ) Command.Enabled = False EndSub. Private sub form_Activate ( ) Command.Enabled = True. End Sub. (6) Form – Unload ( ) It occurs before a form is unloaded. (7) Form – Terminate ( )

It is the last event to five when a form is unloaded. This event is used to clean up variables that are initialized in form – initialize event.

Text Box events:
(1) Textbox-Change( ) When user types something in the textbox. Ex: Private sub txtname – change ( ) CmdSave.Enbled = true. End sub.

Command Button events:
(1) Command Button _Click( ) Label Events: (1) Change ( ) (2) Click ( ) Frame Events: (1) Click ( )

Option Button Events:
(1) Option Button _ click ( ) Private sub optpass _ click ( ) Msgbox “congrats!!!” Endsub Private sub optfail _click ( ) Msgbox “Don’t be sad..” End sub

Checkbox events:
(1) Check Box _click ( ) : Fired when checkbox is selected.

List box events:
(1) List box _ Click ( ) : If simple list. (2) List Box _ Item check ( ): If checked box list.

Combo Box events:
(1) Combobox_change ( ) : Fired when user types something in combo box text portion. This event will only fire if the style property is set to 0 or 1. (2) Combo box _Click ( ) (3) Combo box _DropDown Occurs when user opens the dropdown portion of the combo box. If style property is set to 0 or 2.

Picture Control & Image Control events:
(1) Picture _Click ( ) Ex: Private sub pic_click ( ) FrmNew.Show End Sub.

MENUBAR :
Menu are used to present multiple choices & actions to perform for a user. Menu are designed for those users who need to or prefer to user the keyboard. In V.B. menu system can be easily & quickly created with the menu editor. The first step in creating a menu is determinig that what program commands are needed to be on the menu and how these commands should be organized. Windows system generally have common menus like, file Edit,. Format, Tools, View, Help etc. Menubar can be created using menu editor. Ways to choose menu editor, (1) Click the menu editor button on standard tool box (2) Tolls  Menu editor (3) Press Ctrl + E

Menu Properties (Controls):
(1) Caption : The text that is displayed in the menu item. Access key can be specified by placing an ampersand before the appropriated letter of the caption. (2) Name : To identify menu item in code preface name with mnu. To define shortcut key combination that allow users to select item with keystroke. (4) Checked: If it is selected then a checkmark appears to the left of the menu item’s caption. (5) Enabled: True/False, to enable or diable menu item. (6) Visible : (7) (8) (9) True/False, to make menuitem visibl or invisible on form.

(3) Shortcut Key:

: To create submenu items. : To move back to previous level of menu and : To change position of a menu item.

Creating Pop Up Menu :
A pop up menu is a menu that appears anywhere on form in response to a program event . To create popup menu, create a top level menu item with visible property set to false. Menu items add under this menu as submenu will be displayed on the popup menu. Popup menu are generally displayed on mouse night button click So, to set this write code in MouseUp event of form And to make this menu work as a popup menu, popupmenu method should be invoked. Write the following code in the MouseUp event of form: Private Sub Form_MouseUp If Button = vbRightButton Then Form1.PopupMenu mnuEdit End If End Sub Here mnuEdit is the name of menu. Here first check whether the button pressed is the right. Mouse button by comparing the argument button with vbRightButton. If they are equal, then popup menu method will be invoked for form1 with mnuEdit menu.

 DIALOGBOXES: A dialog box is a window used to display / accept information to / from user. The use must answer the dialog box before continuing with any other part of the program.  Message Box A message box is generally used to provide warnings or an error message that requires immediate attention of the user. It’s a simple form that displays a message and at least one command button. The button is used to acknowledge message & close the form.  Syntax Msg box (prompt [,Buttons] [,title] [,helpfile, [outext]) Prompt: Required string expression displayed as the message in the dialog box. Maximum length – 1024 characters. Buttons: Optional the type of buttons to display the icon style to use. Default value is O which causes only an ok button to be displayed Title : Optional string displayed in the title bar of the dialog box. If omitted, the appn name is placed in title bar. Help file : Optional to set the help file for the & context appn There can be form groups in button argument.

1. First group : Determines type of button Vb ok only Vb ok cancel displays ok button Display ok & cancel buttons

Vb Abort Retry Ingnore – Display Vb Yes No Vb Yes Cancel Vb Retry Cancel

2. Second group determines type of icon to display

Vb critical

-

Vb Question

-

Vb Exclamation

-

Vb information

-

3. Third group determines default button Vb Default Button – 1 Vb Default Button – 2 Vb Default Button – 3 Vb Default Button – 4 First button is default Second button is default Third button is default Forth button is default

Ex :- Massage Box “Hello” Project Hello OK X

Massage Box “The last name must not be blank” Vb Exclamation “Last name” Last Name The Last name . . . . . . OK X

Massage box “data base error”, Vb critical, “Update Table” Update Table X

Data based error . . . . . . OK

Massage (“Are you sure?” Vb yes no + Vb Question, “Quit”) + Vb Default button2 Quit Are you sure Yes No X

In Exit button’s click event, If MsgBox (“Are toy sure?” Vb yes not Vb Question “Exit”) = Vbyes then End End If

User Name Pass word
Continue Exit

In continue button’s click event, If txtpassword.text = “ “ or txtUserName.text = “ “ then Massage box (“You must provide password”, VbExclamation, “Password”) End If  Making Massage box model : When a model massage box is shown, it must be closed before continuing with the program. When massagebox is model to system the user must respond to massage box doing any further work on the computer at all.

VbApplicationModal Vbsystemmodal

Input box :
The inputbox is used to get a single piece of information from the user, like, name, filename or a number etc. The input box display prompt, telling user what to cuter, a textbox where use can eater the requested information and two command buttons ok & cancel. Title Prompt
OK Cancel

X

Prompt can display up to 1024 characters & user can enter upto 255 characters of text in the input box’s text box. Input box returns a string kind of value so, to store it define a string type of variable. After cutering the data is textbox when, user clicks ok button, the input box returns text in the text box whether it is new text or the default text. If user selects cancel button then it returns null string, regardless of what is stored in the text box. If you are expecting a numeric value in the input box then use val function. If the string contains or starts with numbers then val function returns that numbers than string doesn’t start with a number, the function returns zero.

Str = InputBox (“Enter your Name”) If Len (str) = O Then Massage box “No name was chtered” End if

 USING DEFAULT DIALOG BOXES
VB allows user to use standard windows dialog boxes like font dialog box, open, save as, print etc. . . common dialog control is used to enter this kind of dialog boxes. It allows user to access following standard dialog boxes. 1. Open 2. Save as 3. Font 4. Color 5. Print To access common dialog control, first of all add this control in the toolbar and to your project. This control can be added by project menu components dialogbox. From components dialog box, select “Microsoft common dialog control 6.0.” So one button will be added in the common tool box. Click this control & draw if on

the form. It will appear as an icon on the form but it will not be displayed when you will run the project. Using this icon different different dialog boxes can be added. For that go to it’s property page by right clicking on icon & selecting properties or from property window go to custom property. Open Save Color Font Print Help

OK

CANCEL

APPLY

Now let’s consider one example in which we will add dialog box to open a file.

Open file CommandOpen

Common dialog control (CdTest) In click event of command open, CdTest.Showopen To display Save As dialog box, CdTest.showsave The file that user selects from open dialog box is store in the filename property of open dialog box. To access it, CdTest.filename

 TOOLBAR
Toolbars provide an easy way to access the must commonly used functions of the project. Toolbar control allows to create six different types of buttons ; 1. Push buttons 2. Check buttons 3. Button group 4. Place holder buttons

5. Drop down buttons 6. Separator buttons To chew a toolbar on the form, first add the tool that allows to toolbar to the toolbox, Project  components  Microsoft windows common controls 6.0 It will add 9 different buttons (tools) to the toolbar select tool for toolbar & draw it on form. By default, it will be aligned to the top of the form but alignment can be changed by changing align property. 1 - VbAlignTop – Default 2 – VbAlignBottom 3 - VbAlignleft 4 - VbAlignRight 0 – VbAlignNone – Free floating toolbar In toolbar some images are required to be displayed on buttons. So, to get this image first of all imagelist should be prepared for it.

* IMAGELIST :
Imagelist control allows to add bitmaps, that can be used by other controls of the project. Image list control is also a part of Microsoft windows common controls 6.0. so, if you have added this component to you project than image list is also there in toolbox. (So, First of all prepare a image list with bitmaps that you want to display on button) First step in creating toolbar is adding the images that will be displayed on the toolbar. To prepare an image list 1. Draw an imagelist control on your form and assign a unique name to it. (If will appear as a small icon on the form)

2. Open property pages dialog box of image list by right-clicking the image list selecting properties. Select image page in the dialog box

3. To add an image to the image list, click the insert picture button. So it will open select picture dialog box, from which the bitmap can be selected. As the picture is selected, it is added to the image list & displayed in the images cruel 4. Click ok button after adding all the images. Now, image list control is ready to supply images to the toolbar. (appearance) Now, set the properties of tool bar by making required changes in properties of toolbar. Right click on toolbar and select properties to get property dialog box. In first page, it will display several properties like. 1. Imagelist – set it to the name of imagelist control that is created to provide images 2. 3. Button Height : Hight of buttons in toolbar (in twips) Button width : Width of toolbar buttons

[twip is 1/20th part of a point]

4.

Allow customize – check box – determines whether the users are allowed to add, delite or move button.

5. 6.

Showtips – checkbox – tooltips are shown or not Wrappable – checkbox – toolbar wraps around second row of buttons or not

7. 8. 9.

Enabled – check box Style – tbrstandard – 3D toolbar Borderstyle = None – No border = 1 – fixed single – fixed size single border

10. Text alignment – 0 – button 1 – Right

to align text with the button image

11. Disabled image list : Image list to provide images for buttons with enabled property set to tales. Now to add buttons go to the second page of properties dialog box. To add button, click insert button. Now, change its key property to specify the name that is used to identify button in code. Image Property specifies the index of the picture that you want to appear on buttom. Style property to select style (type) of button STYLE : 0-tbrDefault – push button 1-tbrcheck – check button 2-tbrbuttongroup – button group 3-tbrseparator 4-tbrplaceholder Caption – text to be displayed below the picture giveing button description. Tool tip text Value – Returns the current state of the button – tbrPressed / tbrUnpressed

To add items to chopdown button menu, click the insert button menu and enter menu item in it’s text property. B I U Ex :

Private sub TblTest_Button click (By val button as MSComct/LibButton) If Button.key = “Bold” then Text1.font.bold = true Else Text1.font.bold = False End of Else If Buttom.key = “Italic” then If button.nalul = tbrpressed then Text1.Font.Italic = True Else Text1.font.italic = False Else If Button. Key = “Uline” Then Textt.font.Underline = True Else Text1.font,underline=false End IF End if

 Variables : Syntax of variable declaration : (Data type) Dim variable name As variable type

Dim statement is used for declaring (dimensioning) variables. Restrictions in naming variables : 1. The name must start with a letter, not a number or other character. 2. Variable name can contain letters, number of under core character. Spaces periods or other punctuation characters are not allowed. 3. It must be unique within variable’s scope. 4. Maximum 255 characters can be there in var-name 5. It cannot be any of VB’s reserved words.

TYPES OF VARIABLES :
1 2 3 4 5 Integer Bytes Single Double Currency 2 bytes 1 byte 4 bytes 8 bytes 8 bytes -32, 768 to +32,767 0 to 255 Single precision nos. Double precision nos. 15 fixed point nos. digits before decimal point and 4 digits after decimal point. 6 String 1 byte per Maximum 65,400 char for fixed length sting & upto 2 billion length. 7 8 9 10 Boolean Date Object Variant 2 bytes 8 bytes 4 bytes 16 bytes + 1 byte / char User defined types can be created using type statement True / False Date & time information Instance of classes characters for var-

char

Sytax Private Type Variable list End type Ex. Private Type Rectangle Length As integer Width As integer End type Dim My Rect as rectangle My Rect. Length = 10 My Rect. Width = 5 Type Name

Variable Declarations : If a variable is not delared, VB create the variable using data type, which can contain any type of data. Draw backs – wastage of memory space If might be invalid with fun that requires specific data type. There are two ways to declare a variable in to,

1. Explicit declaration : Just defending variable names with their data types, without assigning value to the variables. Dim, private, static, public keywords can be used for explicit declaration. Dim varname as type, varnamez as type vanames as type.

2. Implicit declaration In implicit declaration, a special characters is used at the end of variable name where the variable is first assigned a value.

Variable type Integer Long Single Double Currency String Num % Names $ = =

character % & ! # @ $ 10 “xyz”

If declaration character is missing than that variable will be of variant type.

Fixed length strings : Strings declared thru implicit or explicit declarations are variables length strings, that can store upto 2 billion characters. Fixed length string can also be defined by specifying length within the declaration statement. but it can have maximum 65,400 characters. Syntax : Dim varname As string * str length Ex. : Dim name as string * 20 Now if name variable is assigned less than 20 characters than reaming length will be filled with blank spaces & If expression is longer than the variable, then remaining characters are truncated (discarded) If can be used with database.

Scope of variables :

By default, a variable that is implicitly declared is local to the procedure in which it is created with explicit declaration, scope of variable can be defined. For global declaration use public keyword in declaration statement. Ex. : Public uName as string Variables declared as public var, are available anywhere in the program. It is used to pass information between forms.

Local Variable : Dim or private keywords are used to declare local variables. If variable is declared with Dim statement than its local to the current procedure if it is declared as private then it is local to current form. But it variable is defined in general declarations section of a form or module then the variable is available to ever procedure in that form.

Static variables : Static variables are the variables that retains their value offer the completion if procedure . Ex : Static fact As integer If function is declared as static then all the variables of that function become static.

Variable Array : Dim varname (Range) As varitype Ex. Dim Roll_no (1 to 100) As Integer Dim Marks (1 to 10) As Integer, count as integer For Count = 1 to 10 Total = Total + marks (count) Next count

Constant declaration Constant is ta variable whose value cannot be changed once it is defined. Contents cannot be modified, after you define them. if you try to modify. VB generates runtime errors. Syntax : Const varuname = value Ex. Const pie = 3.142

OPTION EXPLICIT STAEMENT By setting environment option, VB can give error message if variable is being used without declaration. Tools  options  require variable declaration Selecting this option requires declaration of each variable before use. Selecting this option causes the option explicit

statement to be placed in general declaration section of all new modules & forms that are added to project. If a form or model contains option explicit statement and you fail to declare a var, then you receive the error to declare a var, then you receive the error message, variable not defined at runtime.

 Math Operations : Addition Subtractim Multiplication Division Integer Division Modulus + * / \ mod

Exponeatiotim

^

Ex. MFCS – II

Visual Programming

Java Programming

DBMS

DCN

Total

Percentage

Class

Calculate Result CmdResult click ()

CmdResult

Dim MFCS As integer, VP As integer, JP As integer, DBMS As integer, DCN As integer, Result as single MFCS = Val (txtMFCS.text) VP JP = Val (taxVP.text = Val(txtJp.text)

DCN = Val (txtDCN.text) Total % = MFCS + VP + JP + DBMS + DCN Result = Total / 5 txt total.text = Result & “ % ”

If result > 70 then Lbl class.captim “Distinction” Else If Result > 60 Then lblclass.captim = “First class” Else If Result > 50 Then lblclass.captim = “Second class” Else If Result > 40 Then lblclass.captim = “Pass class” Else lblclass.capion = “Fail” End If. OR Select case Result Case Is > 70 lblclass.capion = Case 61 t0 70 lblclass.capion = Case 51 t0 60 lblclass.capion = Case iS > 40 lblclass.capion = Case is < 40 lblclass.capion = End case. Example First No.

Second No.

Simple Division

Integer division Calculate

To search a string within any string, use insert function insert returns starting position of the word. Syntax Instr (Start position, source string, search string, flag) Optional Flag = 0  default case sensitive search Flag = 1  case insensitive search

String Factions : (1) String $ () Retinues a string made up of a specific number of characters. Syntax String $ (No. of chair, “Character”) (2) Instr() – Instr(Stat pos, string, serch str, flag (3) InstrRev()(4) Left$ () – Left $ (String, No. of char) (5) Right $() – Right $ (String, No. of char) (6) Mid $ - Mid $ (String, Start pos, No. of char) (7) Len () – Len (String) (8) Replace – Replace (String, “original”, “New”) (9) Trin $ - Trim $ (String) (10) LTim$ - LTRim$ (String) (11) RTrim$ - Rtcase$ (String) (12) Ucase $ - Ucase$ (String) (13) Lcase $ - Lcase$ (String) (14) Space $ - Space $ (No of blank spaces) (15) Str () - Str $ (Numeric value)

(16) Str Reverse $ ()

Ex : Str$ = Input Box (“Enter your Branch Name”) Ustr = VCase$ (Str) Msg Box “Oh! You are the student of BCA!!” End If

 DATE FUNCTIONS : (1) Now – Returns a varicant type of date/time stamp in timer event with interval of 1000 ms. Ex. – lb/time caption = Now (2) Date() / Date $() – Returns date, In dd/mm/yy format & date $ returns is string in dd-mm-yyyy format Lbl.capim = data (3) Time / Time$() H : M : Second (AM/PM) (4) Date Part () Return specified part of date. Dim dtToday As Date dtToday = Now month % = Date Part (“m”, dt today ) day % = Date Part (“d”, dt today ) year % = year Part (“yyyy”, dt today ) dotweek % = Date Part (“q”, dt today ) week % = Date Part (“w”, dt today ) (5) Dim dt as date Date = now Date + 1 Date + 5 (6) Date : Diff() dtz = # 09/13/1981# Dim dt1, dt2 as date dt = now Date Diff. (“d”, dt2, dt1 )

(“m”, dt2, dt1 ) (“w”, dt2, dt1 ) (“yyyy”, dt2, dt1 ) (7) Date Add () dt = now Date Add (“m”, 6, dt ) Date Add (“ww”, 9, dt ) Date Add (“d”, 180, dt ) - Ve number substracts date from given date

Format Functions : (1) Format Currency () Format Currency (Expression, Num Dig its After Decinal, Include leading digit, Use parents for negative, nums, Group Digits) Format Currency (100) (100, 3) (100, -1) = = = $100.00 $100.000 $100.00 [-1 for default]

(0.100, -1, Vbfalse) = $100 (0.100, -1, Vbfalse/Default) = $ 0.10 (-100, -1, Vbfalse) = -$100.00

(-100, -1, Vb True) = ($100.00) (1100, -1, , Vb Default) = (1100, -1, (2) Format Number () Same as currency but without currency symbol (3) Format percent () Format percent (1/3) = 33.33% Format percent (1/3, 3) = 33.333% (4) Format Date time () Vb General Date – mm/dd/yy H:M:Se AM/PM Vb Long Date - Thursday, January 29, 2009 , $1,100.00

,Vb False) = $1100.00

Vb Long Time VB Short Date Vb Short time (5) Round ()

- 8 : 38 : 07 AM - 1 / 29 / 09 - 18 : 38

If no is odd Round up If no is even Round down Round (1.5)  2 Round (2.5)  2 Round (2.865, 2)  2.87 Round (2.865, 1)  2.9

Example

txt name 1

txt Age 1

Enter Name

Birth Date

Enter Name

Birth Date

txt name 1

txt Age 1

Compare

Cmd age

lblresul

cmdage click () event Dim dt1, dt2 As date, diff as Integer dt1 = txt Age1.text dt2 = txt Age2.text diff = Date diff (“m”, dt1, dt2) If diff > 0 then lbl Result. captim = txt name.text & “is elder than” & txtname2.text

Else diff < 0 then lblResult.caption txtname2.text Else lblResult.caption = txtName1 txt & txt name2.txt & both are of same age” A B C D = txtName2 txt & “is elder than” &

Class of then

Total Amount Calculate Bill Discount

Bill with discount

Din bill, amt as single Amt = val (txtamt.text) Select case

 List view To add a list view control to a from follow these steps 1. Select project  Components 2. Select Microsoft windows common controls 6.0 3. Select list view control and draw and draw it on the form 4. Set properties of list view and add code. Adding items to list view : List view items can be added to it’s list items collection using add method. Each item added is a list item object of list item type and then add it to the list view [Name of list view is list view1] Private sub form – Local () Dim Ls1 as list items Set ls1 = list view1. list items. Add() Ls1.Text = “item1” [Here lst is a list item object and that we are adding t olist items collection of listview1 suing add method. After that we are adding text to lst object, using its text property. This text will be displayed in list view.] Each item in a list view is a lsit item object, and each such object has on Icon property. This property is used to display icons with list items. This icons can be accessed from imagelist. So create image list for that. Prepare an image list by adding an icon that you want to display with of List view control allows to add 3 types of limagelist normal, small and Header control. To connect imagelist with list view, go to property pages of list view and select image lists tab. In normal field, set the name of created image list.

This image will be displayed as icons with list items when list view’s view property is set to = o [IVV Icon]. For other values of view property set small icons property. Ls1.Icon = 1  1 is index of image in image list Klhen view property is set to any other value than IVV Icon then small icons will be displayed with list items. To add small icons to list view’s items, first create an imagelist having icons that you want to display with list view items. Then go to property pages of list view and in image lists tab set mall field to the name of imagelist After that in code for each items added to list view, add following statement. Ls1.smallzcon = 1  index of image Set list view’s view property to IVV small Icon and run the appn.

 VIEW TYPES IN LIST VIEW : 1. IVV Icon – 0 : It displays large icons and allows user fo chag & drop & rearrange objects. 2. IVV Small Icon : I – use small icons so more list item objects can be viewed. Objects can be rearranged. 3. IVV list – 2 : Presents sorted view of list items 4. IVV Report – 3 : Presents sorted view with sub items and allows extra information to be displayed

 Adding column Headers : Klhen list view’s view property is set fo IVV report, it can display lists arranged in columns headers to a list view, add column headers with list view’s column headers collection. Dim co/Hd As column Header Set Co/Hd = List view 1. column Headers.Add() Co/Hd.Text = “Name”

Same column Head object can be used to add more than one column Headers : Column Headers.Add (Index, key, text, width, Alignment, icon)

Default

0,

1,

2 Ce nter Right

Left Private Sub form – load () Dim Lstitm As listitem Dim co/Hd As column Header

Set Co/Hd =

listview/column Headers. Add ( , , “Country”, Listview1.width/3)

Set Co/Hd =

listview/column Headers. Add ( , , “Wins”, Listview1.width/3)

Set Co/Hd =

listview/column Headers. Add ( , , “Losse”, Listview1.width/3)

Set lst/Itm = Set lst/Itm = Set lst/Itm =

listview/ list Items. add ( , listview/ list Items. add ( , listview/ list Items. add ( ,

, “India”, 1, 1) , “Pakistan”, 1, 1) , “Australia”, 1, 1)

End Sub Country India Pakistan Australia Wins Losses

 Object.Add (Index, Key, text, icon small icon) List view name.list items 1. Index – a number that position list item within list items collection (optional) 2. Key – to assign name to list item 3. Text – string that is displayed in list view window 4. Icon – Index of icon in Image list for normal view 5. Smallicon – index of icon in “ for small view

Ex. For Simple list : Computer Engineering  EC Engineering Civil Engineering   Faculty of Technology Faculty of Technology Faculty of Technology Faculty of Technology Faculty of Information Science Faculty of Information Science Faculty of Information Science

Mechanical Engineering  IT Engineering BCA MCA   

To add items of other columns Object name.subitems(index) = value Ex. Ls/.subitems(1) = “04” Ls/.subitems(2) = “00” Or list view/.listitems(1).subitem (1) = “04” list view/.listitems(1).subitem (2) = “00” o/p India 04 00

 TREE VIEW : DDU Faculty of Technology Computer Engineering EC Engineering Chemical Engineering Civil Engineering Faculty of Information Science IT BCA MCA Faculty of Pharmacy D.Pharm B.pharm

Faculty of Dental Science Form – load () Dim temp as node Set temp = treeview/.nodes.add( , , “Root”. “DDU”) Add (Relative, Relationship, key, text, image, selected image) Relationship – tvwlast - tvwNext - tvwPrevious - tvw child

 Control Array : A control away is a group of controls, all of the same type and that have the same name are identified by an idex.  Each element must be of same type  Each control must have the same name  Each control is identified by unique index up to 32767

Advantages :

1. Requires fewer system resources then adding an individual control of same type. 2. Controls of a array share a common set of event procedures. 3. It’s the only way to add controls to a forms at runtime. 4. More number of controls can be added in a form. After crating a control away, a single piece of code can be written to handle a particular event for all the controls in away. Whenever that event is fired by any of the controls in array that code is executed. Ex. txtArray – lost focus (Index as integer) txtArray (index) = Ucase (txtArray(index).text) txtArray

Name Address City E-mail

: : : :

0 1 2 3

txtArray lostfocus (Index as integer) Infront index = 3 then Txt Array (Index) = Ucase(txtArray(Inxed)text) End if To set right alignment for lblArray(i).Alignment, Form load () For i = 0 to 3 lblArrayy(i).Alignment = 2 Next i

To highlight the lable when matching textbox is having focus, txtArray gotfocus

lblArray(index).font.bold = true txtArray Lost focus

lblArray(index).font.bold=false. To know exact number of controls in array use lbound & Ubound properties of control Array. To add a control dement at runtime, Load statement is used, Load ExtArray (txtArray.Uboard+1)

CODE: Option Explicit Dim i As Integer

Private Sub Combo1_Click() If Combo1.List(Combo1.ListIndex) = "CH" Then i = txtArray.UBound + 1 Load lblArray(i) Load txtArray(i) txtArray(i).Top = txtArray(i - 1).Top + 500 lblArray(i).Top = lblArray(i - 1).Top + 500 lblArray(i).Alignment = 2 lblArray(i).Caption = "Subject 6" txtArray(i).Visible = True lblArray(i).Visible = True End If End Sub Private Sub Command1_Click() Dim total As Integer For i = txtArray.LBound To txtArray.UBound total = total + Val(txtArray(i).Text) Next i Text1.Text = total End Sub

 PARALLEL ARRAYS Two or more difficult control arrays whose elements match with each other in some way are known as parallel Array.

TABSTRIP :

Client Area

Example Personal Educationa l Experience

Client Area

Frame1 (Personal) Name Address City Ph. No. Hobbies Music Traveling Experience Name of firm Post : : Reading Gender  Male  Female

Frame 2 (Education) S.S.C. H.S.C. Graduation Post Graduation Other

Form load () Dim i as integer For i = o to 2 Framel (i).move Tabstripl.clientleft, Tabstripl.clieatiop, Tabstripl.clientwideth,Tabstripl.client Height Next i Frame 1 (0).Zorder 0 Tabstrip . click () Dim index, I as integer Index = tabstripl.selected item. Index For I = 0 + 2 Framel(i) . visible = false Next i Frame 1 (index – 1).Visible = True End sub.

CONTROL ARRAY

CODE: Option Explicit Dim i As Integer

Private Sub Combo1_Click() If Combo1.List(Combo1.ListIndex) = "CH" Then i = txtArray.UBound + 1 Load lblArray(i) Load txtArray(i) txtArray(i).Top = txtArray(i - 1).Top + 500 lblArray(i).Top = lblArray(i - 1).Top + 500 lblArray(i).Alignment = 2 lblArray(i).Caption = "Subject 6" txtArray(i).Visible = True lblArray(i).Visible = True End If End Sub Private Sub Command1_Click() Dim total As Integer For i = txtArray.LBound To txtArray.UBound total = total + Val(txtArray(i).Text) Next i Text1.Text = total End Sub

Visual Basic & ADO Tutorial Level: Level2 This tutorial describes how you can use ADO objects in VB6. Now days, almost any time you write full fledged database application you will want to use ADO. Along with this, as your applications become more and more complex you will probably not want to rely on Visual Basic's data controls, but instead use the ADO objects directly. Read on to find out exactly how this can be done. Originally Written By TheVBProgramer. The "Alphabet Soup" of Database Access

Prior to VB6 and the introduction of ADO (ActiveX Data Objects), VB programmers would generally use DAO (Data Access Objects) to interact with local databases such as MS Access and use RDO (Remote Data Objects) to interact with client/server databases such as Oracle and SQL Server. The concept behind Visual Basic ADO was Universal Data Access (UDA), where one database access method could be used for any data source; it was designed to replace both DAO and RDO. DAO remains a viable technology for interacting with MS Access databases as it is faster than ADO for that purpose; however, ADO is more flexible – using ADO, one could develop a prototype database application using MS Access in the back-end, and with a "flick of the wrist" (i.e., with very little coding changes) "upsize" that same application to use Oracle or SQL Server. As far as RDO is concerned, no new versions of it have been developed beyond the version that shipped with Visual Basic, and there are no future plans for it.

In the VB4 and VB5 worlds, RDO was the main method used to interact with client/server databases. RDO works perfectly fine with VB6, so when folks migrated their VB5 applications over to VB6, little or no coding changes were required. However, ADO is the preferred method of database access for new VB6 applications .

About this Tutorial

This tutorial presents three small sample applications using ADO. All three applications use a local MS Access database. The first sample application introduces the ADO Data Control (ADODC) which demonstrates a "quick and dirty" way to connect to a remote database. The second and

third applications use ADO code: the second allows navigation and searching of a database table; the third allows navigation and updating on a database table. All three connect to an ODBC Data Source, which must be set up through the Windows Control Panel. How to do this is described below.

Note: If you have previously set up a DSN for the Biblio database as described in the previous topic on RDO, you can skip the section on setting up an ODBC data source and resume here.

Setting Up an ODBC Data Source

Follow the steps below to set up an ODBC Data Source (this process is also called "setting up a DSN", where "DSN" stands for "Data Source Name"). These steps assume Windows 2000 for the operating system. On other versions of Windows, some steps may vary slightly.

· Via Windows Control Panel, double-click on Administrative Tools, then Data Sources (ODBC). The ODBC Data Source Administrator screen is displayed, as shown below. Click on the System DSN tab.

· Click the Add button. The Create New Data Source dialog box will appear. Select Microsoft Access Driver (*.mdb) from the list and click the Finish button.

· The ODBC Microsoft Access Setup dialog box will appear. For Data Source Name, type Biblio. If desired, you can type an entry for Description, but this is not required.

· Click the Select button. The Select Database dialog box appears. On a default installation of VB6 or Visual Studio 6, the BIBLIO.MDB sample database should

reside in the folder C:\Program Files\Microsoft Visual Studio\VB98. Navigate to that folder, select BIBLIO.MDB from the file list, and click OK.

Note: If VB was installed in a different location on your system, navigate to the appropriate folder. If you do not have the BIBLIO.MDB sample database file on your system at all, you can download it here. In that case, copy the file to the folder of your choice, and navigate to that folder to select the database for this step.

· When you are returned to the ODBC Microsoft Access Setup screen, the database you selected should be reflected as shown below. Click OK to dismiss this screen.

· When you are returned to the ODBC Data Source Administrator screen, the new DSN should appear as shown below. Click OK to dismiss this screen.

At this point, the Biblio database is ready to be used with RDO in the sample application.

Sample Application 1: Using the ADO Data Control (ADODC)

To build the first sample application, follow the steps below.

· Start a new VB project, and from the Components dialog box (invoked from the Project -> Components menu), select Microsoft ADO Data Control 6.0 (SPx) as shown below and click OK.

The ADO Data Control should appear in your toolbox as shown below:

·

Put an ADO Data Control on your form, and set the properties as follows:

Property

Value Name

adoBiblio DataSourceName

Biblio SQL

select * from authors · Now put three text boxes on the form, and set their Name, DataSource, and DataField properties as follows:

Name

DataSource

DataField txtAuthor

adoBiblio

Author txtAuID

adoBiblio

Au_ID txtYearBorn

adoBiblio

Year Born

·

Save and run the program. Notice how it works just like the other data control.

· Now change the SQL property of the data control to select * from authors order by author and run the program again. Notice the difference.

· Change the SQL property back to what it was and add three command buttons to the form, and set their Name and Caption properties as follows:

Name

Caption cmdNameOrder

Order by Name cmdYearOrder

Order by Year cmdIDOrder

Order by ID

·

Put the following code in the cmdNameOrder_Click event:

adoBiblio.SQL = "select * from authors order by author" adoBiblio.Refresh

·

Put the following code in the cmdYearOrder_Click event:

adoBiblio.SQL = "select * from authors order by [year born]" adoBiblio.Refresh

·

Put the following code in the cmdIDOrder_Click event:

adoBiblio.SQL = "select * from authors order by au_id" adoBiblio.Refresh

·

Save and run the program and see what happens when you click the buttons.

A screen-shot of the sample app at run-time is shown below:

Download the project files for this sample application here.

Sample Applications 2 and 3: Using ADO Code

Note: If you have previously downloaded and set up a DSN for the Property database as described in the previous topic on RDO, you can skip the set up steps below and resume here.

Sample applications 2 and 3 use a database called PROPERTY.MDB and can be downloaded here.

The Property database contains just one table called "Property". The columns of this table are defined as follows:

Column Name

Data Type

Notes PROPNO

Number (Long Integer)

A number that uniquely identifies the property in the table. Should be treated as the Primary Key (although it is not defined as such in the sample database). EMPNO

Number (Long Integer)

A number that identifies the real estate agent selling the property. In a real system, this would be the foreign key to the employee number in an Employee table (such a table is not present in the sample database). ADDRESS

Text (20)

The street address of the property. CITY

Text (15)

The city where the property is located. STATE

Text (2)

The state where the property is located (2-character US state abbreviation). ZIP

Text (5)

The zip code where the property is located. NEIGHBORHOOD

Text (15)

The descriptive name of the neighborhood in which the property is located. HOME_AGE

Number (Long Integer)

Age in years of the home. (A better table design choice would be to have this field be the date in which the property was built and have the application compute the age based on the current date.) BEDS

Number (Long Integer)

Number of bedrooms in the property. BATHS

Number (Single)

Number of bathrooms in the property (allows for a decimal value such as 2.5, indicating 2 ½ bathrooms – i.e. 2 full bathrooms and 1 "powder room"). FOOTAGE

Number (Long Integer)

The footage of the property. ASKING

Number (Long Integer)

Asking price of the property in whole dollars. BID

Number (Long Integer)

Bid amount of the potential buyer in whole dollars. SALEPRICE

Number (Long Integer)

Sale price (amount the property actually sold for) in whole dollars. Before coding or running sample application 2 or 3, you must set up an ODBC data source as was done for the previous sample application.

After downloading the file, move it to the folder of your choice. Then follow the exact same steps as before to set up the DSN, with these two exceptions:

(1) On the ODBC Microsoft Access Setup dialog box, type PropDB for the Data Source Name.

(2) In the Select Database dialog box, navigate to the location where you have placed the PROPERTY.MDB file.

Sample Application 2

To build Sample Application 2, start a new VB project and perform the following steps.

· From the Project -> References menu, check Microsoft ActiveX Data Objects 2.x (where x is the highest version that you have on your system) and click OK.

· This project uses the StatusBar control, so include the Microsoft Windows Common Controls 6.0 (SP6) from the Components dialog box, accessed from the Project -> Components menu.

· Create the form shown below. The names of the text boxes in the top frame are shown in the form. Set the Enabled property of the frame to False, which will automatically disable all of the textboxes within it, which is desired because this application does not allow updating of the data. The settings for the other controls are given below.

The navigation buttons have the following properties:

Name

Caption cmdMoveFirst

<< cmdMovePrevious

< cmdMoveNext

> cmdMoveLast

>>

The text box in the middle of the form has the following properties:

Name

txtCurrentQuery MultiLine

True Locked

True

The command buttons have the following properties:

Name

Caption

Enabled cmdAllData

Reload All Records

True cmdGetData

Run Query Now

False

In the "Select Criteria" frame:

The check boxes are an array: Name

Caption chkCriteria(0)

EmpNo

chkCriteria(1)

City chkCriteria(2)

State

The labels are also an array: Name

Caption

Enabled lblCriteria(0)

=

False lblCriteria(1)

Like

False lblCriteria(2)

Like

False

The textboxes are also an array:

Name

Caption

Enabled txtCriteria(0)

EmpNo

False txtCriteria(1)

City

False txtCriteria(2)

State

False

Place the StatusBar on the form and set its Style property to 1 – sbrSimple.

2. Code the General Declarations section as shown below. Here, two ADO objects, ADODB.Connection and ADODB.Recordset, are defined at the form level.

The ADODB.Connection object represents an open connection to a data source and a specific database on that data source, or an allocated but as yet unconnected object, which can be used to subsequently establish a connection.

The ADODB.Recordset object represents the rows that result from running a query,

Option Explicit

Dim mobjADOConn As ADODB.Connection Dim mobjADORst As ADODB.Recordset Dim mstrSQL As String

3. Code the Form_Load event. Here, the connection object variable mobjADOConn is made available for use by setting it to a new instance of ADODB.Connection. Then, the ConnectionString property and the Open method of the ADODB.Connection object are used.

The ConnectionString property takes a string with various arguments delimited by semicolons. When using a DSN as we are in this sample application, you typically need just the DSN name, the user id, and the password. The Open method then opens the connection to the database.

'----------------------------------------------------------------------------Private Sub Form_Load() '-----------------------------------------------------------------------------

'set up the form and connect to the data source On Error GoTo LocalError 'center the form: Me.Top = (Screen.Height - Me.Height) / 2 Me.Left = (Screen.Width - Me.Width) / 2 ' Connect to the Property database:

Set mobjADOConn = New ADODB.Connection mobjADOConn.ConnectionString = "DSN=PropDB;Uid=admin;Pwd=;" mobjADOConn.Open Call cmdAllData_Click

Exit Sub

LocalError: MsgBox Err.Number & " - " & Err.Description End Sub

4. Code the cmdAllData_Click event, which sets or resets the ADODB.Recordset object with a query to display all the rows in the table. The opening of the recordset takes place in the OpenNewRecordset subprocedure, called from this event procedure.

'----------------------------------------------------------------------------Private Sub cmdAllData_Click() '-----------------------------------------------------------------------------

On Error GoTo LocalError Dim lngX As Long

'select or reload the data to be displayed: mstrSQL = "select * from property" Call OpenNewRecordset 'load data into the text boxes

Call DataLoad

' reset the state of the search criteria controls For lngX = 0 To 2 chkCriteria(lngX).Value = vbUnchecked Next Exit Sub LocalError: MsgBox Err.Number & " - " & Err.Description

End Sub

5. Create the user-defined subprocedure OpenNewRecordset.

Here, the recordset object mobjADORst is made available for use by setting (or resetting) it to a new instance of ADODB.Recordset.

The CursorLocation property is then set to the built-in constant adUseClient. The term "cursor" refers to the temporary rows of a recordset. The cursor location determines whether the cursor is stored on the client or the server, specified by the values adUseClient and adUseServer, respectively. Server-side cursor (adUseServer) is the default. There are tradeoffs using both types of cursors. Client-side cursors can take a long time to build because the data must be pulled over to the client, but once built, traversing the cursor is usually very fast. Client-side cursors often support more features than server-side cursors (the reason this sample application is using a clientside cursor is because we want to use AbsolutePosition property later, which only works with a client-side cursor). On the other hand, server-side cursors usually build faster but often support fewer features that client-side cursors.

The Open method of the recordset is then executed. The Open method has the following syntax:

RecordsetObject.Open Source, ActiveConnection, CursorType, LockType, Options

The Source argument is an optional variant that evaluates to a valid Command object, SQL statement, table name, stored procedure call, or filename of a persisted recordset.

The ActiveConnection argument is an optional variant that evaluates to a valid Connection object variable name or a string containing connection string parameters.

The CursorType argument is an optional value that determines the type of cursor that the provider should use when opening the recordset. The possible values and their descriptions are given below:

Value

Description adOpenForwardOnly

(default) Used to open a forward-only cursor. Forward-only cursors create static snapshots of data. A recordset that uses a forward-only cursor is not directly updateable and can only be scrolled from beginning to end (i.e., "MoveNext" is the only "Move" method that can be used with this type of cursor). Forward-only cursors offer optimal performance in exchange for feature limitations. Forward-only cursors are sometimes referred to as firehose cursors. adOpenStatic

Used to open a static cursor. A static cursor is a static copy of the data in the data source. Once created, no changes made by other users propagate to the recordset; the recordset never changes. Note: Client side cursors (like the one used in this sample application) use only adOpenStatic for CursorTypes regardless of which CursorType you select. adOpenDynamic

Used to open a dynamic cursor. A dynamic cursor is a "live" recordset, meaning that any and all additions, changes, and deletions by other users affect the recordset. Dynamic-cursor recordsets support all types of navigation, including bookmarks (if bookmarks are supported by the provider). Dynamic cursors offer the most features of any cursor type, but at the expense of increased overhead. adOpenKeyset

Used to open a keyset cursor. Keyset cursors are like dynamic cursors, except additions made by other users are not visible in the recordset. The recordset is affected by changes and deletions, however. The LockType argument is an optional value that determines the type of locking that the provider should use when opening the recordset. The possible values and their descriptions are given below:

Value

Description adLockReadOnly

(default) Specifies read-only locking. Records can be read, but data cannot be added, changed, or deleted. This is the locking method used with static cursors and forwardonly cursors. adLockPessimistic

Specifies pessimistic locking. The provider does what is necessary to ensure successful editing of records, usually by locking records at the data source immediately upon editing. adLockOptimistic

Specifies optimistic locking. The provider locks records only when you call the Update method, not when you start editing. adLockBatchOptimistic

Specifies optimistic batch locking. Records are locked in batch update mode, as opposed to immediate update mode. This option is required for client-side cursors.

The Options argument is an optional Long value that indicates how the Source should be evaluated. The possible values and their descriptions are given below:

Value

Description adCmdText

Indicates that the provider should evaluate CommandText as a textual definition of a command. This options is used SQL statements. adCmdTable

Indicates that the provider should evaluate CommandText as a table. adCmdStoredProc

Indicates that the provider should evaluate CommandText as a stored procedure. adCmdUnknown

Indicates that the type of command in the CommandText argument is not known and that the provider should attempt to interpret it. Typically results in poor performance. adExecuteAsync

Indicates that the command should execute asynchronously. adFetchAsync

Indicates that the remaining rows after the initial quantity specified in the CacheSize property should be fetched asynchronously. '----------------------------------------------------------------------------Private Sub OpenNewRecordset() '----------------------------------------------------------------------------Set mobjADORst = New ADODB.Recordset

mobjADORst.CursorLocation = adUseClient mobjADORst.Open mstrSQL, mobjADOConn, adOpenStatic, , adCmdText

' display current query txtCurrentQuery.Text = mstrSQL

End Sub

6. Create the user-defined subprocedure DataLoad. This subprocedure gets the data from the recordset and puts each field into a text box. Data from the recordset is accessed via the Fields collection.

The Fields collection in ADO works identically to the Fields collection in DAO. A field can be referenced with or without specifying Fields, either by the field name in quotes or by its ordinal position in the resultset. The field can also be referenced with the bang (!) operator. All of the following would be valid ways of referencing the field "propno":

mobjADORst.Fields("propno") mobjADORst ("propno") mobjADORst.Fields(0) mobjADORst(0) mobjADORst!propno

'----------------------------------------------------------------------------Private Sub DataLoad() '-----------------------------------------------------------------------------

On Error GoTo LocalError

'copy the data from the recordset to the text boxes: txtPropNo.Text = mobjADORst.Fields("propno") txtEmpNo.Text = mobjADORst.Fields("empno") txtAddress.Text = mobjADORst.Fields("address") txtCity.Text = mobjADORst.Fields("city") txtState.Text = mobjADORst.Fields("state") txtZip.Text = mobjADORst.Fields("zip") Call SetRecNum Exit Sub LocalError: MsgBox Err.Number & " - " & Err.Description

End Sub

7. Create the user-defined subprocedure SetRecNum. This sub displays the number of the current record at the bottom of the screen. The AbsolutePosition and RecordCount properties of the Recordset are used here.

The AbsolutePosition property specifies the current row in a recordset. Note: For AbsolutePosition to return a valid value with Access (Jet) databases (like the one used in the sample application), the CursorLocation must be set to adUseClient. An invalid value (-1) will be returned if adUseClient is specified.

The RecordCount property the total number of rows in the recordset. Note: RecordCount will not return a valid value with all cursor types (for example, RecordCount will return -1 with a forward-only cursor.) To ensure a valid

RecordCount value, use either adOpenKeyset or adOpenStatic as the CursorType for server side cursors or use a client side cursor.

'----------------------------------------------------------------------------Private Sub SetRecNum() '----------------------------------------------------------------------------StatusBar1.SimpleText = "row " & mobjADORst.AbsolutePosition _ & " of " & mobjADORst.RecordCount End Sub

8. Code the events for the navigation buttons as shown below, using the recordset "Move" methods to move to the first, last, next, or previous record, respectively. '----------------------------------------------------------------------------Private Sub cmdMoveFirst_Click() '----------------------------------------------------------------------------On Error GoTo LocalError

mobjADORst.MoveFirst Call DataLoad Exit Sub LocalError: MsgBox Err.Number & " - " & Err.Description End Sub

'----------------------------------------------------------------------------Private Sub cmdMoveLast_Click()

'----------------------------------------------------------------------------On Error GoTo LocalError

mobjADORst.MoveLast Call DataLoad Exit Sub LocalError: MsgBox Err.Number & " - " & Err.Description End Sub

'----------------------------------------------------------------------------Private Sub cmdMoveNext_Click() '----------------------------------------------------------------------------On Error GoTo LocalError

mobjADORst.MoveNext If mobjADORst.EOF Then Beep mobjADORst.MoveLast End If Call DataLoad Exit Sub LocalError: MsgBox Err.Number & " - " & Err.Description End Sub

'----------------------------------------------------------------------------Private Sub cmdMovePrevious_Click() '----------------------------------------------------------------------------On Error GoTo LocalError

mobjADORst.MovePrevious If mobjADORst.BOF Then Beep mobjADORst.MoveFirst End If Call DataLoad Exit Sub LocalError: MsgBox Err.Number & " - " & Err.Description End Sub

9. When one of the check boxes is clicked, the label and text box next to it should be enabled (or disabled, if clicking the check box unchecks it). Note also that the cmdGetData button (the one with the "Run Query Now" caption) should only be enabled if one of the checkboxes is checked.

'----------------------------------------------------------------------------Private Sub chkCriteria_Click(Index As Integer) '-----------------------------------------------------------------------------

' disable the 'Run Query Now' button

cmdGetData.Enabled = False

'when the user clicks on a check box, enable the label and text 'box that go with it. If chkCriteria(Index).Value = vbChecked Then txtCriteria(Index).Enabled = True lblCriteria(Index).Enabled = True txtCriteria(Index).SetFocus txtCriteria(Index).SelStart = 0 txtCriteria(Index).SelLength = Len(txtCriteria(Index).Text) ' enable the 'Run Query Now' button only if a box is checked. cmdGetData.Enabled = True Else txtCriteria(Index).Enabled = False lblCriteria(Index).Enabled = False End If End Sub

10. After the user has selected which fields to use and entered values in the text boxes, they click the cmdGetData button to create a new recordset with new data. Note that if the user selects (checks) a field, but does not enter search criteria in the corresponding textbox, an error message is generated and the query is not run.

'----------------------------------------------------------------------------Private Sub cmdGetData_Click() '-----------------------------------------------------------------------------

'run the query that the user has created On Error GoTo LocalError

Dim blnFirstOne As Boolean blnFirstOne = True mstrSQL = "select * from property where " If chkCriteria(0).Value = vbChecked Then If (txtCriteria(0).Text = "") Or (Not IsNumeric(txtCriteria(0).Text)) Then MsgBox "Employee number is missing or non-numeric. Query not run.", _ vbExclamation, _ "ADO Example" Exit Sub End If blnFirstOne = False mstrSQL = mstrSQL & "empno = " & txtCriteria(0).Text End If If chkCriteria(1).Value = vbChecked Then If txtCriteria(1).Text = "" Then MsgBox "City criteria is missing. Query not run.", _ vbExclamation, _ "ADO Example" Exit Sub End If If blnFirstOne = False Then

mstrSQL = mstrSQL & " and" End If blnFirstOne = False mstrSQL = mstrSQL & " city like '" & txtCriteria(1).Text & "'" End If If chkCriteria(2).Value = vbChecked Then If txtCriteria(2).Text = "" Then MsgBox "State criteria is missing. Query not run.", _ vbExclamation, _ "ADO Example" Exit Sub End If If blnFirstOne = False Then mstrSQL = mstrSQL & " and" End If blnFirstOne = False mstrSQL = mstrSQL & " state like '" & txtCriteria(2).Text & "'" End If OpenNewRecordset 'make sure that the query did not return 0 rows: If mobjADORst.EOF Then MsgBox "Your query (" & mstrSQL & ") returned no records! " _ & "The default query to return all records will now be rerun.", _ vbExclamation, _ "ADO Example"

'reload the form with all the records cmdAllData_Click Else MsgBox "Your query returned " & mobjADORst.RecordCount & " records.", _ vbInformation, _ "ADO Example" 'load data into the text boxes Call DataLoad End If Exit Sub LocalError: MsgBox Err.Number & " - " & Err.Description

End Sub

11. Save and run. Note: When entering the "Like" criteria for City and/or State, you can use the wildcard character % to represent any number of characters and the wildcard character _ (underscore) the represent a single character. For example, entering "M%" for the City criteria would return all rows where the city field begins with the letter "M".

Download the project files for this sample application here.

Sample Application 3

Sample Application 3 demonstrates how to add, update, and delete records with ADO.

When the application is first run, the user is prompted to enter a minimum asking price to possibly limit the number of records they want to work with (i.e., "I only want to work with properties that are selling for $200,000 or more). If the user wants to work with all properties, they would simply accept the default of 0 from the prompt. If the user clicks the Cancel button, the application will end.

Once the user has entered the minimum asking price, the main screen of the application is displayed. Initially, the screen is in "browse" mode, where the user can use the navigation buttons to move to the first, previous, next or last record. The data cannot be edited in this mode. If they want to initiate an add or an update, delete a record, or exit the application, they may do so via the appropriate button. Saving or cancelling is not applicable in this mode, so those buttons are disabled.

If the user clicks the Add button, the fields on the screen are enabled and cleared, and the user can enter the information for the new property. All buttons except Save and Cancel are now disabled. After the user has made entries in the fields, he or she would click Save to add the new record to the database table, or, if they changed their mind, would click Cancel to discard the new record. In either case (clicking Save or Cancel) the user is returned to browse mode. When Save is clicked, the application validates the entries and will only save the record if all fields pass edit (otherwise, a message will appear indicating the problem entry and focus will be set to the problem field).

If the user clicks the Update button, the fields on the screen are enabled and the user can modify any or all of the fields (except for the Property Number, which is the primary key of the table). All buttons except Save and Cancel are now disabled. After the user has made modifications in the desired fields, he or she would click Save to update the record to the database table, or, if they changed their mind, would click Cancel to discard the changes. In either case (clicking Save or Cancel) the user is returned to browse mode. When Save is clicked, the application validates the entries and will only save the record if all fields pass edit (otherwise, a message will appear indicating the problem entry and focus will be set to the problem field).

If the user clicks the Delete button, the user is asked to confirm that they want to delete the current record. If they respond Yes, the record is deleted from the database table, and the main screen shows the next record in the table.

To build Sample Application 3, start a new VB project and perform the following steps.

· From the Project -> References menu, check Microsoft ActiveX Data Objects 2.x Library and click OK.

· This project uses the StatusBar control, so include the Microsoft Windows Common Controls 6.0 (SP6) from the Components dialog box, accessed from the Project -> Components menu. Check this item and click OK.

· Create the form shown below. The settings for the various controls are given below.

· There are nine textboxes in the main frame of the form. The names and MaxLength settings for these are given below:

Name

Properties txtPropNo

MaxLength: 5 txtEmpNo

MaxLength: 4 txtAddress

MaxLength: 20 txtCity

MaxLength: 15 txtState

MaxLength: 2 txtZip

MaxLength: 5 txtBeds

MaxLength: 1 txtBaths

MaxLength: 3 (allows fractional amount, like 1.5) txtAsking

MaxLength: 0 (not specified)

·

Set up the Command Buttons as follows:

Name

Caption cmdMoveFirst

<< cmdMovePrevious

< cmdMoveNext

> cmdMoveLast

>> cmdAdd

Add cmdUpdate

Update cmdDelete

Delete cmdSave

Save cmdCancel

Cancel

cmdExit

Exit

· All controls on your form should have their TabIndex property set such that the tabbing order is correct.

· Add a Module to the project, name it modCommon, and enter the code shown below. The code contains procedures described as follows:

CenterForm

Sub to center a form on the screen ValidKey

Function to validate a keystroke for use in the KeyPress event of a textbox ConvertUpper

Function to convert an alphabetic character entered in a textbox to uppercase, used in the KeyPress event of a textbox SelectTextBoxText

Sub to highlight the text of a textbox when it receives focus. Used in the GotFocus event of a textbox. TabToNextTextBox

Sub to "autotab" from one textbox to another when maximum number of characters that can be entered into the first textbox has been reached. UnFormatNumber

Function to strip out non-numeric characters (dollar signs, commas, etc.) from a formatted number.

Option Explicit

Public Const gstrNUMERIC_DIGITS As String = "0123456789" Public Const gstrUPPER_ALPHA_PLUS As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ,'-"

Public gblnPopulating As Boolean

'-----------------------------------------------------------------------Public Sub CenterForm(pobjForm As Form) '------------------------------------------------------------------------

With pobjForm .Top = (Screen.Height - .Height) / 2 .Left = (Screen.Width - .Width) / 2 End With

End Sub

'-----------------------------------------------------------------------Public Function ValidKey(pintKeyValue As Integer, _ pstrSearchString As String) As Integer '------------------------------------------------------------------------

' Common function to filter out keyboard characters passed to this ' function from KeyPress events. ' ' Typical call: ' KeyAscii = ValidKey(KeyAscii, gstrNUMERIC_DIGITS) '

If pintKeyValue < 32 _ Or InStr(pstrSearchString, Chr$(pintKeyValue)) > 0 Then 'Do nothing - i.e., accept the control character or any key ' in the search string passed to this function ... Else 'cancel (do not accept) any other key ... pintKeyValue = 0 End If

ValidKey = pintKeyValue

End Function

'-----------------------------------------------------------------------Public Function ConvertUpper(pintKeyValue As Integer) As Integer '------------------------------------------------------------------------

' Common function to force alphabetic keyboard characters to uppercase

' when called from the KeyPress event.

' Typical call: ' KeyAscii = ConvertUpper(KeyAscii) '

If Chr$(pintKeyValue) >= "a" And Chr$(pintKeyValue) <= "z" Then pintKeyValue = pintKeyValue - 32 End If

ConvertUpper = pintKeyValue

End Function

'----------------------------------------------------------------------------Public Sub SelectTextBoxText(pobjTextbox As TextBox) '-----------------------------------------------------------------------------

With pobjTextbox .SelStart = 0 .SelLength = Len(.Text) End With

End Sub

'----------------------------------------------------------------------------Public Sub TabToNextTextBox(pobjTextBox1 As TextBox, pobjTextBox2 As TextBox) '-----------------------------------------------------------------------------

If gblnPopulating Then Exit Sub If pobjTextBox2.Enabled = False Then Exit Sub If Len(pobjTextBox1.Text) = pobjTextBox1.MaxLength Then pobjTextBox2.SetFocus End If

End Sub

'----------------------------------------------------------------------------Public Function UnFormatNumber(pstrNumberIn As String) As String '-----------------------------------------------------------------------------

Dim lngX As Long Dim strCurrChar As String Dim strNumberOut As String strNumberOut = "" For lngX = 1 To Len(pstrNumberIn) strCurrChar = Mid$(pstrNumberIn, lngX, 1) If InStr("0123456789.", strCurrChar) > 0 Then strNumberOut = strNumberOut & strCurrChar End If

Next UnFormatNumber = strNumberOut

End Function

· Code the General Declarations section as shown below. Here, as in the previous sample application, two ADO object variables, mobjADOConn and mobjADORst, are defined at the form level, as are some other form-level variables that will be needed.

Option Explicit

Dim mobjADOConn As ADODB.Connection Dim mobjADORst As ADODB.Recordset Private mstrSQL As String Private mdblMinAsking As Double Private mblnUpdatePending As Boolean Private mstrUpdateType As String

Private mavntUSStates As Variant

· Code the Form_Load event as shown below. In it, a programmer-defined Sub named GetMinimumAsking is called (that routine is the one that displays the initial prompt to the user to enter the minimum asking price of the properties they want to work with). Then, the variant array mavntUSStates is loaded with the 50 US state abbreviations, needed for validating the state input by the user. This is followed by a call to the CenterForm sub. Then, the ADO connection object (mobjADOConn) is instantiated, its ConnectionString property is set, and the Open method is invoked so that we can use the Property database in the application. This is followed by a call to the programmer-defined Sub GetPropertyData (which runs the query to create the recordset that will be used to browse the Property table records), followed by a call to

the programmer-defined Sub SetFormState (which enables and disables controls at the appropriate time).

'----------------------------------------------------------------------------Private Sub Form_Load() '----------------------------------------------------------------------------On Error GoTo LocalError ' obtain the minimum asking price for the properties to be worked with GetMinimumAsking ' load the array of states to be used for validation mavntUSStates = Array("AK", "AL", "AR", "AZ", "CA", "CO", "CT", "DC", _ "DE", "FL", "GA", "HI", "IA", "ID", "IL", "IN", _ "KS", "KY", "LA", "MA", "MD", "ME", "MI", "MN", _ "MO", "MS", "MT", "NC", "ND", "NE", "NH", "NJ", _ "NM", "NV", "NY", "OH", "OK", "OR", "PA", "RI", _ "SC", "SD", "TN", "TX", "UT", "VA", "VT", "WA", _ "WI", "WV", "WY") 'center the form: CenterForm Me ' Connect to the Property database: Set mobjADOConn = New ADODB.Connection mobjADOConn.ConnectionString = "DSN=PropDB;Uid=admin;Pwd=;" mobjADOConn.Open

Call GetPropertyData

SetFormState False

Exit Sub

LocalError: MsgBox Err.Number & " - " & Err.Description End Sub

Code the GetMinimumAsking Sub, which uses the InputBox function to prompt to the user to enter the minimum asking price of the properties they want to work with. The resulting value is then stored in the form-level variable mdblMinAsking.

'----------------------------------------------------------------------------Private Sub GetMinimumAsking() '----------------------------------------------------------------------------Dim strInputBoxPrompt As String Dim strAsking As String

strInputBoxPrompt = "Enter the minimum asking price (for example, 200000) " _ & "for the properties that you want to work with this session." _ & vbNewLine _ & "To work with ALL properties, leave the default of zero." strAsking = InputBox(strInputBoxPrompt, "Minimum Asking Price", "0") If strAsking = "" Then ' user clicked Cancel button on the input box, so end the app End

End If mdblMinAsking = Val(strAsking)

End Sub

Code the GetPropertyData Sub, which builds the SQL to get the property records meeting the minimum asking price condition. The Recordset object is then instantiated, its CursorLocation property is set, and its Open method is invoked to execute the SQL and return the resultset. This is done in a loop in case the resultset does not return any records due to the fact no records in the table met the asking price condition. In that situation, the user is given the opportunity to specify a different asking price value. Following this, the programmer-defined Sub PopulateFormFields is called (which displays the fields from the current record in their corresponding textboxes on the form).

'----------------------------------------------------------------------------Private Sub GetPropertyData() '-----------------------------------------------------------------------------

On Error GoTo LocalError Dim blnGotData As Boolean blnGotData = False Do 'select or reload the data to be displayed: mstrSQL = "select propno" _ & " , empno" _ & " , address" _ & " , city" _ & " , state" _

& " , zip" _ & " , beds" _ & " , baths" _ & " , asking" _ & " from property" _ & " where asking >= " & mdblMinAsking _ & " order by propno" Set mobjADORst = New ADODB.Recordset mobjADORst.CursorLocation = adUseClient mobjADORst.Open mstrSQL, mobjADOConn, adOpenDynamic, adLockOptimistic, adCmdText If mobjADORst.EOF Then If MsgBox("There are no properties with an asking price >= " _ & Format$(mdblMinAsking, "Currency") _ & ". Do you want to try again with a different value?", _ vbYesNo + vbQuestion, _ "Asking Price") _ = vbYes Then GetMinimumAsking Else End End If Else blnGotData = True End If

Loop Until blnGotData 'load data into the text boxes Call PopulateFormFields Exit Sub LocalError: MsgBox Err.Number & " - " & Err.Description

End Sub

Code the PopulateFormFields Sub, which assigns the fields from the current record to their corresponding textboxes on the form. Note that the gblnPopulating Boolean variable is set to True prior to the assignments and set to False after the assignments. This value is used to control whether or not certain code executes in the event procedures for some of these textboxes. The Sub SetRecNum is then called.

'----------------------------------------------------------------------------Private Sub PopulateFormFields() '----------------------------------------------------------------------------On Error GoTo LocalError

gblnPopulating = True

'copy the data from the resultset to the text boxes: txtPropNo.Text = mobjADORst.Fields("propno") txtEmpNo.Text = mobjADORst.Fields("empno") txtAddress.Text = mobjADORst.Fields("address") txtCity.Text = mobjADORst.Fields("city")

txtState.Text = mobjADORst.Fields("state") txtZip.Text = mobjADORst.Fields("zip") txtBeds.Text = mobjADORst.Fields("beds") txtBaths.Text = mobjADORst.Fields("baths") txtAsking.Text = Format$(mobjADORst.Fields("asking"), "Currency") gblnPopulating = False

Call SetRecNum Exit Sub LocalError: MsgBox Err.Number & " - " & Err.Description

End Sub

Code the SetRecNum Sub. This sub is identical to the one used in Sample Application 2. It displays the number of the current record at the bottom of the screen using the AbsolutePosition and RowCount properties of the Recordset object.

'----------------------------------------------------------------------------Private Sub SetRecNum() '----------------------------------------------------------------------------StatusBar1.SimpleText = "row " & mobjADORst.AbsolutePosition _ & " of " & mobjADORst.RecordCount End Sub

Code the SetFormState Sub, which takes in a Boolean argument used to set the Enabled property of the controls on the form. Based on whether the value True or

False is passed to this sub, this sub ensures that the textboxes are enabled for adds and updates and disabled for browsing; it also ensures that the various command buttons are enabled or disabled at the appropriate time. This Sub also sets the form-level Boolean variable mblnUpdatePending.

'----------------------------------------------------------------------------Private Sub SetFormState(pblnEnabled As Boolean) '-----------------------------------------------------------------------------

txtPropNo.Enabled = pblnEnabled txtEmpNo.Enabled = pblnEnabled txtAddress.Enabled = pblnEnabled txtCity.Enabled = pblnEnabled txtState.Enabled = pblnEnabled txtZip.Enabled = pblnEnabled txtBeds.Enabled = pblnEnabled txtBaths.Enabled = pblnEnabled txtAsking.Enabled = pblnEnabled

cmdSave.Enabled = pblnEnabled cmdCancel.Enabled = pblnEnabled cmdAdd.Enabled = Not pblnEnabled cmdUpdate.Enabled = Not pblnEnabled cmdDelete.Enabled = Not pblnEnabled cmdExit.Enabled = Not pblnEnabled cmdMoveFirst.Enabled = Not pblnEnabled cmdMoveNext.Enabled = Not pblnEnabled

cmdMovePrevious.Enabled = Not pblnEnabled cmdMoveLast.Enabled = Not pblnEnabled mblnUpdatePending = pblnEnabled

End Sub

Code the Form_Unload event. In it, the form-level Boolean variable mblnUpdatePending is tested to see if (well, an update is pending – i.e., whether an add or update is in progress). If the user is in the middle of an add or update and then clicks the "X" button on the upper-right corner of the form, they will receive the message that they must save or cancel prior to exiting the application, and the form will NOT be unloaded (because we are assigning a non-zero value to the Cancel argument in that situation). Provided that an add or update is not in progress, we set the database objects to Nothing and the Unload will complete.

'----------------------------------------------------------------------------Private Sub Form_Unload(Cancel As Integer) '-----------------------------------------------------------------------------

If mblnUpdatePending Then MsgBox "You must save or cancel the current operation prior to exiting.", _ vbExclamation, _ "Exit" Cancel = 1 Else Set mobjADORst = Nothing Set mobjADOConn = Nothing End If

End Sub

Code the events for the various Textboxes as shown below. The code in these events ensure the following: · For all, highlight the text in the textbox when it receives focus.

· For all but the last textbox, if the maximum number of characters typed into the textbox is reached, auto-tab to the next textbox. · Only numeric digits should be entered into the property number, employee number, zip codes, and beds textboxes. · Only numeric digits and optionally one decimal point should be entered into the baths and asking textboxes. · Force uppercase on the state textbox.

· When the asking textbox receives focus, the value in there should be unformatted. When the asking textbox loses focus, its value should be formatted as currency.

'----------------------------------------------------------------------------' Textbox events '-----------------------------------------------------------------------------

' property # Private Sub txtPropNo_GotFocus() SelectTextBoxText txtPropNo End Sub Private Sub txtPropNo_KeyPress(KeyAscii As Integer) KeyAscii = ValidKey(KeyAscii, gstrNUMERIC_DIGITS) End Sub Private Sub txtPropNo_Change()

TabToNextTextBox txtPropNo, txtEmpNo End Sub

' emp # Private Sub txtEmpNo_GotFocus() SelectTextBoxText txtEmpNo End Sub Private Sub txtEmpNo_KeyPress(KeyAscii As Integer) KeyAscii = ValidKey(KeyAscii, gstrNUMERIC_DIGITS) End Sub Private Sub txtEmpNo_Change() TabToNextTextBox txtEmpNo, txtAddress End Sub

' address Private Sub txtAddress_GotFocus() SelectTextBoxText txtAddress End Sub Private Sub txtAddress_Change() TabToNextTextBox txtAddress, txtCity End Sub

' city Private Sub txtCity_GotFocus() SelectTextBoxText txtCity

End Sub Private Sub txtCity_Change() TabToNextTextBox txtCity, txtState End Sub

' state Private Sub txtState_GotFocus() SelectTextBoxText txtState End Sub Private Sub txtState_KeyPress(KeyAscii As Integer) KeyAscii = ConvertUpper(KeyAscii) End Sub Private Sub txtState_Change() TabToNextTextBox txtState, txtZip End Sub

' zip Private Sub txtZip_GotFocus() SelectTextBoxText txtZip End Sub Private Sub txtZip_KeyPress(KeyAscii As Integer) KeyAscii = ValidKey(KeyAscii, gstrNUMERIC_DIGITS) End Sub Private Sub txtZip_Change() TabToNextTextBox txtZip, txtBeds

End Sub

' beds Private Sub txtBeds_GotFocus() SelectTextBoxText txtBeds End Sub Private Sub txtBeds_KeyPress(KeyAscii As Integer) KeyAscii = ValidKey(KeyAscii, gstrNUMERIC_DIGITS) End Sub Private Sub txtBeds_Change() TabToNextTextBox txtBeds, txtBaths End Sub

' baths Private Sub txtBaths_GotFocus() SelectTextBoxText txtBaths End Sub Private Sub txtBaths_KeyPress(KeyAscii As Integer) KeyAscii = ValidKey(KeyAscii, gstrNUMERIC_DIGITS & ".") ' if text already has a decimal point, do not allow another ... If Chr$(KeyAscii) = "." And InStr(txtBaths.Text, ".") > 0 Then KeyAscii = 0 End If End Sub Private Sub txtBaths_Change()

TabToNextTextBox txtBaths, txtAsking End Sub

' asking price Private Sub txtAsking_GotFocus() txtAsking.Text = UnFormatNumber(txtAsking.Text) SelectTextBoxText txtAsking End Sub Private Sub txtAsking_KeyPress(KeyAscii As Integer) KeyAscii = ValidKey(KeyAscii, gstrNUMERIC_DIGITS & ".") ' if text already has a decimal point, do not allow another ... If Chr$(KeyAscii) = "." And InStr(txtAsking.Text, ".") > 0 Then KeyAscii = 0 End If End Sub Private Sub txtAsking_LostFocus() txtAsking.Text = Format$(txtAsking.Text, "Currency") End Sub

Code the events for the navigation buttons as shown below, using the resultset "Move" methods to move to the first, last, next, or previous record, respectively. '----------------------------------------------------------------------------Private Sub cmdMoveFirst_Click() '----------------------------------------------------------------------------On Error GoTo LocalError

mobjADORst.MoveFirst Call PopulateFormFields Exit Sub LocalError: MsgBox Err.Number & " - " & Err.Description End Sub

'----------------------------------------------------------------------------Private Sub cmdMoveLast_Click() '----------------------------------------------------------------------------On Error GoTo LocalError

mobjADORst.MoveLast Call PopulateFormFields Exit Sub LocalError: MsgBox Err.Number & " - " & Err.Description End Sub

'----------------------------------------------------------------------------Private Sub cmdMoveNext_Click() '----------------------------------------------------------------------------On Error GoTo LocalError

mobjADORst.MoveNext

If mobjADORst.EOF Then Beep mobjADORst.MoveLast End If Call PopulateFormFields Exit Sub LocalError: MsgBox Err.Number & " - " & Err.Description End Sub

'----------------------------------------------------------------------------Private Sub cmdMovePrevious_Click() '----------------------------------------------------------------------------On Error GoTo LocalError

mobjADORst.MovePrevious If mobjADORst.BOF Then Beep mobjADORst.MoveFirst End If Call PopulateFormFields Exit Sub LocalError: MsgBox Err.Number & " - " & Err.Description End Sub

Code the Click event for the cmdAdd button. In it, the textboxes are cleared, the SetFormState sub is called (passing it a parameter of True, which will enable the textboxes and the Save and Cancel buttons and disable all the other buttons), set the form-level variable mstrUpdateType to "A" (indicating that an add is pending) and sets focus to the Property Number field. '----------------------------------------------------------------------------Private Sub cmdAdd_Click() '-----------------------------------------------------------------------------

On Error GoTo LocalError

'clear all the text boxes: txtPropNo.Text = "" txtEmpNo.Text = "" txtAddress.Text = "" txtCity.Text = "" txtState.Text = "" txtZip.Text = "" txtBeds.Text = "" txtBaths.Text = "" txtAsking.Text = "" SetFormState True mstrUpdateType = "A" txtPropNo.SetFocus Exit Sub LocalError:

MsgBox Err.Number & " - " & Err.Description End Sub

Code the Click event for the cmdUpdate button. In it, the SetFormState sub is called (passing it a parameter of True, which will enable the textboxes and the Save and Cancel buttons and disable all the other buttons), set the form-level variable mstrUpdateType to "U" (indicating that an update is pending), disables the Property Number field (because it is the primary key and should not be changed) and sets focus to the Employee Number field.

'----------------------------------------------------------------------------Private Sub cmdUpdate_Click() '-----------------------------------------------------------------------------

On Error GoTo LocalError

SetFormState True mstrUpdateType = "U" ' being that propno is the primary key, it should not be updatable txtPropNo.Enabled = False txtEmpNo.SetFocus Exit Sub LocalError: MsgBox Err.Number & " - " & Err.Description End Sub

Code the Click event for the cmdSave button. The user would click this button after they have completed entries for an add or update. This sub first invokes the

ValidateAllFields function, which returns a Boolean indicating whether or not all entries passed their edit checks. If not, we exit the sub and the record is not saved; the user remains in "update pending" mode and has the opportunity to correct the entries. Provided that validation is successful, the sub proceeds. The mstrUpdateType variable is checked to see whether we are dealing with an add or an update.

If we are dealing with an add, we invoke the AddNew method of the Recordset object. The AddNew method prepares a new row you can edit and subsequently add to the Recordset object using the Update method. After you modify the new row, you must use the Update method to save the changes and add the row to the result set. No changes are made to the database until you use the Update method. (The Update method is invoked after the content of the textboxes has been assigned to the database fields.) If we are dealing with an update, we can just start modifying the fields (provided an appropriate cursor type has been selected) – unlike DAO and RDO, ADO does not use an Edit method. Changes made to the current row’s columns are copied to the copy buffer. After you make the desired changes to the row, use the Update method to save your changes or the CancelUpdate method to discard them. (If you move on to another record without invoking Update, your changes will be lost.) The content of the textboxes is assigned to the database fields, then the Update method is invoked. The Update method saves the contents of the copy buffer row to a specified updatable Recordset object and discards the copy buffer. The mstrUpdateType variable is checked once again, and if we are dealing with an add, there is some extra work to do. Although the new record has been added, the original resultset still does not contain the new record. The Requery method must be invoked, which updates the data in a Recordset object by re-executing the query on which the object is based. The Find method is then used to position to the new record. The ADO Find method has the following syntax:

RecordsetObject.Find Criteria, SkipRows, SearchDirection, Start The Criteria argument is a String value that specifies the column name, comparison operator, and value to use in the search. Only a single-column name may be specified in criteria; multi-column searches are not supported. The comparison operator may be ">" (greater than), "<" (less than), "=" (equal), ">=" (greater than or equal), "<=" (less than or equal), "<>" (not equal), or "like" (pattern matching). The value may be a string, floating-point number, or date. String values are delimited with single quotes or "#" (number sign) marks (for example, "state = 'WA'" or "state = #WA#"). Date values are delimited with "#" (number sign) marks (for example, "start_date > #7/22/97#"). These values can contain hours, minutes, and seconds to indicate time stamps, but should not contain milliseconds or errors will occur. If the comparison operator is "like", the string value may contain an asterisk (*) to find one or more occurrences of any character or substring. For example, "state like 'M*'" matches

Maine and Massachusetts. You can also use leading and trailing asterisks to find a substring contained within the values. For example, "state like '*as*'" matches Alaska, Arkansas, and Massachusetts. Asterisks can be used only at the end of a criteria string, or together at both the beginning and end of a criteria string, as shown above. You cannot use the asterisk as a leading wildcard ('*str'), or embedded wildcard ('s*r'). This will cause an error. SkipRows is an optional Long value, whose default is zero, that specifies the row offset from the current row (or bookmark row specified by the Start argument, if present) to begin the search. By default, the search will start on the current row. SearchDirection is an optional value that determines in which direction the search is performed. The value is specified by the constants adSearchForward (the default) or adSearchBackward, which equate to values of 1 or -1, respectively. Start is an optional Variant bookmark that functions as the starting position for the search. Note: Unlike DAO, ADO does not have a "NoMatch" property. If the ADO Find method is unsuccessful, the record pointer is positioned at the end of the Recordset. The SetRecNum sub is then be called to display the status bar information about the new record. The SetFormState sub is then called with a parameter of False, which causes the textboxes and the Save and Cancel buttons to be disabled and all other buttons to be enabled. Note that in the statement that assigns the contents of the txtAsking textbox to the asking field of the table, our UnFormatNumber function is used to strip off the nonnumeric characters. This is because we are using a display format that includes a dollar sign and commas on the txtAsking control, and an error would occur if we attempted to assign this directly to the asking field, which is defined as numeric. '----------------------------------------------------------------------------Private Sub cmdSave_Click() '-----------------------------------------------------------------------------

On Error GoTo LocalError

If Not ValidateAllFields Then Exit Sub

If mstrUpdateType = "A" Then

mobjADORst.AddNew Else ' We can just update the fields. No explicit Edit method ' is available or needed. End If 'save the data to the database: mobjADORst.Fields("propno") = txtPropNo.Text mobjADORst.Fields("empno") = txtEmpNo.Text mobjADORst.Fields("address") = txtAddress.Text mobjADORst.Fields("city") = txtCity.Text mobjADORst.Fields("state") = txtState.Text mobjADORst.Fields("zip") = txtZip.Text mobjADORst.Fields("beds") = txtBeds.Text mobjADORst.Fields("baths") = txtBaths.Text mobjADORst.Fields("asking") = UnFormatNumber(txtAsking.Text) mobjADORst.Update

If mstrUpdateType = "A" Then 'after the new record is added, the db must be re-queried 'so that the resultset contains the new record: mobjADORst.Requery ' reposition to the record just added mobjADORst.Find "propno = " & txtPropNo.Text 'display status info about the new record SetRecNum

End If Reset: SetFormState False Exit Sub LocalError: MsgBox Err.Number & " - " & Err.Description Resume Reset End Sub

Code the Click event for the cmdDelete button. The user is first asked to confirm that they want to delete the record, and if so, the Delete method of the resultset object is invoked, which deletes the current row in an updatable resultset object. The Requery method is then invoked so that the record is removed from the resultset that the user is working with. The Find method is then invoked to position the next record after the deleted one. If it was the last record that was deleted, then we position to the "new" last record using the MoveLast property. PopulateFormFields must then be called to display the contents of the new current record.

'----------------------------------------------------------------------------Private Sub cmdDelete_Click() '-----------------------------------------------------------------------------

On Error GoTo LocalError 'when the current record is deleted, the current location in the recordset 'is invalid. use the Requery method to re-execute the query and update 'the data. If MsgBox("Are you sure you want to delete this record?", _ vbYesNo + vbQuestion, _ "Delete") = vbNo Then

Exit Sub End If mobjADORst.Delete mobjADORst.Requery ' reposition to one past the record just deleted mobjADORst.Find "propno > " & txtPropNo.Text ' If it was the last record that was deleted, the Find method will ' come back with EOF, in which case we should MoveLast to position ' us to the "new" last record ... If mobjADORst.EOF Then mobjADORst.MoveLast 'load data into the text boxes: Call PopulateFormFields

Exit Sub

LocalError: MsgBox Err.Number & " - " & Err.Description End Sub

The ValidateAllFields function, which returns a Boolean value indicating whether or not all fields have passed validation checks. This function calls upon two "helper" functions: PropertyExists and ValidState. When the user is doing an add, the PropertyExist function is called to see whether or not the proposed Property Number is already being used in the Property table. If so, the user is informed that they can't use that number (because it is the primary key and must be unique) and so they must use a different number. The ValidState routine is called to ensure that the user has entered a valid US state. The code for all three functions is shown below.

'----------------------------------------------------------------------------Private Function ValidateAllFields() As Boolean '-----------------------------------------------------------------------------

ValidateAllFields = False 'guilty until proven innocent If mstrUpdateType = "A" Then If txtPropNo.Text = "" Then MsgBox "Property # must not be blank.", vbExclamation, "Property #" txtPropNo.SetFocus Exit Function ElseIf PropertyExists Then MsgBox "Property # already exists. Please use a different #.", _ vbExclamation, _ "Property #" txtPropNo.SetFocus Exit Function End If End If If txtEmpNo.Text = "" Then MsgBox "Emp # must not be blank.", vbExclamation, "Emp #" txtEmpNo.SetFocus Exit Function End If If txtAddress.Text = "" Then MsgBox "Address must not be blank.", vbExclamation, "Address"

txtAddress.SetFocus Exit Function End If If txtCity.Text = "" Then MsgBox "City must not be blank.", vbExclamation, "City" txtCity.SetFocus Exit Function End If If Not ValidState Then MsgBox "Missing or invalid state.", vbExclamation, "State" txtState.SetFocus Exit Function End If If txtZip.Text = "" Or Len(txtZip.Text) = 5 Then ' it's OK Else MsgBox "Zip code must either be blank or exactly 5 digits.", _ vbExclamation, _ "Zip Code" txtZip.SetFocus Exit Function End If If Val(txtBeds.Text) = 0 Then MsgBox "Beds must not be zero.", vbExclamation, "Beds" txtBeds.SetFocus

Exit Function End If If Val(txtBaths.Text) = 0 Then MsgBox "Baths must not be zero.", vbExclamation, "Baths" txtBaths.SetFocus Exit Function End If If Val(UnFormatNumber(txtAsking.Text)) = 0 Then MsgBox "Asking must not be zero.", vbExclamation, "Asking" txtAsking.SetFocus Exit Function End If ' if we make it here, all fields have passed edit ValidateAllFields = True End Function

'-------------------------------------------------------------------------------Private Function ValidState() As Boolean '--------------------------------------------------------------------------------

Dim lngX As Long Dim blnStateFound As Boolean blnStateFound = False For lngX = 0 To UBound(mavntUSStates) If txtState.Text = mavntUSStates(lngX) Then

blnStateFound = True Exit For End If Next ValidState = blnStateFound End Function

'----------------------------------------------------------------------------Private Function PropertyExists() As Boolean '-----------------------------------------------------------------------------

Dim objTempRst As New ADODB.Recordset Dim strSQL As String

strSQL = "select count(*) as the_count from property where propno = " & txtPropNo.Text objTempRst.Open strSQL, mobjADOConn, adOpenForwardOnly, , adCmdText If objTempRst("the_count") > 0 Then PropertyExists = True Else PropertyExists = False End If

End Function Code the Click event for the cmdCancel button. The user would click this button if, during an add or update, they decide to abandon the operation. Here, PopulateFormFields is called to reset the textboxes to their content prior to the user

clicking the Add or Update button, and SetFormState is called with a parameter of False, which causes the textboxes and the Save and Cancel buttons to be disabled and all other buttons to be enabled. '----------------------------------------------------------------------------Private Sub cmdCancel_Click() '-----------------------------------------------------------------------------

PopulateFormFields SetFormState False End Sub Code the Click event for the cmdExit button, which issues the Unload Me statement to fire the Form_Unload event, which will unload the form and end the application.

'----------------------------------------------------------------------------Private Sub cmdExit_Click() '-----------------------------------------------------------------------------

Unload Me End Sub

Download the project files for this sample application here.

Sign up to vote on this title
UsefulNot useful