April 16th, 2012
Decompiling an Access Database
As a developer, it becomes necessary to decompile your database from time to time. The frequency depends on a multitude of factors, but at the very least, one should decompile one’s application prior to release. Decompilation is yet one more step a develpper has to take to ensure their database/code is clean and optimal for their end-users. Also, keep in mind that the best approach is to decompile the database on the development machine and then recompile on the end-user machine. This ensures that the database is compiled using the end-user’s libraries minimizing any surprises when put into production.
Before going any further on this subject, let me emphasize once more the importance of making a backup of your database prior to performing a decompile of your database!
One-time Decompile
The MSACCESS.EXE command line accepts several command line switches, one of which is to allow decompiling your database. There is no other means to decompile a database. So one merely needs to create a shortcut including the appropriate command line switch in order to decompile any given database. The basic syntax would be:
"FullPath\MSACCESS.EXE" "FullPathAndDbNameWithExtension" /decompile
Examples:
"C:\Program Files\Microsoft Office\Office\MSACESS.EXE" "C:\Databases\Test\Database1.mdb" /decompile
Or
"C:\Program Files (x86)\Microsoft Office\Office12\MSACESS.EXE" "C:\Databases\Test\Database1.mdb" /decompile
Reusable decompilation method
On the other hand, it become tedious to create a shortcut for each database you create/manage and as such a more automated method may be a good idea to implement.
- Using Windows Explorer (etc.) navigate your way to your MSACCESS.EXE and the copy the file.
- Navigate to the %APPDATA%\ Microsoft\Windows\SendTo\ Folder
- Right-Click within the folder and select Paste shortcut from the context menu
- Rename the shortcut as you wish, for instance MSACCESS Decompile
- Right-Click on the newly created shortcut and select Properties from the context menu
- On the Shortcut tab, edit the Target control by adding /decompile to the existing value.
You should end up with something along the lines of:
"C:\Program Files (x86)\Microsoft Office\Office12\MSACCESS.EXE" /decompile
Or
"C:\Program Files\Microsoft Office\Office12\MSACCESS.EXE" /decompile
- Click Ok
- Close windows explorer.
Now whenever you wish to decompile a database you need only right-click on the Access database in Windows Explorer and select “Send To –> MSACCESS Decompile.
Special Note
Since after decompiling we always perform a compact of the database, you can perform both in one step if you’d like by appending a /compact to your /decompile command. This is not obligatory by any means. Personally, I prefer the granularity of performing each step myself, but should you wish to automate things a little more you’d do something along the lines of:
"C:\Program Files\Microsoft Office\Office\MSACESS.EXE" "C:\Databases\Test\Database1.mdb" /decompile /compact
Or
"C:\Program Files (x86)\Microsoft Office\Office12\MSACESS.EXE" "C:\Databases\Test\Database1.mdb" /decompile /compact
"C:\Program Files (x86)\Microsoft Office\Office12\MSACCESS.EXE" /decompile /compact
Or
"C:\Program Files\Microsoft Office\Office12\MSACCESS.EXE" /decompile /compact
Do note that if you do implement this variation for the reusable decompilation method, you’d probably be best to also change the name attributed to the command in step 4. to MS Access Decompile and Compact
Proper Steps to Follow when Decompiling an Access Database
I found the following instructions from David Fenton, and thought they fit right into this subject.
- Backup your database.
- Compact your database.
- Decompile your database (per either method listed above).
- Close that instance of Access.
- Open a new instance of Access and open the database you just decompiled, but BE SURE YOU BYPASS ALL STARTUP CODE (i.e., hold down the shift key). If you don’t do that, then you might as well go back to step 3 and try again, since if the startup code runs, your code will recompile before you are ready to do so.
- Compact the decompiled database (and be sure you hold down the shift key so that it bypasses the startup code; see #5).
- Open the VBE and on the Debug menu, choose COMPILE [name of project].
- On the file menu, save the project.
- Compact again.
Why are all these steps necessary?
Because you want to not just decompile the VBA, you want to make sure that all the data pages where the compiled p-code was stored are completely discarded before you recompile.
I also recommend:
- In the VBE options, turn off COMPILE ON DEMAND
- In the VBE, add the COMPILE button to your Toolbar.
- Compile often with that button on the toolbar, after every two or three lines of code.
Last of all, read Michael Kaplan’s article on the subject to understand it better.
MS Access, MS Access General Information, MS Access VBA Programming |
No Comments »
February 14th, 2012
I came across the following post and wanted to see what the issue was since I routinely use Irfanview myself (it is a great, free no strings attached piece of software).
So I contacted the creator of Irfanview directly regarding the error, and he was able to pinpoint the exact nature of the problem. As it turns out, the ico files created by Irfanview are just fine. The issue is that MS Access would seem to expect a specific type of ico file (and doesn’t tell anyone this).
Irfanview creates a 24BPP (with no alpha layer) ico file while MS Access seems (based on my testing and returned information from Irfan) to expect a 32BPP with an alpha layer ico file.
So for anyone else ever seeing this this of error. An ico is not an ico in the world of MS Access. It is picky and requires a specific type of ico file. So just be sure of the type of file your are creating is a 32BPP with an alpha layer ico and you should have no problems using them as a picture for a button. Alternately, instead of having such issues using a ico file, use BMPs instead. I personally don’t like BMPs as they aren’t used in any other programming (always jpg, gif, png, ico) so I will stay with ico so I can reuse them easily where I please. It would be nice if MS would integrate common image files into the application, but that is out of my hands (if it were up to me many issues like this would have been resolve a long time ago!).
Hopefully this will help someone out.
MS Access Forms, MS Access General Information |
No Comments »
December 15th, 2011
In my previous post entitled Splitting and Deploying Your Database, I elaborated on the critical importance of splitting your database before deploying it to your end-users. That said, many people post questions regarding securing their applications from their end-users to minimize their ability to mess around with the database, mainly fool around directly with the tables. In this post I will elaborate on a few possible step you can take as a developer to best secure your database from what I qualify of ‘dangerous’ users.
There are a few things that you can do to try and harden your database against your users. In 2 instances, you have the ability to take some steps using programming to secure your app. In the 3rd, you can deploy your application in a secured method. Let’s examine each.
Hide Object Pane & Disable SHIFT Bypass
As a developer, you can do your best to make it as difficult as possible for any user to gain access to any of your database objects (tables, queries, forms, reports, …) to pose a threat in the first place. To do this you need to:
- Create an autoexec macro the uses RunCode to execute a VBA procedure at startup
- In your startup procedure add in the following code
If SysCmd(acSysCmdRuntime) = False Then
DoCmd.SelectObject acTable, , <strong>True</strong>
DoCmd.RunCommand acCmdWindowHide
End If
This code will hide the Access object browser (the pane that lists all the database objects: tables, queries, forms, reports, …). If they can’t see them, then they can’t mess around with them!
- Since any knowledgeable user knows that they can bypass any autoexec macros by holding the SHIFT key at startup, we need to disable the shift bypass capacity. Now there is no point in rehashing this subject, so please refer to: http://access.mvps.org/access/general/gen0040.htm
Convert to MDE
One more step you can take is to convert your database (mdb/accdb) to an (mde/accde) format. By doing so you lockout the user’s access to the all the VBA code. Furthermore, this creates a compiled version of the database which mean it should be optimized for use. Win, win. Just remember you cannot do development on an (mde/accde), so keep your original file (prior to conversion) for further development.
Deploy Your Database Using Runtime
The last thing you can do to restrict your users and limit their ability to run amuck in your database is to deploy your application using MS Access’s runtime version. Instead of giving your user the full blown MS Access application, only install the free runtime version. Unless, your user needs to do development in the database, there is no need for them to have the full version of MS Access. By doing this, your user will not be able to edit any of the database objects! They will only have access to whatever you have developed and given them access to. Also, note that when deploying using the runtime version ensure you put in place error handling throughout all of your VBA procedures, otherwise when an error is raised, the application will blatantly crash. You can freely download and install the runtime version of MS Access directly from Microsoft’s website at:
MS Access Runtime 2007 -> http://www.microsoft.com/download/en/details.aspx?id=4438
MS Access Runtime 2010 -> http://www.microsoft.com/download/en/details.aspx?id=10910
MS Access, MS Access General Information |
No Comments »
November 29th, 2011
It can sometimes be necessary to determine the version of the program you are working with in VBA and I have been unable to find a comprehensive listing. Microsoft themselves have scattered this information over numerous pages?! Here is what I have compiled myself thus far (Office 2000 through Office 2010 SP1).
| Application Name |
Executable File |
2000 |
2000 SP1 |
2000 SP2 |
2000 SP3 |
2002 |
2002 SP1 |
2002 SP2 |
2002 SP3 |
2003 |
2003 SP1 |
2003 SP2 |
2003 SP3 |
2007 |
2007 SP1 |
2007 SP2 |
2007 SP3 |
2010 |
2010 SP1 |
| Microsoft Office |
mso.dll |
|
|
|
|
10.0.2627.01 |
10.0.3520.0 |
10.0.4330.0 |
10.0.6626.0 |
11.0.5614.0 |
11.0.6361.0 |
11.0.7969.0 |
11.0.8173.0 |
12.0.4518.1014 |
12.0.6213.1000 |
12.0.6425.1000 |
|
14.0.4760.1000 |
14.0.6023.1000 |
| Microsoft Access |
msaccess.exe |
9.0.2720 |
9.0.3821 |
9.0.4402 |
9.0.6926 |
10.0.2627.1 |
10.0.3409.0 |
10.0.4302.0 |
10.0.6501.0 |
11.0.5614.0 |
11.0.6361.0 |
11.0.7969.0 |
11.0.8173.0 |
12.0.4518.1014 |
12.0.6211.1000 |
12.0.6423.1000 |
12.0.6606.1000 |
14.0.4750.1000 |
14.0.6024.1000 |
| Microsoft Binder |
|
|
|
9.0.2702 |
9.0.2702 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Microsoft Excel |
excel.exe |
9.0.2720 |
9.0.3821 |
9.0.4402 |
9.0.6926 |
10.0.2614.0 |
10.0.3506.0 |
10.0.4302.0 |
10.0.6501.0 |
11.0.5612.0 |
11.0.6355.0 |
11.0.7969.0 |
11.0.8173.0 |
12.0.4518.1014 |
12.0.6214.1000 |
12.0.6425.1000 |
12.0.6611.1000 |
14.0.4756.1000 |
14.0.6024.1000 |
| Microsoft FrontPage |
frontpg.exe |
4.0.2.2720 |
4.0.2.3821 |
4.0.2.4426 |
4.0.2.6625 |
10.0.2623.0 |
10.0.3402.0 |
10.0.4128.0 |
10.0.6308.0 |
11.0.5516.0 |
11.0.6356.0 |
11.0.7969.0 |
11.0.8173.0 |
|
|
|
|
|
|
| Microsoft Groove |
groove.exe |
|
|
|
|
|
|
|
|
|
|
|
|
12.0.4518.1014 |
12.0.6211.1000 |
12.0.6421.1000 |
12.0.6600.1000 |
14.0.4761.1000 |
14.1.6009.1000 |
| Microsoft InfoPath |
infopath.exe |
|
|
|
|
|
|
|
|
11.0.5531.0 |
11.0.6357.0 |
11.0.7969.0 |
11.0.8173.0 |
12.0.4518.1014 |
12.0.6214.1000 |
12.0.6413.1000 |
12.0.6606.1000 |
14.0.4763.1000 |
14.0.6009.1000 |
| Microsoft OneNote |
onenote.exe |
|
|
|
|
|
|
|
|
11.0.5614.0 |
11.0.6360.0 |
11.0.7969.0 |
11.0.8173.0 |
12.0.4518.1014 |
12.0.6211.1000 |
12.0.6415.1000 |
12.0.6606.1000 |
14.0.4763.1000 |
14.0.6022.1000 |
| Microsoft Outlook |
outlook.exe/outlib.dll |
9.0.0.2711 |
9.0.0.3821 |
9.0.0.4527 |
9.0.0.6627 |
10.0.2627.1 |
10.0.3416.0 |
10.0.4024.0 |
10.0.6626.0 |
11.0.5510.0 |
11.0.6353.0 |
11.0.7969.0 |
11.0.8173.0 |
12.0.4518.1014 |
12.0.6212.1000 |
12.0.6423.1000 |
12.0.6607.1000 |
14.0.4760.1000 |
14.0.6025.1000 |
| Microsoft PowerPoint |
powerpnt.exe |
9.0.2716 |
9.0.3821 |
9.0.0.4527 |
9.0.6620 |
10.0.2623.0 |
10.0.3506.0 |
10.0.4205.0 |
10.0.6501.0 |
11.0.5529.0 |
11.0.6361.0 |
11.0.7969.0 |
11.0.8173.0 |
12.0.4518.1014 |
12.0.6211.1000 |
12.0.6425.1000 |
12.0.6600.1000 |
14.0.4754.1000 |
14.0.6026.1000 |
| Microsoft Project |
winproj.exe |
|
|
|
|
10.0.2915.0 |
10.0.8326.0 |
|
|
11.0.5614.0 |
11.0.6707.0 |
11.0.7969.0 |
11.0.8173.0 |
12.0.4518.1014 |
12.0.6211.1000 |
12.0.6423.1000 |
|
14.0.4751.1000 |
14.0.6023.1000 |
| Microsoft Publisher |
mspub.exe |
|
|
|
|
10.0.2621.0 |
10.0.3402.0 |
10.0.4016.0 |
10.0.6308.0 |
11.0.5525.0 |
11.0.6255.0 |
11.0.7969.0 |
11.0.8173.0 |
12.0.4518.1014 |
12.0.6211.1000 |
12.0.6423.1000 |
12.0.6606.1000 |
14.0.4750.1000 |
14.0.6026.1000 |
| Microsoft SharePoint Designer |
spdesign.exe |
|
|
|
|
|
|
|
|
|
|
|
|
12.0.4518.1014 |
12.0.6211.1000 |
12.0.6423.1000 |
|
14.0.4750.1000 |
|
| Microsoft Visio |
vision.exe/vislib.dll |
|
|
|
|
10.0.525 |
10.1.2514 |
10.2.5110 |
|
11.0.3216.5614 |
11.0.4301.6360 |
11.0.7969.0 |
11.0.8173.0 |
12.0.4518.1014 |
12.0.6211.1000 |
12.0.6423.1000 |
|
14.0.4756.1000 |
14.0.6022.1000 |
| Microsoft Word |
winword.exe |
9.0.2720 |
9.0.3821 |
9.0.4402 |
9.0.6926 |
10.0.2627.0 |
10.0.3416.0 |
10.0.4219.0 |
10.0.6612.0 |
11.0.5604.0 |
11.0.6359.0 |
11.0.7969.0 |
11.0.8173.0 |
12.0.4518.1014 |
12.0.6211.1000 |
12.0.6425.1000 |
12.0.6612.1000 |
14.0.4762.1000 |
14.0.6024.1000 |
You can also download a copy in csv format so you can import it into the program of your choice by clicking here.
Also, note that some of this information is impossible to find on any official website (but then again, why would I be writing such a post if it were!) so there could be mistakes. This is based on what I could find online and what I managed to piece together by looking over various computers. If you find mistakes, please use the contact form to send me an e-mail and I will make the necessary corrections promptly.
Here are a few of my references that I used to compile this list:
Office 2000
Office 2002 (Office XP)
Office 2003
Office 2007
General info on how to retrieve the Executable’s build number
MS Access, MS Access General Information, MS Office |
No Comments »
November 7th, 2011
Once one delves into the wonderful world of MS Access & VBA programming, you quickly gets faced with the problem of executing queries and SQL statements from within VBA. No in general, this does not pose much of an issue and there are any number of great tutorials that cover the various way to handle this. For instance, Database Journal has a great article by Danny Lesandrini entitled Executing SQL Statements in VBA Code which covers all the methods available to a developer and explains the pros and cons of each.
That said, all of these articles cover but the basic idea of a simple SQL Statement. What happens if you want to execute a parameter query? How do you approach that. In fact, this isn’t to big an issue either, once you are shown how to handle it.
Firstly, let us very briefly cover the subject of a Parameter. What is a parameter? In a query, we can specify a criteria. In most instances, the criteria will be a static value. That said, it become necessary in many instances to make these criteria dynamic, and to do this there are different methods, but one common approach is to refer to a control on a form, thus allowing the end-user the ability to specify the criteria to apply to the query. This is what I am referring to in this post.
The problem arises that if you merely try to execute a query with a criteria to a form control, it will result in an error “Too Few Parameters”. The work around is that we much first make the database evaluates each parameter before running the query, to do so, we use the following code
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim prm As DAO.Parameter
Dim rs As DAO.Recordset
Set db = CurrentDb
Set qdf = db.QueryDefs("YourQueryName")
For Each prm In qdf.Parameters
prm = Eval(prm.Name)
Next prm
Set rs = qdf.OpenRecordset
'Work with the recordset
rs.Close 'Close the recordset
'Cleanup after ourselves
Set db = Nothing
Set qdf = Nothing
So how does it work exactly? Well, we start off by specifying which query we are working with by setting the value of the qdf variable. Next, we llop through the parameters and evaluate each one. Finally, we execute the query. So simple, once you are shown the proper tachnique!
You may wish to look over the sample database found at Roger’s Access Library entitled Too few Parameters.
Uncategorized |
No Comments »
November 4th, 2011
One of my greatest annoyances with Access is the fact that Microsoft in their infinite wisdom created a great field data type ‘Yes/No’ which you would think would be great for creating a Yes/No Option Group with. This is true if you want to have a default value, but what happens if you want to allow for a Null state, what is commonly referred to as a triple state field/Option Group, to allow for the case (a common situation in my experience) where you would like a Yes/No Option Group but leave it blank until the user actually makes a selection then the Yes/No data type no longer works?! You cannot have a Null value with a standard Yes/No Field.
So what is one to do?
Well, thankfully the solution is actually very simple. Change the data type from Yes/No to Number and change the Field Size to suit your particular needs. For instance, if like me, you wanted to assign -1 to Yes and 0 to No then you would have to change the Field Size to Integer.
MS Access Forms |
No Comments »
October 4th, 2011
We tend to see numerous questions relating to MS Access Autonumbers. Specifically, regarding autonumber not following sequence, skipping sequence.
Regardless of how one might interpret what is written in the help files, AutoNumbers should never, ever, ever, be relied upon as a sequential number. Nor should they ever be used/displayed to the end-user. The simple fact of the matter is that AutoNumbers are merely unique identifiers for each record. Even when set to be incremental, the AutoNumber can be indexed even though no record was actually inserted into the table. This is not a bug, this is simply the way Access was developed.
So what does one do if they require a sequencial number to attribute to each record. The solution is actually very simple. Create a new field in your table and then you can used an equation such as =Dmax(…)+1 to generate the next number in your sequence. But at the end of the day, if you want a sequential number that will not jump sequence and can be faithfully relied upon, you have to create it yourself!
MS Access, MS Access General Information, MS Access Tables |
No Comments »
July 21st, 2011
Now here is a question I had myself many years ago and could never find a proper answer to! And yet it is such a basic element and such an important one at that!!!
So when one creates a split database (which they all should be), where do you create the tables relationships exactly? Do you create the MS Access table relationship within the Front-End or the Back-End?
The short answer is, in the Back-End. Here are a few explanation from a couple fellow MVPs taken from a recent forum question.
The relationships need to be established in the backend. In fact, you can build a diagram in the frontend but for the backend tables, the referential integrity will not be enforced if the relationships aren’t in the backend — Bob Larson, Access MVP
If you create relationships in the front end the only thing it achieves is that it determines the default joins types when you create a query in design view. To ensure data integrity through enforced relationships they must be created in the back end. So, the recent advice you were given is wrong. You can if you wish create them in the front end in addition to, but certainly not in place of, those in the back end. — Ken Sheridan
What is important to understand here is the fact that you should always create your table relationships in the Back-End of your database. That said, as Ken stated it can be useful to merely recreate them within the Front-End as well to simplify Query building, but then this then incurs extra overhead when the database is modified (Now you have to update the relationships in both locations). The other time when you might create MS Access table relationships within the Front-End of your database is because you have lookup table, reference tables in the Front-End. In such a case, obviously you can’t create the necessary table relationships in the Back-End since the tables don’t exists there. As such, you’d create the necessary relationships directly within the Front-End to ensure referential integrity.
MS Access General Information, MS Access Tables |
No Comments »
May 25th, 2011
Here is a simple bit of code that permits you to hide the MS Access’ main object browser, to stop nosy users from accessing tables, queries, etc…
DoCmd.SelectObject acTable, , True
DoCmd.RunCommand acCmdWindowHide
In conjunction with the code to determine whether the user is running the runtime or full version of Access (see MS Access – Determine if Runtime or Full Version
) you could insert a section of code such as:
If SysCmd(acSysCmdRuntime) = False Then
DoCmd.SelectObject acTable, , True
DoCmd.RunCommand acCmdWindowHide
End If
This would also be a good place to enable any custom command bars/ribbons and/or disable any built-in command bars/ribbons…
MS Access Forms, MS Access Queries, MS Access Reports, MS Access Tables, MS Access VBA Programming |
No Comments »
April 30th, 2011
I came across an article about optimizing queries using a hidden JET tool call SHOWPLAN which basically generates a showplan.out file (which is merely a text file) which elaborates the method used by Access to execute the query. With this information it is possible to perform optimizations, determine which fields require indexing…
I’m not going to rewrite the article, if the subject interests you, then simply look at the source article.
That said, I did want to try and add a little more information for anyone trying to get this to work using Windows 7 (possibly Windows Vista – untested). To be able to use ShowPlan one must create a registry entry to enable it. In the original atricle, they indicate that the base registry key is found at:
\\HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\JET\4.0\Engines
this may be the case for Windows XP, but if you are using Windows 7 (and I suspect Vista as well) you will not find this key. Instead look for:
\\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines
MS Access General Information, MS Access Queries |
No Comments »
April 8th, 2011
I recently had to make a minor change to a poorly designed, but large database and had to determine where certain fields were being used so I could go make the necessary changes. In this case, I had to review hundreds of MS Access objects, so a manual approach was just not acceptable. As such, I created a VBA to let the computer do the checking for me and report back. Below is the fruits of my labor.
'---------------------------------------------------------------------------------------
' Procedure : FindFieldUsedWhere
' Author : Daniel Pineault, CARDA Consultants Inc.
' Website : http://www.cardaconsultants.com
' Purpose : Locate where a field is used within queries, forms and reports
' Copyright : The following may be altered and reused as you wish so long as the
' copyright notice is left unchanged (including Author, Website and
' Copyright). It may not be sold/resold or reposted on other sites (links
' back to this site are allowed).
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sFieldName : Field Name to search for in the various Access objects
'
' Usage:
' ~~~~~~
' FindFieldUsedWhere("Type A")
'
' Revision History:
' Rev Date(yyyy/mm/dd) Description
' **************************************************************************************
' 1 2011-04-08 Initial Release
'---------------------------------------------------------------------------------------
Function FindFieldUsedWhere(sFieldName As String)
On Error GoTo Error_Handler
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim sSQL As String
Dim ctl As Control
Dim frm As AccessObject
Dim DbO As AccessObject
Dim DbP As Object
Set db = CurrentDb
Debug.Print "FindFieldUsedWhere Begin"
Debug.Print "Searching for '" & sFieldName & "'"
Debug.Print "================================================================================"
'Check Queries
For Each qdf In db.QueryDefs
'qdf.Name 'The current query's name
'qdf.SQL 'The current query's SQL statement
sSQL = qdf.SQL
If InStr(sSQL, sFieldName) Then
'The Query is a Make Table Query and has our TableName we are looking for
Debug.Print "Query: " & qdf.Name
End If
Next
'Check Forms
For Each frm In CurrentProject.AllForms
DoCmd.OpenForm frm.Name, acDesign
If InStr(Forms(frm.Name).RecordSource, sFieldName) Then
'The Query is a Make Table Query and has our TableName we are looking for
Debug.Print "Form: " & frm.Name
End If
'Loop throught the Form Controls
For Each ctl In Forms(frm.Name).Form.Controls
Select Case ctl.ControlType
Case acComboBox
If Len(ctl.Tag) > 0 Then
If InStr(ctl.Tag, sFieldName) Then
'The Query is a Make Table Query and has our TableName we are looking for
Debug.Print "Form: " & frm.Name & " :: Control: " & ctl.Name
End If
If InStr(ctl.ControlSource, sFieldName) Then
'The Query is a Make Table Query and has our TableName we are looking for
Debug.Print "Form: " & frm.Name & " :: Control: " & ctl.Name
End If
End If
Case acTextBox, acCheckBox
If InStr(ctl.ControlSource, sFieldName) Then
'The Query is a Make Table Query and has our TableName we are looking for
Debug.Print "Form: " & frm.Name & " :: Control: " & ctl.Name
End If
End Select
Next ctl
DoCmd.Close acForm, frm.Name, acSaveNo
Next frm
'Check Reports
Set DbP = Application.CurrentProject
For Each DbO In DbP.AllReports
DoCmd.OpenReport DbO.Name, acDesign
If InStr(Reports(DbO.Name).RecordSource, sFieldName) Then
'The Query is a Make Table Query and has our TableName we are looking for
Debug.Print "Report: " & DbO.Name
End If
'Loop throught the Report Controls
For Each ctl In Reports(DbO.Name).Report.Controls
Select Case ctl.ControlType
Case acComboBox
If Len(ctl.Tag) > 0 Then
If InStr(ctl.Tag, sFieldName) Then
'The Query is a Make Table Query and has our TableName we are looking for
Debug.Print "Report: " & DbO.Name & " :: Control: " & ctl.Name
End If
If InStr(ctl.ControlSource, sFieldName) Then
'The Query is a Make Table Query and has our TableName we are looking for
Debug.Print "Report: " & DbO.Name & " :: Control: " & ctl.Name
End If
End If
Case acTextBox, acCheckBox
If InStr(ctl.ControlSource, sFieldName) Then
'The Query is a Make Table Query and has our TableName we are looking for
Debug.Print "Report: " & DbO.Name & " :: Control: " & ctl.Name
End If
End Select
Next ctl
DoCmd.Close acReport, DbO.Name, acSaveNo
Next DbO
Debug.Print "================================================================================"
Debug.Print "FindFieldUsedWhere End"
Error_Handler_Exit:
On Error Resume Next
Set qdf = Nothing
Set db = Nothing
Set ctl = Nothing
Set frm = Nothing
Set DbP = Nothing
Set DbO = Nothing
Exit Function
Error_Handler:
MsgBox "The following error has occured" & vbCrLf & vbCrLf & _
"Error Number: " & Err.Number & vbCrLf & _
"Error Source: FindFieldUsedWhere" & vbCrLf & _
"Error Description: " & Err.Description, vbCritical, "An Error has Occured
Resume Error_Handler_Exit
End Function
This is my first draft and I haven’t looked at optimizing my code. It was more about getting results than developing a procedure to be reused often. Hopefully it can help someone else in the same boat as I found myself! Simply execute the procedure and it will return a listing of what Access objects use the specified field in the immediate window of the VBE console.
MS Access Forms, MS Access Queries, MS Access Reports, MS Access VBA Programming |
1 Comment »
April 7th, 2011
In any well developed MS Access database it becomes necessary to automate the relinking of the back-end database tables. There are any number of existing resources that you can very rapidly implement.
Below are a few useful link to get you going:
In complexe database setups, it may become necessary to relink your database to multiple back-ends. I started out writting my own code to do this and then came accross nice sample from David Fenton Associates:
Hopefully these links will save you some time searching the net.
MS Access, MS Access Tables, MS Access VBA Programming |
No Comments »
March 10th, 2011
Below is a post I made regarding Microsoft’s latest update to the Microsoft Answer Forum. I think it speaks for itself. Ultimately, MS seems to have tried to make something visually appealing rather than functional and useful. Let me know your opinion!
Disappointing, Another Step in the Wrong Direction
When I heard that Version 2.0 was going to be implemented, I was looking forward to it. I thought MS finally listened to its users and was going to remedy the various bugs in Version 1.0. Sadly this has not been the case. Rather you have choosen to basically throw us a new forum. So we are back at the beginning, again.
Esthetics, well some people will like the colors, layout, …, some won’t… this is a personal question. The site is less cluttered, I guess that is a positive point.
Functionality, now that is another issue.
- Why is it, yet again, our profiles (signature in my case) did not follow in this new version? And why is the signature field reduced from the last version?
- Still experiencing latency, poor performance, no response…
- What happened to inline reply? Now one has to, one by one, enter each post to read it and then reply. Then return to the main page… This is ridiculous!!! MS has taken 10 steps back on ease of use from this stand point.
- What happened to being able to read the entire post inline. The pop-up feature is a joke.
- Why the change in the point system? Why have a point system altogether?
- What happend to posting questions easily? Now I enter a question, no wait that is supposed to be a title!? Confusing! then when I press ask, it brings me to another window… Then I press ask again! and I finally get to a proper windows to enter my question!? WOW!!! Now that is what I call obvious and user-friendly.
- What happened to the unanswer button? A post has been marked as answered and yet it isn’t?
- Similarily, what happened to the Propose as an answer button?
- We still cannot include <code> tags, so so much for addressing user requests.
- We still cannot insert images, or attach files unless we post them on 3rd party servers and know enough about HTML to code it ourselves (which most users will not).
- Why is the NNTP Bridge no longer supported?
- Why is it when you perform a search there is no date information relative to the thread?
- Why is the page navigation only for 1 page forward or 1 page backward? What happened to a series of page number 1 through say 20? Why can’t I jump 10 pages? Everything has been done to limit our ability to work!
- Why is it that the filter controls (Forum, Office Version, Office Topic, …) do not appear/work in alternate browsers such as Firefox? IE is no longer the only browser available to users. UPDATE — Now it appears they are working.
On a side note, I must say I was amused how MS’ announcement go over top of the search bar… So in fact, if you don’t know any better, and this being a new version… user will not realize how to manoeuver the site and probably close it!
As an MVP, I enjoy coming to this site to help others. I enjoy the challenge of solving the various questions put forth by others, sadly, MS has made it more challenging to use their new forum then to actually interact and answer the questions.
The entire process of having 2 new versions in 6 months (or so) and making your user adapt, adapt to new layout, change in functionalities show truly poor planning and a lack of respect for your end-user, or let’s be frank your clients.
With the number of exisiting proven forum applications why did MS feel the need to try an create their own? Why have these attempts been done so half heartedly?
Disappointing.
General Technology Discussion |
No Comments »
February 15th, 2011
Here is another common question, how can I control the Application window itself? Well that depends on what exactly you wish to do. So things are easy to do and other require APIs, etc.
Minimize/Maximize and Restore the MS Access Application Window
One can very easily control the Application Window state with one simple command, the often overlooked DoCmd.RunCommand!
DoCmd.RunCommand acCmdAppMinimize 'Minimize the MS Access Application
DoCmd.RunCommand acCmdAppMaximize 'Maximize the MS Access Application
DoCmd.RunCommand acCmdAppRestore 'Restore the MS Access Application
Completely Hide the MS Access Application Window
Once again, a not so uncommon question. Now implementing it requires a little more programming than merely minimizing or maximizing the application window, but it can be done! Now if you Google the subject you will find any number of code samples. That said, before I ‘waste‘ my time searching for anything relating to MS Access I always go and check The Access Web where you will find a ready to use API entitled Manipulate Access Window to do exactly this.
MS Access VBA Programming |
No Comments »
January 17th, 2011
I was recently working on a database of mine which has been in production for over 4 years now and all of a sudden it started giving me the error: “The Save Operation Failed”. Nothing like a nice obscur error message from the VBA/VBE!!!
I tried the normal approaches: Compact and repair, Decompile/Recompile, … None worked for me.
I took a look at Microsoft’s Knowledge Base and found an article, ACC97: Error “The Save operation failed” When Saving a Module, for Access 97 (as a lot of the information can be used in furture version, I read it over). Sadly, the article is pretty much useless.
In the end, the solution, for me, was to start a new database and import all of the database objects (File -> Get External Data -> Import) from the database giving me the error message. Setup the startup properties… and everything was in working order again!
I hope this helps someone else in the same perdicament!
MS Access, MS Access General Information, MS Access VBA Programming |
No Comments »
January 6th, 2011
One thing any good worker will tell you is that you must have the right tools to do the job. Computer programming, MS Access database development, is no exception to this rule! I thought I’d list a few add-ins, plug-ins, etc. that I have come across, or heard of. This is an unbiased listing and I have no link to any of the vendors, nor have I even used all of them. I am simply trying to regroup them to help you find them, and you can judge their usefullness on your own. In a future post, I will examine the 2 or 3 that I use myself and find very useful.
Free Ones
MZ-Tools
Smart Indenter
V-Tools
Ones you have to pay for
Find and Replace (30 day evaluation then you have to register/pay)
FMS Inc. Tools — FMS offers a multitude of various tools worth reviewing, including: Total Visual Source Book and Total Access Admin
A Few More Untested Add-ins (Update 2011-Mar-09)
Various utilies by Bill Mosca (Access MVP)
ACCESS Dependency Checker
http://www.4tops.com/query_tree.htm
http://www.4tops.com/ms_access_vba.htm
Compare Em – Compare 2 database to identify the differences and generate the necessary code to make the updates.
MS Access General Information, MS Access VBA Programming, MS Excel VBA Programming, MS Office, MS Word VBA Programming |
No Comments »
December 5th, 2010
Below is come sample VBA which illustrates how one can easily loop through all the controls within a form to identify and work with them.
Dim ctl As Control
For Each ctl In Me.Controls
ctl.Name 'Get the name of the control
ctl.Value 'Get or set the value of the control
ctl.Visible = False 'Control the visibility of the control
Next ctl
Now how can this be put to good use? Well one use for such code would be to setup a Select All, or Select None button for a series of check boxes on a form. Below is what the code could look like for each command button:
'Select All
Dim ctl As Control
For Each ctl In Me.Controls
If ctl.ControlType = acCheckBox Then
If ctl.Value <> True Then
ctl.Value = True
End If
End If
Next ctl
'Select None
Dim ctl As Control
For Each ctl In Me.Controls
If ctl.ControlType = acCheckBox Then
If ctl.Value <> False Then
ctl.Value = False
End If
End If
Next ctl
Lastly, you could easily adapt the general form specific code and transform it into a generic procedure to which you will supply the form name to loop through the control, rather than working with the current form, you could do something along the lines of:
Function YourProcedureName(ControlName As String, frm As Access.Form)
Dim ctl As Access.Control
For Each ctl In frm.Controls
Next ctl
End Function
MS Access Forms, MS Access VBA Programming |
4 Comments »
November 23rd, 2010
This database demonstrates how to insert a clock in your forms to display the current time as well as a demonstration of how to create a timer used to determine the amount of time which a form has been open for.
Download the sample database: MS Access Clocks and Timers Sample Database
MS Access Samples |
Comments Off
November 22nd, 2010
This database demonstrates some of the most common ways to work with dates. It demonstrates how to extract only a part of a date (year, month or day), how to display a date in different formats (ISO, American,…), how to determine the number of days, weeks between 2 dates, etc.
Download the sample database: MS Access Working with Dates Sample Database
MS Access Samples |
Comments Off
November 20th, 2010
This database example show the proper way to work with images within a database (which is not to embed them into the database).
Download the sample database: MS Access Images Sample Database
MS Access Samples |
Comments Off
November 19th, 2010
If you are using user-level security (ULS), the following is a simple demonstration of a form that can be added to any database to permit the user the ability to change their password. Useful when you create an mde or disable the standard toolbars for increased security but still want to give the user the ability to rotate their own password.
Download the sample database: User-Level Security Change of Password Form Demonstration
MS Access Samples |
Comments Off
November 18th, 2010
This database provides a single form which permits the user to either import or export data to/from the database from a selected source (spreadsheet).
Download the sample database: MS Access Data Transfer Sample Database
MS Access Samples |
Comments Off
November 17th, 2010
This is a very simple database which provides the user a form which permits them to convert color values between OLE Color values, RGB values and HEX values.
Download the sample database: MS Database Color Converter Sample Database
MS Access Samples |
Comments Off
November 16th, 2010
This database demonstrates common programming concepts, such as: basing one combo box’s list on anothers value, changing a control’s background color, changing a form’s background color. This sample database will be updated as I have time to add to it.
Download the sample database: Common MS Access Issues Sample Database
MS Access Samples |
Comments Off
August 24th, 2010
Splitting and Deploying Your Database
So you’ve developed a database and now you are finally ready to deploy it to your users! There are a couple things to consider to simplify your life as much as possible.
Split Your Database
Split? Yes, if you have not done so, and you are setting up a network or multi-user database, it is time to split your database. This is a simple process by which the tables are placed into one database (called the Back-End) and the remaining database objects (queries, form, report, code) are placed into another database (called the Front-End).
The Back-End is then placed on the office server and a copy of the Front-End is given to each user and setup on their PC. DO NOT allow your users to all connect using the same Front-End file, they should each have their own copy on their machine.
Why Split your Database
There are numerous reasons/advantages to splitting your database, such as:
- Performance – Since the Front-End is located on each user PC, it can have significant benefits in overall performance.
- Reduced Network Traffic – Since the Front-End is located on each user PC there is that much less data to transfer back and forth over the network.
- Maintenance/Updating – Splitting the database simplifies the process of performing updates. By creating update scripts, you can in effect simply replace the front-end and automatically upload it to your users while never having to take the database offline.
- Reduces Corruption – It has been stated that splitting your database can reduce data corruption.
- Multi-User – Splitting your database permits multiple-user simultaneous usage of your database.
How-to Split Your Db (Access 2000-2003)
Tools->database utilities->Database Splitter
How -to Split Your Db (Access 2007)
Database Tools -> Move Data -> Access Database
Database Splitting References
Split your Access database into data and application
Splitting a access database, or how to run ms-access in a multi-user mode
Splitting Microsoft Access Databases to Improve Performance and Simplify Maintainability
MS Access, MS Access General Information |
1 Comment »