Sequence crashes on repetition

K

Karen

I'm trying to fill in a sub-table with new entries, as well as update
existing ones. The routines I wrote that create individual entries appear to
work fine on their own. I then wrote a routine that would step through the
master table creating the sub-table entries by appropriately calling the
individual routines.

Problem is, the master table has some 3000+ records, but the routine
stepping through it fails about half way through, usually with some error
that the "data has changed" or that I'm out of memory. I've tried a fresh
system boot, nada. I've tried processing the records in smaller batches, but
it still fails after about the same number of records have been processed.

I've checked the routines closely and I don't see anything in particular
that I'm not cleaning up, so I'm wondering if it may have something to do
with VBA or MS Access. The code in the routines is fairly simple, in my
limited experience. I'm not using any recordsets and only one routine runs
any SQL (to add a new record). There are a few local variables (strings &
numbers). The main approach is to open a form or two to grab some needed
info, do some math in the local variables then set the needed field values.
The forms are typically closed before the next item in the master list is
processed.

Can someone with a little more experience/knowledge help me out? Is it the
repeated open/close of the forms? I don't know where to start making changes.
 
P

pietlinden

Without seeing the code you're trying to run, it's impossible to
tell. Please post it.
 
K

Karen

Pardon the delay in getting this posted. It's quite a bit. Individually,
running this on just one or a few PNs works, just not the entire inventory
log full (4500+ items).

Forms involved:
Stock Location List - form that lists various locations that stock of an
item can be with quantity of item at that location
Stock Locations Move Form - just a hidden form I use to hold some info and
indicate what's going on by its presence
Inventory Log form - list of items in inventory, it's where the button is
that does a 'global' locations update, which is what is failing, ultimately.
Alloc WO Subform - a list of active work orders with quantities involved
Part Tiers - tells about the values of an item's stock on hand (may
ultimately be replaced by the stock locations stuff if I can get that to work
reliably)

This is the code behind the button on the form. The subsequent Functions
reside in a module that I can call from anywhere. The StockLocIn function
has been in service for a few months.


Private Sub GlobalLocButton_Click() 'added 8/13/08, kah - adapted from
global WIP routine

On Error GoTo GlobalLocError

Dim ItemCount As Integer
Dim AlloCount As Integer
Dim WipCount As Currency
Dim stPTier, stAlloc As String
Dim stLinkCriteria As String
Dim DoLoc As Integer
Dim VBAns As Variant
Dim SQLStr As String

' VBAns = MsgBox("This will erase Inspection location quantities. Do you
want to continue?", vbYesNo, "Warning - Continue?")
' If VBAns = vbNo Then GoTo GlobalLocExit
[LocAdjInProgress] = True
VBAns = MsgBox("Do you want to start with cleared locations?", vbYesNo,
"Warning - Clear locations?")
If VBAns = vbNo Then GoTo skiplocclear

'clear all bin quantities
SQLStr = "UPDATE [Stock Locations] SET [Stock Locations].BQty = 0,
[Stock Locations].BinCost = 0, [Stock Locations].BinShort = 0;"
DoCmd.SetWarnings False
DoCmd.RunSQL SQLStr
DoCmd.SetWarnings True

'WHILE I'M HERE - DELETE ALL WO* LOCATIONS SINCE WILL BE RECREATED
'clear all bin quantities
' SQLStr = "DELETE ...;"
' DoCmd.SetWarnings False
' DoCmd.RunSQL SQLStr
' DoCmd.SetWarnings True

skiplocclear:

stAlloc = "Allocation WO Subform"
stPTier = "Part Tiers"

'-- Count Inventory Line Items --
DoCmd.GoToRecord , , acLast
ItemCount = Me.CurrentRecord
DoCmd.GoToRecord , , acFirst
DoCmd.GoToControl "WIP"

'-- Loops the Inventory Items --
LoopThis:
If [Stocked] = True Then GoTo WipThis
GoTo NextItem

