The Best Upgrade I’ve Made All Year Took Four Hours

Sometimes the best ideas show up when you’re not even trying.

🧰 The Setup

I wasn’t feeling it that day. The real work could wait.

So instead, I opened our main Access database—the one that basically runs Precision Conveyor—and started tinkering. Four hours later, I had built one of the most useful upgrades we’ve ever had.

I’d wanted visual part identification for a while. When someone opens a quote or a BOM, I wanted them to see the part, not just read a vague description and guess. It didn’t need to be fancy—just a clean image pulled straight from our Autodesk Inventor 3D models.

Turns out, that’s all it took.

Auto-generated product images from Autodesk Inventor displayed in a Microsoft Access form alongside part data.
Screenshot of the Precision Conveyor Access database showing 3D part images linked to each record.

🧩 The New Integration

The new setup automatically generates and attaches product images from our Inventor 3D models to each part record in the database.

				
					
Public Sub DB_AttachPNGToPart(varPartAutoNumber As Variant)

On Error GoTo MyErrorHandler_Err

' Get the active document.
Dim invDoc As Document
Set invDoc = ThisApplication.ActiveDocument

' Iterate through the list of documents.
Dim pngFileName As String
 
 'get the built in inventor properties
Dim propsetBuiltIn As Inventor.PropertySet
Set propsetBuiltIn = invDoc.PropertySets.Item("Design Tracking Properties")

'get the built in inventor summary info
Dim propsetSummaryInfo As Inventor.PropertySet
Set propsetSummaryInfo = invDoc.PropertySets.Item("Inventor Summary Information")

'Get data to find visible workplanes
Dim oOccs As ComponentOccurrences
Set oOccs = invDoc.ComponentDefinition.Occurrences


'set variables and save STP file
Dim strDocOpenString As String
Dim strFileName As String
Dim strDocumentType As String
Dim bolSendToSupplier As Boolean
Dim strFileType As String
Dim strBasePath As String
Dim strFileExt As String
Dim strDocumentLocation As String

strDocumentType = "PCT Production PNG"
bolSendToSupplier = True
strFileType = "PNG"
strDocumentLocation = "Part Number Folder"

