Current Microsoft MVP Awardees

MS Access™ MVP Awardee from July, 2007 through June, 2019

GPC's YouTube Training Video Library

Mike's Mobile Library -- Pop Up Dialogs for PowerApps
Learn how to create the experience of a pop up to interact with your users. Provide feedback and confirm actions such as deletions.

The technique I used on based on this article:
Video Run Time: 16:09

Mike's Mobile Library -- Managing Global Variables and Default Values for Galleries
One of the ironies of a "Low-Code" application like PowerApps is the proliferation of "copy-paste" code. Access developers will miss the ability to consolidate reusable code into public modules--something that is not supported in PowerApps.

In this video, you'll learn the secret of using Lookup() to set a Default value for a gallery.

For an excellent description of an Access relational database application interface that manages Many-to-Many relationships, take a look at Mike Wolfe's blog: Many to Many Paired Lists

Video Run Time: 31:59

Mike's Mobile Library -- Add Records to a Junction Table (Many-to-Many)
Learn how to use paired Galleries to select and add new records to a Junction Table in a PowerApps Application.

In an Access relational database application, we would use a main form/sub form design to accomplish this.
Video Run Time: 24:29

Mike's Mobile Library -- One-to-Many Records Using Nested Gallaries
Learn how to display related records in a on-to-many relationship on a PowerApps screen using nested galleries.
Links to more detailed presentations on Nested Galleries. These presentations are the best explanations I've seen on the subject.
Daniel Christian on PowerApps Nested Galleries: Nested Galleries
Paul O'Flaherty on Nested Galleries: Nested Galleries
Video Run Time: 17:22

Mike's Mobile Library -- I Was Wrong About ShowColumns() ... But I Figured It Out!
I had misunderstood how ShowColumns() -- and DropDolumns() and AddColumns() -- work when creating and using collections with SharePoint lists. It was causing me heart-burn.
I eventually took the time to do more thorough acceptance testing, discovered the error, and corrected it.
Video Run Time: 16:57

Mike's Mobile Library -- SubmitForm() to Manage Basic Add/Edit Tasks for Publishers -Revised
Learn how to use the basic SubmitForm() action in PowerApps to add new records to a data source or edit existing records in a data source.
In this video I use the Publishers screen with a gallery and a form to manage a table of Publishers.
Update: After completing this presentation, further testing revealed that I had been using the "DropColumns" and "ShowColumns" actions inappropriately. I'll do a follow up video explaining that. Basically, a collection retains ALL of the SharePoint generated fields with or without ShowColumns() and DropColumns() .
Video Run Time: 19:46

Mike's Mobile Library -- Variable Variable Values in Add and Edit
Learn how to conditionally set different values for variables in PowerApps depending on whether you want to Add a new record or Edit an existing record.
Video Run Time: 20:29

Mike's Mobile Library -- Add or Edit SharePoint Lookup Fields in PowerApps
Learn how to save new or changed values in complex columns (Lookup Fields) in SharePoint lists using the Patch Command.