'-- Update PN Qty --
WipThis:
stLinkCriteria = "[Part #]=" & "'" & Me![Part #] & "'"

'put all tiers of item stock into single Protonex location
DoCmd.OpenForm stPTier, , , stLinkCriteria, acFormReadOnly, acHidden
'debug.print forms![part tiers].[qtyT2]
DoLoc = StockLocIN(Me![Part #], Forms![part tiers].[QtyT2], "Protonex",
Forms![part tiers].[CostA])
DoCmd.Close acForm, stPTier

'-- Open Allocation Form --
stLinkCriteria = "[Part]=" & "'" & Me![Part #] & "'"
DoCmd.OpenForm stAlloc, , , stLinkCriteria

'-- Count Allocation Line Items for Given Part--
DoCmd.GoToRecord , , acLast
AlloCount = Forms![Allocation WO Subform].CurrentRecord
DoCmd.GoToRecord , , acFirst

'--Initialize Wip Counter--
WipCount = 0

'-- Calculate Total WIP for given part --
LoopAllo:
If IsNull(Forms![Allocation WO Subform].[WIPQty]) = True Then GoTo
NextAllo
'Debug.Print "CurRec: " & Forms![Allocation WO Subform].CurrentRecord

WipCount = WipCount + Forms![Allocation WO Subform].[WIPQty]
'Debug.Print "AllocWIPQty:" & Forms![Allocation WO Subform].[WIPQty] & "* *"
& MvQtyHold
If Forms![Allocation WO Subform].[WIPQty] > 0 Then _
DoLoc = StockLocMove(Me![Part #], Forms![Allocation WO
Subform].[WIPQty], "Default", "WO" & Str(Forms![Allocation WO
Subform].[W-Order]))
'End If

NextAllo:
If Forms![Allocation WO Subform].CurrentRecord < AlloCount Then Else
GoTo AdjustWIP
DoCmd.GoToRecord acDataForm, stAlloc, acNext
GoTo LoopAllo

AdjustWIP:
Forms![inventory log form].[WIP] = WipCount
If [WIP] < 0.0001 Then [WIP] = 0
GoTo NextItem

NextItem:
DoCmd.OpenForm "Inventory Log Form"
If Me.CurrentRecord < ItemCount Then Else GoTo CompleteWIP
DoCmd.GoToRecord , , acNext
GoTo LoopThis
'--------End of Main Routine -------------


'------- Routine Closing Statements ------

CompleteWIP:
DoCmd.Close acForm, "Allocation WO Subform"
MsgBox "WIP & Location Adjustments Complete"
GoTo GlobalLocExit

GlobalLocExit:
Refresh
[LocAdjInProgress] = False
Exit Sub

ExitNow:
[LocAdjInProgress] = False
Exit Sub

GlobalLocError:
DoCmd.SetWarnings True
MsgBox Err.Description
MsgBox "!!!An Error Occurred While Updating Locations!!! - Another
User May Be Editing This Record"
MsgBox "Try Again Later"
Resume ExitNow
End Sub


Function StockLocIN(PartNumber As String, AddQty As Double, LocName As
String, BCost As Currency) As Integer 'Copied and modified from PO receiving
logic, 3/21/08 kah
'Puts a quantity of stock into a given location; creates the location if not
found
'FINISH CODES: 0=Unexpected Failure
' 1=Good/Normal
' 2=Location Created (Still Good)
' 3=Location still not found after creation attempt

On Error GoTo Error_StockLocIN

Dim stDocName As String
Dim stLinkCriteria As String
Dim LocationCount As Integer
Dim Retry As Boolean
' Dim PartRec As DAO.Recordset
' Dim PartSQL As String
Dim PartInsp As Variant

Retry = False
StockLocIN = 1 'good finish...if not reset by something else

'check inspection requirement of the part
' PartSQL = "SELECT [Parts (Query)].* FROM [Parts (Query)] " & _
"WHERE ((([Parts (Query)].[Part #])= '" & PartNumber & "'))"
' Set PartRec = CurrentDb().OpenRecordset(PartSQL)
' If PartRec.Fields("InspectReq").Value = True And LocName = "Default"
Then LocName = "Inspection"
PartInsp = DLookup("[InspectReq]", "Parts (query)", "[Parts
(Query)].[Part #]= '" & PartNumber & "'")
If IsNull(PartInsp) = False Then
If PartInsp = True And LocName = "Default" Then LocName = "Inspection"
End If

Restart:
'-- Open Stock Locations ---
stDocName = "Stock Location List"
stLinkCriteria = "[PartNumber]=" & "'" & PartNumber & "'"
DoCmd.OpenForm stDocName, , , stLinkCriteria
Forms![stock location list].[ActivePart] = PartNumber

'-- Check for Negative Entry --
If AddQty <= 0 Then GoTo Exit_StockLocIN

'-- Verify Any Location(s) Exists --
If IsNull(Forms![stock location list].[PartNumber]) = True Then GoTo
NoLocation

'-- Check Number of Locations ---
DoCmd.GoToRecord acDataForm, stDocName, acLast
LocationCount = Forms![stock location list].CurrentRecord
DoCmd.GoToRecord acDataForm, stDocName, acFirst

'-- Location Validation --
LoopLocations:
If IsNull(LocName) = True Or LocName = "Default" Then GoTo Continue1
If Forms![stock location list].[Location] = LocName Then GoTo SetStock
Else GoTo NextLocation

Continue1:
If Forms![stock location list].[Controlled] = False Then GoTo
NextLocation Else GoTo SetStock

NextLocation:
If Forms![stock location list].CurrentRecord >= LocationCount Then GoTo
LocationNotFound
DoCmd.GoToRecord acDataForm, stDocName, acNext
GoTo LoopLocations

SetStock:
'-- Auto Update Primary Stock Location Qty --
If IsNull(Forms![stock location list].[PartNumber]) = True Then GoTo
Exit_StockLocIN
'update cost average value of stock in bin (adjusts for shortages present)
' Forms![stock location list].[BinCost] = ((Forms![stock location
list].[BinCost] * _
' (Forms![stock location list].[BQty] + Forms![stock location
list].[BinShort])) + (BCost)) / (AddQty + Forms![stock location list].[BQty])
If Forms![stock location list].[BQty] > 0 Then
Forms![stock location list].[BinCost] = ((Forms![stock location
list].[BinCost] * Forms![stock location list].[BQty]) + (AddQty * BCost)) _
/ (AddQty + Forms![stock location list].[BQty])
Else
Forms![stock location list].[BinCost] = BCost
End If