strBasePath = Left(invDoc.FullFileName, InStrRev(invDoc.FullFileName, "\"))
strFileName = GetProperty(propsetBuiltIn, "Part Number") & " Rev " & GetProperty(propsetSummaryInfo, "Revision Number")
strFileExt = ".png"

Dim strCurrentFileExt As String
strCurrentFileExt = Split(invDoc.FullFileName, ".")(UBound(Split(invDoc.FullFileName, ".")))
    
Select Case strCurrentFileExt
    Case Is = "dwg"
        GoTo ExitSub
    Case Is = "idw"
        GoTo ExitSub
    Case Else
End Select

'create file
pngFileName = strBasePath & strFileName & strFileExt

'go back to home view
ThisApplication.CommandManager.ControlDefinitions.Item("AppViewCubeHomeCmd").Execute

'Get the active view.
Dim oView As view
Set oView = ThisApplication.ActiveView

'configure view for export
oView.DisplayMode = DisplayModeEnum.kWireframeNoHiddenEdges
oView.ShowGroundReflections = False
oView.ShowGroundShadows = False
oView.ShowAmbientShadows = False
oView.ShowObjectShadows = False

ThisApplication.ColorSchemes.Item("Presentation").Activate 'this color scheme contains a white background

Dim camera As camera
Set camera = oView.camera

camera.Fit
camera.Apply

'Create a new NameValueMap Object
Dim oOptions As NameValueMap
Set oOptions = ThisApplication.TransientObjects.CreateNameValueMap
  
'oOptions.value("TransparentBackground") = True
Call oView.SaveAsBitmapWithOptions(pngFileName, 800, 0, oOptions)

        
'log newly created PNG into database
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

'Open query
'rs.Open (cnDB.Execute("qryACAD_TBUpdate"))
strDocOpenString = "SELECT tblPrecisionPartsDocuments.PartAutoNumber, tblPrecisionPartsDocuments.DocumentFileName, tblPrecisionPartsDocuments.DocumentFileType, " _
    & " tblPrecisionPartsDocuments.DocumentType , tblPrecisionPartsDocuments.SendToSupplier, tblPrecisionPartsDocuments.DocumentLocation, tblPrecisionPartsDocuments.RevisionLevel," _
    & " tblPrecisionPartsDocuments.CreatedBy , tblPrecisionPartsDocuments.CreatedDate, tblPrecisionPartsDocuments.RevisionLevel, tblPrecisionPartsDocuments.POAutoNumber, tblPrecisionPartsDocuments.AutoCreated" _
    & " FROM tblPrecisionPartsDocuments" _
    & " WHERE (((tblPrecisionPartsDocuments.PartAutoNumber)=" & varPartAutoNumber & ") AND ((tblPrecisionPartsDocuments.DocumentFileName)='" & strFileName & "') " _
    & " AND ((tblPrecisionPartsDocuments.DocumentFileType)='" & strFileType & "') AND ((tblPrecisionPartsDocuments.POAutoNumber) Is Null));"

rs.Open strDocOpenString, CreateSQLConnection, adOpenDynamic, adLockPessimistic
'Debug.Print strDocOpenString

If rs.EOF Then
    rs.AddNew
        rs.Fields("PartAutoNumber").value = varPartAutoNumber
        rs.Fields("DocumentFileName").value = strFileName
        rs.Fields("DocumentFileType").value = strFileType
        rs.Fields("DocumentType").value = strDocumentType
        rs.Fields("SendToSupplier").value = bolSendToSupplier
        rs.Fields("DocumentLocation").value = strDocumentLocation
        rs.Fields("RevisionLevel").value = GetProperty(propsetSummaryInfo, "Revision Number")
        rs.Fields("CreatedBy").value = fOSUserName()
        rs.Fields("CreatedDate").value = Now()
        rs.Fields("AutoCreated").value = True
    rs.Update
Else
    rs.Fields("DocumentFileName").value = strFileName
    rs.Fields("DocumentFileType").value = strFileType
    rs.Fields("DocumentType").value = strDocumentType
    rs.Fields("SendToSupplier").value = bolSendToSupplier
    rs.Fields("DocumentLocation").value = strDocumentLocation
    rs.Fields("RevisionLevel").value = GetProperty(propsetSummaryInfo, "Revision Number")
    rs.Fields("CreatedBy").value = fOSUserName()
    rs.Fields("CreatedDate").value = Now()
    rs.Fields("AutoCreated").value = True
    rs.Update
End If
    
If Not rs Is Nothing Then rs.Close: Set rs = Nothing
If CreateSQLConnection Is Nothing Then CreateSQLConnection.Close

'put the view back to default
'configure view for export
oView.DisplayMode = DisplayModeEnum.kShadedWithEdgesRendering
oView.ShowGroundReflections = False
oView.ShowGroundShadows = False
oView.ShowAmbientShadows = False
oView.ShowObjectShadows = False

ThisApplication.ColorSchemes.Item("Light").Activate 'this color scheme contains the standard background

camera.Fit
camera.Apply

MyErrorHandler_Err:
    Select Case Err.Number
    Case 0
        'Resume Next
    Case Is <> 0, 91, -2147467259
        If Not rs Is Nothing Then rs.Close: Set rs = Nothing
        If CreateSQLConnection Is Nothing Then CreateSQLConnection.Close
        MsgBox Err.Number & " " & Err.Description, vbOKOnly, "Error in DB_AttachSTPToPart"
    End Select

ExitSub:

End Sub
				
			

Those images now show up everywhere:

Quotes have thumbnails right next to line items Shipping docs include visual confirmation before anything leaves BOMs and inventory screens show exactly what’s sitting on the shelf

For new or less-experienced employees, it’s a huge improvement. No more guessing which bracket is which. No flipping through drawings. Just open the form and know exactly what you’re looking at.

⚙️ Why Access Still Works

People love to say Microsoft Access is outdated. I get it—it’s been around forever. But while everyone else rebuilds the same dashboards in ten different web apps, mine’s quietly automating half the company.

Access still does what most “modern” systems can’t: tie data, logic, and automation together in one fast, local package. With a little VBA, it talks to anything—PDFs, CAD, Excel, you name it.

No subscriptions. No API key drama. No “please wait while loading.” Just instant, reliable results.

What started years ago as a quoting database has grown into an operating backbone for the whole business. And it’s still evolving, one afternoon project at a time.

🧠 Lessons Learned

“Legacy” tools aren’t the problem—lack of creativity is. You don’t need new platforms; you need better ideas. Four hours of curiosity can save hundreds of hours later.

🏁 Closing Thought

“The real trick isn’t chasing new software—it’s making the tools you already have do new things.”

That’s been the story of my career, really. I just keep bending what’s in front of me until it works better than anyone expected.

 

Leave a Reply

Your email address will not be published. Required fields are marked *