LookupColumn Syntax for Patch
LookupColumnName: {
     // '@odata.type': "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
       Id: _Lookup ID_,
       Value: _Lookup Value_
Video Run Time: 30:03

Mike's Mobile Library --OnSelect, SetVar and Patch to Edit Existing Records
Learn to use the Patch() function to edit existing records in a table using PowerApps. SetVar() creates a variable to determine whether to add a new record or edit an existing record. OnSelect() triggers the Patch() action. In this session, we develop the Patch() command code to edit existing records in a SharePoint list via PowerApps. Conditional logic in the OnSelect() action determines whether to add a new record or edit the selected record. We follow the edit branch in this session.
Video Run Time: 15:01

Mike's Mobile Library --OnSelect, SetVar and Patch to Add New Records
Learn to use the Patch() function to add new records to a table using PowerApps. SetVar creates a variable to determine whether to add a new record or edit an existing record. OnSelect() triggers the Patch() action.
In this session, we develop the Patch() command code to add a new record to a SharePoint list via PowerApps. Conditional logic in the OnSelect() action determines whether to add a new record or edit the selected record. We follow theAdd branch in this session.
Video Run Time: 19:50

Mike's Mobile Library -- PowerApps and SharePoint Records and Fields
Learn why Lookup Fields in SharePoint lists present a unique challenge for Access Developers working with PowerApps. Learn why they can be confusing to experienced Access Developers and how to handle them successfully in DropDown input controls on PowerApps forms and galleries.
Video Run Time: 26:51

Mike's Mobile Library -- Filter Items in the Publications Gallery
Learn how to filter items in a PowerApps gallery control. Search and Filter using input box and dropdown controls. Plus a Naming Conundrum exposed.
Video Run Time: 12:09

Mike's Mobile Library -- Is it "ID" or Is It "PublicationGenreID"? You decide.
SharePoint automatically creates ID fields for all lists. ID fields are similar to Access AutoNumbers in that they are automatically created for each new record, they are not reused and they must unique. You can rename them to provide better visibility to what they are used for. However, sometimes PowerApps ignores that alias and uses the original default name "ID". Be aware of this tendency and don't let it be confusing.
Video Run Time: 10:36

Mike's Mobile Library - Populate the Publications Gallery with Book Titles
Place a gallery on the publications screen. Wire up a collection for the data source of the gallery. Link mentioned in the Video:
Creating Collections in PowerApps
Video Run Time: 18:13

Mike's Mobile Library - Setting Up Filters for Publications
Create Input Boxes and Dropdowns to Filter records in a PowerApps Gallery. Using Dropdowns or Combo boxes: your choice.
Video Run Time: 6:51

Mike's Mobile Library - Setting Up the Screen Header
Synchronize elements of a PowerApps screen Header using X and Y position coordinates and control width and height.
Video Run Time: 8:24

Mike's Mobile Library - PowerApps Screens Galore
Take a brief pause from building Mike's Mobile Library. In addition to the basic blank screen, PowerApps has several templates for commonly used specialty screens. They are wired up and ready to use as soon as you insert them into your PowerApps application.
Video Run Time: 6:00

Mike's Mobile Library - Creating a "Responsive" Layout
In this session we learn how to synchronize position of controls on a screen using X (horizontal) and Y (vertical) coordinates and width and height of each control.
Video Run Time: 14:09

Mike's Mobile Library - The Start Screen
In today's presentation, we set up the Main Menu, or Start Screen, by copying the Start Screen objects from the Production version and changing the theme colors from Production blue to Development Orange.
Video Run Time: 10:28

Mike's Mobile Library - Connect Data to the PowerApps Application
In this presentation, we connect our Development version of Mike's Mobile Library to the SharePoint lists in the Development subsite. We also connect to the Azure Blob Storage Location where our cover photos are stored.
Link to the Azure Blob Storage Account Video:
Link to Azure Blob Storage Accounts
Link to setting up a PowerApps App to use SharePoint lists:
Setting up PowerApps to use SharePoint lists
Note: A lot has changed in 3 years, but this video is still a good starting point for using SharePoint lists.
Video Run Time: 8:29

Mike's Mobile Library - Create the Options Screen and OnStart Event
In today's presentation, we start setting up our PowerApps application in Development mode by creating and populating the options screen and copying the OnStart code into the new Dev copy of the application. We also get to preview an entirely NEW feature in PowerApps. the StartScreen option.
Read about it here: The PowerApps Startup Screen
Video Run Time: 24:31

Mike's Mobile Library - Set up a Development Environment in PowerApps
Let's build a PowerApps application to manage the catalog for a personal library! On Day 4, we begin by preparing to set up a Development version of the PowerApps Application.
Video Run Time: 27.37

Mike's Mobile Library - The SharePoint Lists for Data
Let's build a PowerApps application to manage the catalog for a personal library. On Day 3, we review the Tables (SharePoint Lists) behind the application.
Video Run Time: 20:47

Mike's Mobile Library - The PowerApps Interface
Let's build a PowerApps application to manage the catalog for a personal library! On Day 2, we review the PowerApps interface.
Video Run Time: 20:16

Mike's Mobile Library - The Access Interface
Let's convert an existing MS Access relational database application to a PowerApps application! Mike's Mobile Library is a catalog of books, DVDs and periodicals and the authors or creators who wrote and produced them. It manages transfers in and out of the library via purchase or lending. Day one is an overview of the environment and a review of the existing desktop Access front end.
Video Run Time: 27:50

PowerApps 4 Access Devs --10, 000 Records -- 2nd Look
In a second look at the process of loading 10,000 records into a PowerApps application, we consider the positive impact on performance increasing data row limits from 500 to 2,000 records and the negative impact on performance of the presence of Lookup fields in a gallery. We introduce the Patch() function to add add new records to a table. We look at the use of the PowerApps StartUp event to set the value of global variables. A list of resources used for this application is available in the description of the initial video.
Video Run Time: 29:29

PowerApps 4 Access Devs 10,000 Records -- Oops!
I identified and corrected a logic bug (wrong math approach) which appeared during repeated testing. Funny how that works, eh? I also changed the workflow for the application after reconsidering the impact on performance that comes from repeatedly (and probably unnecessarily) re-populating a large collection. Note: On my smart phone, startup takes as little as two or three seconds. I think the difference is partly due to the heavy processing load in the development environment which is also competing with recording software for resources.
Video Run Time: 17:48

PowerApps 4 Access Devs - Load 10,000 Records
10,000 Records in a Database Application? Really? Access developers work with large recordsets, sometimes hundreds of thousands of records, so the idea of being limited to 500 (or even 2,000) seems unworkable. Fear not, there is a way to load thousands and thousands of records into your PowerApps application. This video shows you how. It also shows you why that's actually not a good idea.
Video Run Time: 35:09

Formatting Dates for Display in MS Access
Use MS Access Format() expressions to display dates and dates with times to your users in the interface.
Video Run Time: 08:24

So You Want to Build a Microsoft Acccess Database
Introduction to the underlying considerations on which a good Relational Database Application must be based
Video Run Time: 15:16

Creating Your First Table in a Microsoft Access Relational Database
Step by Step Process of Creating a table in an Access Relational Database. What fields need to be included and why.
Video Run Time: 27:51

Creating Your Second table in a Microsoft Access Relational Data
Adding a related table to your MS Access Relational Database requires careful thought. Properly defined Primary and Foreign Keys make the second table work with the first.
Video Run Time: 30:43

Reconciling Business Rules and Normalization
Normalization, or or the rules for creating a set of relational tables, is only part of the process. You also need to reconcile good table design with the business requirements that govern your database application. There may be more than one way to go, and determining which way will best support the business rules is a big part of doing a good job.
Video Run Time: 23:49

One-to-Many or Many-to-Many? Part I
Microsft Access Relational Databases capture information about relationships between two or more entities: People and Email Addresses, Classes and Students, Invoices and Line Items on the Invoices, Meals and Food Items in the Meals. Some of those relationships are one-to-many. Some of those relationships are many-to-many. In this video, you'll learn about both types, and you'll see how to create appropriate related tables for each type
Video Run Time: 23:48

One-to-Many or Many-to-Many -- and Why Part II
Microsft Access Relational Databases capture information about relationships between two or more entities: People and Email Addresses, Classes and Students, Invoices and Line Items on the Invoices, Meals and Food Items in the Meals. Some of those relationships are one-to-many. Some of those relationships are many-to-many. In this video, you'll learn about both types, and you'll see how to create appropriate related tables for each type
Video Run Time: 27:40

Relational Tables -- Summary and Review
A solid, stable, relational database exhibits several qualities that depend on a good foundation of sound table design.
Video Run Time: 21:18

Building Relational Tables -- Adding TransactionTables I
Adding Tables to an MS Access Relational Database that capture information about Transactions
Video Run Time: 22:56

Date Logic in Report Grouping - I
Learn to use DatePart(), DateAdd() and DateValue() to create summary reports with grouped details. Selecting records relies on TempVars in the WHERE Clause in queries and Iif() to filter on "ALL" or "One" unique ID.
Video Run Time: 13:51

Date Logic in Report Grouping -- II
Learn to use DatePart(), DateAdd() and DateValue() to create summary reports with grouped details. Selecting records relies on TempVars in the WHERE Clause in queries and Iif() to filter on "ALL" or "One" unique ID.
Video Run Time: 18:19

Calculated Values in Queries and on Forms
Learn to use Expressions to calculate values for display on Forms. Calculated values can also be used for sorting and filtering in queries.
Video Run Time: 18:49

Performance Analysis Using Date Logic and Conditional Formatting
Performance Analysis Reporting in Access Using Date Logic and Conditional Formatting to Highlight Results
Video Run Time: 20:12

Date and Time Gotchas in Access Reports and Queries
Two ways in which unwary Access users can create misleading or inappropriate reports because of failure to account for how Access actually stores dates with times.
Video Run Time: 20:21

Date Formatting and Filtering in Access Reports Filter Criteria
Using tempvars to set criteria for date range in an Access Report
Video Run Time: 18:50

Default Dates and Date Formatting & Grouping in Access Reports
How to Use Default values for dates, grouping and sorting on Formatted Dates
Video Run Time: 17:02

Date Formatting for Access Form Filters
Using Custom Date Formats and Date Logic to filter subforms and to improve appearance of the data displayed.
Video Run Time: 25:39

Date Formatting in Access Forms
Introduction to Display Formatting for Access Dates and Times in Forms How to use custom formatting to improve appearance and conserve space on a crowded form.
Video Run Time: 14:07

Date Formatting In Access Tables I
MS Access stores dates internally as numbers. It's up to the developer to format those dates properly for display.
Video Run Time: 14:37

Date Formatting in Access Tables II
The impact of Display Formats on Date/Time Fields In Access
Video Run Time: 10:00

Date Formatting in Access Tables III
A closer look at the display possibilities available for date/time fields in tables
Video Run Time: 17:13

Editing Office Ribbons with a Third Party tool
The steps required to modify a Custom Access ribbon using the IDBE Ribbon Creator Tool
Video Run Time: 15:16

Singing Cowboys
How to manage a Many-to-Many Relationship using a main form/subform design. Singing Cowboys is a Web Application developed with MS Access 2010 and published to SharePoint 2010.
Video Run Time: 5:00

GPC's Fully Functional Sample Access Database Applications

"Contains" Search in Multiple Fields

*New -- May, 10, 2020
A frequent request in Access forums is a search function that works like the "contains" searches common in web sites. Instead of an exact match, or a match beginning with the first letter of a word, a "contains" search returns all instances of a field where the search term occurs anywhere in the string.
For example, a "contains" search for "gus" would return names containing those three letters: First names like "Augustus" or "Gustav" as well as Last names like "Anthrogus" and so on.
I achieve this result by using TempVars to filter on multiple fields. This demo shows you how to implement the query and set the tempvars.
*This version supports both 32 bit and 64 bit Access.*


Animated GIF for "Please Wait" Message

*New -- May, 12, 2020

Sometimes I learn something while trying to answer questions on an online Access forum. This was one such occasion. I really appreciate the poster's persistence in pushing me to a solution.
The original request was to display an animated GIF on a form in Access. My first thought was, unfortunately, "That's a bad idea." However, after an exchange of ideas with the original poster, I realized this could be a pretty good idea and one worth pursuing. The result is this demo.
An animated GIF can be displayed in a web browswer control. That means the image file must be stored in a location to which all copies of the Access Front End accdb have permissions. Or copies of it can be saved to the same folder where that Access FE accdb resides on each user's computer. Either way, the animated GIF can be displayed at the beginning of a long-running process and hidden again when that process completes.
I will leave it to you to try out other approaches to implementing this feature, such as dynamically loading different animated GIFs for different processes, or changing the size and location of the web browser control to maximize use of form spacing.
*This version supports both 32 bit and 64 bit Access.*


Automativally Find and Link to CSV files

*New -- April 3, 2021

Search a specified Folder for .csv and .xls and .xlsx files. List them in your Access relational database application. Link to them with the click of a button.

*This version supports both 32 bit and 64 bit Access.*


Cancel Report on No Data without Error Message

*New --May 2, 2020
*Validated for 64 bit version of MS Access --May 4, 2020
When a report opens without data, you can use the On No Data event to cancel the report and issue custom messages or responses.
However that cancellation will send error 2501 back to the event which called the "Report Open" event. That means you must also handle that returned error from the calling procedure in the calling form as well.
This demo illustrates how to handle it.


Calls & Meetings--Contact Manager Database

*Updated -- April 14 2020

Contact Manager is a completely revised and updated version of an application I built for a client several years ago. It tracks:

  • Companies with whom you have contacts.
  • Individual Contacts at those companies, with contact information.
  • Calls to your contacts.
  • Meetings with your contacts.
  • In this version, many outdated methods were replaced with more flexible methods, primarily based on TempVars and IIF() functions to eliminate the need for dynamic sql or hard-coded forms references. Also, some unnecessary restrictions on data entry were modified or removed.
    You might use this basic version as a "starter" for your own purposes. Like all of my demos, it can be expanded. Feel free to make any changes needed to suit your situation. However, note that I can't be responsible for any use you make of the application.
    Reports were improved and simplified.
    **Compatible with 32 bit and 64 bit Access.


    Dish Antenna Installations Database Installations

    *Updated -- August 9, 2012
    Created to staunch the paperwork flood in an Dish Network Installer's business, Installations is a fully functional MS Access database in the accdb format. Try it out, "as is" on your own PC for free. It was custom-built, so it will not be of direct use to you without some modifications to fit your business rules. The instructions are included.
    To try it out, create a folder for it on your hard-drive and save the compressed file ( to that folder. Double-click on the "ZIP" file to open and extract the files into that folder. Double-click on "Installations.mdb" to launch the 2003 version of the application, or on "Installations.accdb" to launch the 2010 version.

    *The ZIP file contains Access 2003 (mdb) and 2010-2016 versions (accdb).


    Create a Dynamic Menu

    *Updated -- March 18, 2021
    A Proof of Concept I created in 2004 for an article in the old Smart Access magazine. The Splash form re-creates a set of command buttons on the main menu form each time the mdb or accdb is opened. Like the Ribbon that was introduced a few years later, the menu items are stored in a table from which the menu is re-built.
    *Added accdb compatible with 32 bit Access and 64 bit Access. Updated some code.


    Create a Membership Directory with images of each person

    *New -- February, 2021
    Including images in forms and reports in Access requires very little design and programming beyond adding image control(s) and binding the appropriate image to them. This can be done either by making the location of the image file the value in a field in a table, or by calling the images up dynamically. This demo illustrates the latter approach.
    Although Access does support storing images internally, that causes file bloat. Therefore, storing images externally and linking to them is highly recommended. Therefore, this demo uses a subfolder to store images selected and used for one or more members.
    Originally designed from a "rescue" project I completed for a friend, I recently dusted it off and cleaned it up for this demo.
    Download and unZIP the sample files. Make sure the images subfolder is created during that process.


    GPC's Customized Northwind Sample Database

    *New -- February 2, 2016
    I have often recommended the Northwind Access database as a good way to get started with table design based on valid normalization. Northwind is probably the most complete template of a retail sales application I've seen. Unfortunately, it also has a few undesirable design features that make it less than ideal as a "starter" for new developers.
    That's always bothered me, so recently I took a closer look. It's more complicated than I had thought. It's not good or bad, just complicated. For a beginner, looking for ways to get started, that's a hurdle.

    • Object names in Northwind usually contain spaces and non-standard characters This was my main concern, but it's worse when you read through the entire database and realize how intricate the VBA and macros have to be to handle those names.
    • Many Primary Keys retain the default name "ID", which Access assigns to all newly created Autonumbers. This makes it really hard to track which ID came from which table in the many macros, procedures, queries, forms and reports.
      Of course, if all of the references were fully qualified (e.g. "Orders.ID" instead of "ID"), then it would be less of a hassle. But we're talking about a sample database aimed, one assumes, mostly at new developers and power users not already expert at figuring this stuff out. If I have to work at it, how must they feel?
    • The code in Northwind is a combination of Macros--mostly embedded in forms, but also free-standing--standard VBA, and classes.
      Not that many new Access users are comfortable with classing, even though it's a powerful tool.
      To my way of thinking, this mixed mode approach to coding puts the Northwind sample database firmly on the wrong side of a line dividing "introductory" databases from "professional" database templates.

    Because of these characteristics, customizing the Northwind sample to fit the needs of a different organization is anything but a simple task. And that is it's biggest drawback.
    So, my customized version is a first step towards making it more accessible to non-pros. I changed all object names to the more conventional standard of having no spaces and no special characters in them.
    I renamed all Primary Keys from "ID" to include the name of the table, e.g. "OrderID". This simple step should help new Access users follow the trail more easily. I know that more experienced users won't benefit so much, but this is not aimed at them, only the newbies, anyway.
    Down the road, I'll tackle the code. My intention is to convert macros to VBA where it makes sense to do so. There are places where they do make sense.
    Unfortunately, the power of the classing approach is too important, in my mind, to eliminate it, so it stays at least in this version and the next. We'll see after that.
    If you decide to download and check out my revision, please let me know if you find any bugs in it.


    GPC's Work Tracking Demo

    *Updated -- October 29, 2016
    Download the full, working accdb or mdb version of GPC's Work Tracking Demo, with the VBA that makes it work. I originally built this tool for myself, to track time and efforts on projects for my clients. Over time I expanded it to include some rudimentary Project Management features,such as defining the deliverables for a project, scheduling major milestones, and prioritizing tasks. It's a little more than a timesheet and a little less than a project management tool. You may either use Work Tracking as-is or modify it to suit your needs.The current backend DB for my working version in on SQL Azure, but this one still works well as a starter.
    NOTE: The "accdb" version is tested and works in Access 2007 through Access 2016, both 32 bit and 64 bit version.
    I recent added code to track and record all changes to data in this version.

    It creates an audit of data changes by user who made the change and the date and time on which the change was made.
    Please report any bugs in this newest version, so I can fix them.
    The change history function is NOT included in the mdb version.
    Like all of my samples and demos, this one is offered "As Is" with no guarantees of fitness for any particular purpose. Use it or modify at your own risk and with your own effort.
    This ZIP file contains both mdb (tested in A2003) and accdb (tested in A2007 through A2016 and A2016 64 bit) versions. Only the accdb version contains the Change History Function.


    GPC Curated Links to Normalization Articles
    I believe it's important that you understand what relational database applications are and how they work. The most important principal is that Relational Databases are NOT just super-charged spreadsheets. While there are many good references on the web to choose from, I've limited the list to these favorites.

    Also check out Links to Other Access Resources page

    Autonumbers - What They Are / Are Not

    *Updated -- April 24, 2004
    Autonumbers White Paper at Utter Access


    Roger Carlson's Access Blog

    *New -- March 7, 2011
    Roger Carlson's Access Blog on Repeated Columns in tables.


    Crystal Long's ACCESS Basics for Programming

    *New -- July 21, 2006
    ACCESS Basics for Programming at Utter Access


    Database planning tutorial Part I

    *New -- September 28, 2003
    The late Glenn Lloyd's Tutorial at Utter Access


    Database planning tutorial Part II

    *New -- October 25, 2003
    The late Glenn Lloyd's Tutorial at Utter Access


    Jerry Dennison's FAQ on Normalization

    *New -- April 8, 2003
    Jerry Dennison's FAQ at Utter Access


    Glenn Lloyd's FAQ on Design Strategies

    *New -- October 25, 2003
    The late Glenn Lloyd's FAQ at Utter Access


    Grover Park George's PDF on Normalization

    *Updated -- May 18, 2019
    A practical, non-technical explanation of Normalization for Relational Database Applications.


    Put Stuff Where It Belongs

    *New -- November 12, 2013
    Jack Leach's Whitepaper on Table Design


    MSKB 283878: Description of the database normalization basics

    *Updated -- May 10, 2017
    Microsoft Article on Relational Database Normalization basics.


    Noah's FAQ on Normalization

    *New -- December 8, 2003
    Noah's FAQ at Utter Access


    Primary Keys - Natural vs Surrogate

    *New -- February 13, 2005
    Primary Keys - Natural vs Surrogate at Utter Access


    Danny Seager's FAQ on Reserved Words

    *Updated -- September 11, 2004
    Danny Seager's FAQ on Reserved Words at Utter Access


    Presentation and sample db for Seattle Access User Group

    *New -- August 9, 2012
    My Seattle Access User Group Presentation and sample db from August, 2012.


    ©Copyright 2010- Grover Park Consulting. All Rights Reserved.
    Free Resources and Full Working Demos for Microsoft Access Database Design and Development