Forms![stock location list].[BQty] = Forms![stock location list].[BQty]
+ AddQty 'Me.Add chgd 4/16/07 kah

'added 8/12/08 kah
If CurrentProject.AllForms("Stock Locations Move form").IsLoaded Then _
If Forms![stock locations move form].[shortby] <> 0 Then
Forms![stock location list].[BinShort] = Forms![stock locations move
form].[shortby]

'-- Foating Point Cleanup --
Forms![stock location list].[BQty] = Round(Forms![stock location
list].[BQty], 4)

Forms![stock location list].[Transaction] = AddQty & " IN" 'chgd from
me.add 4/16/07 kah
Forms![stock location list].[TDate] = Now()
DoCmd.Close acForm, "Stock Location List"
GoTo Exit_StockLocIN

'-- Close Stock Locations Form if no location exists --
NoLocation:
'if first no location, attempt to make and then try again
If Not Retry Then
If MakeLoc(PartNumber, LocName) Then
Retry = True
GoTo Restart
End If
End If

DoCmd.Close acForm, "Stock Location List"

If Retry = True Then StockLocIN = 2 'created a location

Exit_StockLocIN:
Exit Function

LocationNotFound:
If IsNull(LocName) = False Then
'if location not found, first time, attempt to make and then try again
If Not Retry Then
If MakeLoc(PartNumber, LocName) Then
Retry = True
GoTo Restart
End If
End If
MsgBox LocName & " Location Not Found"
StockLocIN = 3
End If
GoTo Exit_StockLocIN

Error_StockLocIN:
StockLocIN = 0 'unexpected error
MsgBox Err.Description
Resume Exit_StockLocIN

End Function

Function MakeLoc(PartNumber As String, LocName As String) As Boolean
'Creates a new location in the Location table for the given part number

On Error GoTo Error_MakeLoc

Dim Controlled As Boolean
Dim SQLStr As String
Dim Order As String
Dim OrderMe As Variant

MakeLoc = False 'presume failure

Controlled = False
Order = "nc"

If LocName = "Default" Or LocName = "Protonex" Then
LocName = "Protonex"
Controlled = True
'check existing max order
OrderMe = DMax("val([order])", "stock locations", "[order]<>'nc' and
[partnumber]= '" & PartNumber & "'")
If IsNull(OrderMe) = True Then Order = "1" Else Order = Str(OrderMe + 1)
End If

SQLStr = "INSERT INTO [Stock Locations] ( Location, BQty, PartNumber,
Controlled, [Order] ) " & _
"SELECT '" & LocName & "' AS Expr1, 0 AS Expr2, '" & PartNumber & "'
AS Expr3, " & Controlled & " AS Expr4, '" & Order & "' AS Expr5;"

DoCmd.SetWarnings False
DoCmd.RunSQL SQLStr
DoCmd.SetWarnings True

MakeLoc = True 'if no errors report it's a successful creation

Exit_MakeLoc:
Exit Function

Error_MakeLoc:
DoCmd.SetWarnings True
MsgBox Err.Description
Resume Exit_MakeLoc

End Function

Function StockLocOUT(PartNumber As String, ReqQtyOut As Double, LocName As
String) As Integer 'adapt from WO Pick 'OUT' logic,kah
'Takes a quantity of stock out of a given location; errors and leaves for
manual update if location not found or quantity is insufficient.
'FINISH CODES: 0=Unexpected Failure
' 1=Good/Normal
' 2=
' 3=No Locations Available
' 4=Insufficient Stock
' future: 5=Deviation Qty Used (Still Good)

On Error GoTo Error_StockLocOUT

Dim stDocName As String
Dim stLinkCriteria As String
Dim LocationCount As Integer
Dim PartsValue As Currency '8/12/08 kah
Dim OutQty As Double '8/13/08 kah

StockLocOUT = 1 'good finish...if not reset by something else
PartsValue = 0 '8/12/08 kah
OutQty = ReqQtyOut '8/12/08 kah

'-- Open Locations Form --
stDocName = "Stock Location List"
stLinkCriteria = "[PartNumber]=" & "'" & PartNumber & "'"
If LocName <> "Default" Then
stLinkCriteria = stLinkCriteria & " and [Location]='" & LocName &
"'" 'just specific location
Else
stLinkCriteria = stLinkCriteria & " and [Controlled]=True"
'all controlled locations
End If

DoCmd.OpenForm stDocName, , , stLinkCriteria
Forms![stock location list].[ActivePart] = PartNumber

'-- Set Sort Order --
Forms![stock location list].OrderBy = "Order"
Forms![stock location list].OrderByOn = True

'-- Check Number of Locations ---
DoCmd.GoToRecord acDataForm, stDocName, acLast
LocationCount = Forms![stock location list].CurrentRecord
DoCmd.GoToRecord acDataForm, stDocName, acFirst

If LocationCount <= 0 Then GoTo NoLocation

'-- Location Validation --
LoopLocations:
If LocName = "Default" Then GoTo Continue1
If Forms![stock location list].[Location] = LocName Then GoTo Continue2
Else GoTo NextLocation

Continue1:
If Forms![stock location list].[Controlled] = False Then GoTo NextLocation

Continue2:
If Forms![stock location list].[BQty] >= OutQty Then GoTo SetMoveQty
'allows for fractional less-than-one quantites to function
If Forms![stock location list].[BQty] < 1 Then GoTo NextLocation
If IsNull(Forms![stock location list].[BQty]) = True Then GoTo
NextLocation

'-- Adjust Location Qty --
SetMoveQty:
If Forms![stock location list].[BQty] >= OutQty Then Forms![stock
location list].[MoveQty] = OutQty
If Forms![stock location list].[BQty] < OutQty Then Forms![stock
location list].[MoveQty] = Forms![stock location list].[BQty]

AdjustOutQty:
If IsNull(Forms![stock location list].[MoveQty]) = False Then
OutQty = OutQty - Forms![stock location list].[MoveQty]
PartsValue = PartsValue + (Forms![stock location list].[MoveQty] *
Forms![stock location list].[BinCost]) 'added 8/12/08 kah
End If

MoveIt: 'well, 'flushit' actually
Forms![stock location list].[BQty] = Forms![stock location list].[BQty]
- Forms![stock location list].[MoveQty]

'-- Record Transaction and Date --
If Forms![stock location list].[MoveQty] <> 0 Then Forms![stock location
list].[TDate] = Now
If Forms![stock location list].[MoveQty] > 0 Then Forms![stock location
list].[Transaction] = Forms![stock location list].[MoveQty] & " OUT"
If Forms![stock location list].[MoveQty] < 0 Then Forms![stock location
list].[Transaction] = -Forms![stock location list].[MoveQty] & " IN"

NextLocation:
'-- Continue to next location or go to next WO Item --
If OutQty <= 0.0001 Then GoTo Exit_StockLocOUT

Forms![stock location list].[MoveQty] = Null
If Forms![stock location list].CurrentRecord >= LocationCount Then
StockLocOUT = 4 'insufficient stock in location
GoTo StockShort
End If
DoCmd.GoToRecord acDataForm, stDocName, acNext 'move to next location
GoTo LoopLocations

Exit_StockLocOUT:
If StockLocOUT = 1 Then DoCmd.Close acForm, stDocName
If CurrentProject.AllForms("Stock Locations Move form").IsLoaded Then
Forms![stock locations move form].[partscostave] = PartsValue /
ReqQtyOut
DoCmd.Close acForm, stDocName
End If
Exit Function

StockShort:
StockLocOUT = 4 'insufficient stock in location
stDocName = "Stock Location List" 'reopen form to show all locations
stLinkCriteria = "[PartNumber]=" & "'" & PartNumber & "'"

If CurrentProject.AllForms("Stock Locations Move form").IsLoaded Then
'conditional added 8/12/08 kah

'skip message display if doing a global location adjustement of all
PNs
If CurrentProject.AllForms("Inventory Log form").IsLoaded Then
If Forms![inventory log form].[LocAdjInProgress] = False Then _
MsgBox LocName & " Location has insufficient stock of " &
PartNumber & ". " & OutQty & " are still required. Item will be picked
'short'."
Else
MsgBox LocName & " Location has insufficient stock of " &
PartNumber & ". " & OutQty & " are still required. Item will be picked
'short'."
End If

'goto to specific location, or 1st controlled location, and pick it
short
If LocName <> "Default" Then
stLinkCriteria = stLinkCriteria & " and [Location]='" & LocName
& "'" 'just specific location
Else
stLinkCriteria = stLinkCriteria & " and [Controlled]=True"
'all controlled locations
End If
DoCmd.OpenForm stDocName, , , stLinkCriteria
Forms![stock location list].OrderBy = "Order"
Forms![stock location list].OrderByOn = True
DoCmd.GoToRecord acDataForm, stDocName, acFirst
Forms![stock location list].[MoveQty] = Forms![stock location
list].[MoveQty] + OutQty
Forms![stock location list].[BQty] = Forms![stock location
list].[BQty] - OutQty
PartsValue = PartsValue + (OutQty * Forms![stock location
list].[BinCost])

' Forms![stock location list].[binshort] = OutQty
Forms![stock locations move form].[shortby] = OutQty
Else
DoCmd.OpenForm stDocName, , , stLinkCriteria
If LocName = "Default" Then LocName = "Controlled"
MsgBox LocName & " Location has insufficient stock of " & PartNumber
& ". " & OutQty & " are still required."
End If

GoTo Exit_StockLocOUT

NoLocation:
StockLocOUT = 3 'location not found
MsgBox "location not found"
GoTo Exit_StockLocOUT

Error_StockLocOUT:
StockLocOUT = 0 'unexpected error
MsgBox Err.Description
Resume Exit_StockLocOUT

End Function

Function StockLocMove(PartNumber As String, MoveQty As Double, SourceLoc As
String, DestLoc As String) As Integer '8/12/08 kah

'Moves a quantity of stock out of a given location to another given location;
'FINISH CODES: 0=Unexpected Failure
' 1=Good/Normal
' 2=
' 3=No Locations Available
' 4=Insufficient Stock
' future: 5=Deviation Qty Used (Still Good)

On Error GoTo ErrStockLocMove

Dim stDocName As String
Dim DoLoc As Integer

StockLocMove = 1

stDocName = "Stock Locations Move form"
DoCmd.OpenForm stDocName, acNormal, , , acFormEdit, acHidden

DoLoc = StockLocOUT(PartNumber, MoveQty, SourceLoc)
If DoLoc <> 4 Then Forms![stock locations move form].[shortby] = 0


DoLoc = StockLocIN(PartNumber, MoveQty, DestLoc, Forms![stock locations
move form].[partscostave])

Exit_StockLocMove:
DoCmd.Close acForm, stDocName
Exit Function

ErrStockLocMove:
StockLocMove = 0 'unexpected error
MsgBox Err.Description
Resume Exit_StockLocMove

End Function
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top