PSLine2000Documentation/Modules/processvariables.md

334 KiB

processvariables

Analysis generated on: 4/1/2025 5:03:02 PM

VBA Code

Attribute VB_Name = "processvariables"
Option Compare Database   'Use database order for string comparisons
Global NewPartName_Parm$, PrimaryScreen$, Initforms$, Parts_per_strip!, blankUnits$
Global Sheet_Width!, Sheet_Length!, Actual_PartHeight!, Actual_PartWidth!
Global Trim_Cut!, lb_per_sq_ft!, Blocks_Per_Sheet!, src!, PricePerLB!
Global Blanks_Per_Block!, parts_per_sheet!, FirstCut!, SecondCut!, SecondShear
Global NoGrDirChange, Multi$, TypeDeburr$, MetalName$, MetalPart$, NoDataSheets%
Global Grain$, AddnlI%, Pt_Width!, Location%, Gauge$, PMachine$, DescrW, Denting%
Global Parts_Per_blank!, Part_Height!, Bottom_Trim_Cut!, FirstCutDir%, UnivREQName$, CalculatedGrossWeight!
Global TOP_TRIM_CUT!, Part_Width!, First_Dim!, Second_dim!, dbtype!(20, 2), warehousewc$
Global Elem!(53), Ds$(40), Internal_Labor!, Internal_Walk!, FontTypes%, ExtraShear%
Global YESORNO%, YesOrNoStr$, MachinesWithShears$, OutPutData%, PurchaseBlank%, usrID$
Global currform As Form, Directory$, PunchDieDescr$, PunchCounter%, PunchPresserOptions%
'Global StAddnlQDB As Database, StAddnlQSet As Recordset
'Global StAddnlDB As Database, StAddnlSet As Recordset
'Global StMachQDB As Database, StMachQSet As Recordset
'Global StMachQ2DB As Database, StMachQ2Set As Recordset
'Global StAddnlQDB2 As Database, StAddnlQSet2 As Recordset
'Global StMachNamesDB As Database, StMachNamesSet As Recordset
'Global StMainDB As Database, StMainSet As Recordset
'Global StMain2DB As Database, StMain2Set As Recordset
'Global StPressTab As Database, StPressTabSet As Recordset
'Global StMainQDB As Database, StMainQSet As Recordset
'Global StDataShDB As Database, StDataShSet As Recordset
'Global StPressBrk As Database, StPressBrkSet As Recordset
'Global StPunchPress As Database, StPunchPressSet As Recordset
'Global StPressOps As Database, StPressOpsSet As Recordset

Sub Add_Additional_Process()
   Dim AddnlQDB      As Database, AddnlQSet As Recordset
   Dim AddnlDB           As Database, AddnlSet As Recordset
   Dim MachQDB    As Database, MachQSet As Recordset
   Dim Hopc!
   
   PartN$ = currform![PartNumber]
   If currform!SavedProcesses.ListIndex = -1 Then
      Exit Sub
   End If
      

   Criteria$ = "PartNumber = '" + PartN$ + "'"                         ' Set search criteria.
   Set AddnlQDB = DBEngine.Workspaces(0).Databases(0)
   Set AddnlQSet = AddnlQDB.OpenRecordset("AddnlQ1", DB_OPEN_DYNASET)  ' Create dynaset.
   Set AddnlDB = DBEngine.Workspaces(0).Databases(0)
   Set AddnlSet = AddnlQDB.OpenRecordset("AddnlPROC", DB_OPEN_TABLE)   ' Create dynaset.
 
'   Set AddnlQDB = StAddnlQDB
'   Set AddnlQSet = StAddnlQSet
'   Set AddnlDB = StAddnlDB
'   Set AddnlSet = StAddnlSet
   
   wc$ = currform!SavedProcesses.Column(0)
   Machine$ = currform!SavedProcesses.Column(1)
   wc1$ = Left$(currform!SavedProcesses.Column(2) + "   ", 3)
   wc2$ = Left$(currform!SavedProcesses.Column(3) + "   ", 3)
   wc3$ = Left$(currform!SavedProcesses.Column(4) + "   ", 3)
   wc4$ = Left$(currform!SavedProcesses.Column(5) + "   ", 3)
   ctime! = currform!SavedProcesses.Column(6)
   Rstd! = currform!SavedProcesses.Column(7)
   WCText$ = currform!SavedProcesses.Column(8)
   
   AddnlQSet.FindFirst Criteria$                                       ' Find first occurrence.
   Hopc = 0
   Do Until AddnlQSet.NoMatch                                          ' Loop until no matching records.
      Generated% = AddnlQSet!Generated                                 ' Get Generation flag.
      s$ = AddnlQSet!PartNumber
      If Val(AddnlQSet!OpCode) > Hopc Then
         Hopc = Val(AddnlQSet!OpCode)
      End If
      AddnlQSet.FindNext Criteria$                                     ' Find next occurrence.
   Loop                                                                ' End of loop.
   Hopc = ((Hopc \ 10) * 10) + 10

   AddnlSet.AddNew
   
   AddnlSet!PartNumber = PartN$
   AddnlSet!OpCode = Hopc
   AddnlSet!Generated = False

   AddnlSet!Description = WCText$
   AddnlSet!wc1 = wc1$
   AddnlSet!wc2 = wc2$
   AddnlSet!wc3 = wc3$
   AddnlSet!wc4 = wc4$
   AddnlSet!Machine = Machine$
   AddnlSet!CycleTime = ctime!
   AddnlSet!RunStd = Rstd!
   AddnlSet.Update
   
   currform.Refresh
   
End Sub

Sub Add_Shear_Verbage(vb$)
   If Not (SecondShear) Then
      If Multi$ = "MULTIPLE" Then
         bt$ = "_(SHEAR OFF " + Format$(Bottom_Trim_Cut!, "#0.00") + Chr$(34) + " BOTTOM"
         If TOP_TRIM_CUT! > 0 Then
            bt$ = bt$ + " / " + Format$(TOP_TRIM_CUT!, "#0.00") + Chr$(34) + " TOP"
         End If
         bt$ = bt$ + ")"
         Call AddDescr(vb$, bt$, DescrW)
      End If
   End If

End Sub

Sub AddAPart(Oldpart$, NewPart$, ErrM$)
   Dim MainDB As Database, MainSet As Recordset
   Dim Main2DB As Database, Main2Set As Recordset
   Dim MachNamesDB As Database, MachNamesSet As Recordset
   Dim MachQDB As Database, MachQSet As Recordset

   Dim MainTableDef As TableDef
   
   Set MainDB = DBEngine.Workspaces(0).Databases(0)
   Set Main2DB = DBEngine.Workspaces(0).Databases(0)
   Set MachNamesDB = DBEngine.Workspaces(0).Databases(0)
   Set MachQDB = DBEngine.Workspaces(0).Databases(0)
   
   ErrM$ = " "
   GoSub Open_Mains1

   Set MachNamesSet = MachNamesDB.OpenRecordset("MachineNames", DB_OPEN_TABLE)   ' Create dynaset.
   Set MachQSet = MachQDB.OpenRecordset("Machines", DB_OPEN_TABLE)   ' Create dynaset.
'   Set MachNamesSet = StMachNamesSet
'   Set MachQSet = StMachQSet
   
   If (Trim$(Oldpart$) = "") Or (Trim$(NewPart$) = "") Then
      PartN$ = NewPart$
      If PartN$ <> "" Then

         MainSet.AddNew
         MainSet!PartNumber = Left$(PartN$, 9)
         MainSet!PhantomNumber = Left$(PartN$, 9)
         MainSet!IssueNumber = "    "
         MainSet!GrainNone = True
         MainSet!Deburr = "Within"
         MainSet!PrintSize = "B"
         MainSet!CellDeburrTypes = "Auto"
         MainSet!PressBrake = 1
         ef = 0
         On Error GoTo DUPLICATE_rec1
         MainSet.Update
         On Error GoTo 0
         If ef = 1 Then
            Exit Sub
         End If

         currform.Refresh
         If Oldpart$ <> "NEW" Then
            
            MainSet.Seek "=", Oldpart$
            Main2Set.Seek "=", PartN$

            Main2Set.Edit
            For i = 0 To MainSet.Fields.Count - 1
               Main2Set.Fields(i) = MainSet.Fields(i)
            Next i
            Main2Set!PartNumber = PartN$
            Main2Set.Update

            GoSub OPEN_Addnl1

            MainSet.Seek ">=", Oldpart$
            
            If MainSet.EOF Then
            
               Do While Trim$(MainSet!PartNumber) = Oldpart$
                  Main2Set.AddNew
                  For i = 0 To MainSet.Fields.Count - 1
                     Main2Set.Fields(i) = MainSet.Fields(i)
                  Next i
                  Main2Set!PartNumber = PartN$
                  Main2Set.Update
                  MainSet.MoveNext
                  If MainSet.EOF Then Exit Do
               Loop

            End If
            
            GoSub OPEN_Machs1
            MainSet.MoveFirst
            
            MainSet.Seek ">=", Oldpart$
            If Not (MainSet.NoMatch) Then
               Do While Trim$(MainSet!PartNumber) = Oldpart$
                  Main2Set.AddNew
                  For i = 0 To MainSet.Fields.Count - 1
                     Main2Set.Fields(i) = MainSet.Fields(i)
                  Next i
                  Main2Set!PartNumber = PartN$
                  Main2Set.Update
                  MainSet.MoveNext
                  If MainSet.EOF Then Exit Do
               Loop
            End If
            GoSub OPEN_Press1
            MainSet.MoveFirst
            
            MainSet.Seek ">=", Oldpart$
            
            If Not (MainSet.NoMatch) Then
               Do While Trim$(MainSet!PartNumber) = Oldpart$
                  Main2Set.AddNew
                  For i = 0 To MainSet.Fields.Count - 1
                     Main2Set.Fields(i) = MainSet.Fields(i)
                  Next i
                  Main2Set!PartNumber = PartN$
                  Main2Set.Update
                  MainSet.MoveNext
                  If MainSet.EOF Then Exit Do
               Loop
            End If
            
            GoSub Open_Mains1
            
         End If
      End If
   End If
   ErrM$ = "Part " + PartN$ + " added"
Exit Sub

Open_Mains1:
   Set MainSet = MainDB.OpenRecordset("Process", DB_OPEN_TABLE)   ' Create dynaset.
   Set Main2Set = MainDB.OpenRecordset("Process", DB_OPEN_TABLE)   ' Create dynaset.
   MainSet.Index = "PrimaryKey"
   Main2Set.Index = "PrimaryKey"
Return

OPEN_Addnl1:
   Set MainSet = MainDB.OpenRecordset("AddnlProc", DB_OPEN_TABLE)   ' Create dynaset.
   Set Main2Set = Main2DB.OpenRecordset("AddnlProc", DB_OPEN_TABLE)   ' Create dynaset.
'   Set mainset = StAddnlSet
'   Set main2Set = StAddnlSet
   MainSet.Index = "PartNumber"
   Main2Set.Index = "PartNumber"
Return

OPEN_Machs1:
   Set MainSet = MainDB.OpenRecordset("Machines", DB_OPEN_TABLE)   ' Create dynaset.
   Set Main2Set = Main2DB.OpenRecordset("Machines", DB_OPEN_TABLE)   ' Create dynaset.
'   Set mainset = StMachQSet
'   Set main2Set = StMachQSet
   MainSet.Index = "PartNumber"
   Main2Set.Index = "PartNumber"
   currform.Refresh
Return

OPEN_Press1:
   Set MainSet = MainDB.OpenRecordset("PressBrakeOPs", DB_OPEN_TABLE)   ' Create dynaset.
   Set Main2Set = Main2DB.OpenRecordset("PressBrakeOPs", DB_OPEN_TABLE)   ' Create dynaset
'   Set mainset = StPressOpsSet
'   Set main2Set = StPressOpsSet
   MainSet.Index = "PartNumber"
   Main2Set.Index = "PartNumber"
   currform.Refresh
Return

DUPLICATE_rec1:
   ErrM$ = "Duplicate record - " + PartN$
   ef = 1
Resume Next

End Sub

Sub AddDescr(pbd$, C1$, DescrWX)
   c2$ = C1$

   pbda$ = RTrim$(pbd$)
   If Len(pbd$) <> Len(pbda$) Then
      pbd$ = pbda$ + " "
   End If
   
   Do
      Di% = InStr(c2$, "`")
      If Di% <> 0 Then
         d1$ = Left$(c2$, Di% - 1)
         c2$ = Mid$(c2$, Di% + 1)
         GoSub AddIt
      Else
         d1$ = c2$
         GoSub AddIt
         Exit Do
      End If
   Loop

   For i = 1 To Len(pbd$)
      If Mid$(pbd$, i, 1) = "_" Then
         Mid$(pbd$, i, 1) = " "
      End If
   Next
         

Exit Sub


AddIt:
   Do
      lPBD = Len(pbd$)
      x% = lPBD \ DescrWX
      rPBD% = lPBD - (x% * DescrWX)
      nxPBD% = (x% + 1) * DescrWX
      
      
      dd$ = d1$
      If Len(d1$) > (DescrWX - rPBD%) Then
         d1l% = instrl(Left$(d1$, (DescrWX - rPBD%)), " ")
         If d1l% < DescrWX - rPBD% Then
            dd$ = Left$(d1$, d1l%)
            d1$ = Mid$(d1$, d1l% + 1)
         Else
            d1$ = ""
         End If
      Else
         d1$ = ""
      End If
      If dd$ = "" Then Exit Do
         
      
'      If rPBD% + Len(dd$) > DescrWX Then
'         pbd$ = Left$(RTrim$(pbd$) + dd$ + String$(nxPBD%, "_"), nxPBD%)
         pbd$ = Left$(pbd$ + dd$ + String$(nxPBD%, "_"), nxPBD%)
'      Else
'         pbd$ = Left$(RTrim$(pbd$) + dd$ + String$(nxPBD%, "_"), nxPBD%)
'      End If
   Loop
Return
End Sub

Function AddnlHandDeburr!()
   Addnl = currform!AddnlDeburrInches
   AddnlHandDeburr! = Addnl * 0.002 * 60
End Function

Sub AddPartButton()
On Error GoTo Err_addPr_Click

    Dim DocName As String
    Dim LinkCriteria As String
    DoCmd.Close
    
    DocName = "New Process Sheet"
    DoCmd.OpenForm DocName, , , LinkCriteria

Exit_addPr_Click:
    Exit Sub

Err_addPr_Click:
    MsgBox Error$
    Resume Exit_addPr_Click
    

End Sub

Sub CalcActualWt(dim1!, dim2!, Aw!)
 '
 ' lb_per_sq_ft
 '
 If (lb_per_sq_ft! = 0) Then Exit Sub

 Aw! = dim1! * dim2! / 144 * lb_per_sq_ft!
 Aw! = Val(Format$(Aw!, "######0.000"))
End Sub

'
Sub CalcGrossWeight(dim1!, dim2!, Gw!, Aw!, RC%)
 Dim A%, b%
 RC% = 0
 '
 'Input:
 ' Sheet.Width
 ' Sheet.Length
 ' Trim.Cut
 ' lb_per_sq_ft
 '
 'Output:
 ' Blocks.Per.Sheet
 ' Blanks.Per.Block
 ' Parts.Per.Sheet
 '
If (dim1! = 0) Or (dim2! = 0) Or (lb_per_sq_ft! = 0) Then
   RC% = 6
   Exit Sub
End If

' + mod 23-jan-97
   ASheet_Width! = Sheet_Width!
   ASheet_Length! = Sheet_Length!
   If dim1! < 2 Then ASheet_Length! = ASheet_Length! - 2
   If dim2! < 2 Then ASheet_Width! = ASheet_Width! - 2
' - mod 23-jan-97

If Multi$ = "BLANK" Then
   A% = 1
Else
   A% = Int((ASheet_Width! - Trim_Cut) / dim2!)
End If
b% = Int((ASheet_Length! - Trim_Cut) / dim1!)
C% = 1 'for punch press
Parts_per_strip! = 1
If (Multi$ = "NO CNC") Then
   If (PunchDieDescr$ <> "!NONE!") Then
      Parts_per_strip! = PunchCounter%
      C% = Parts_per_strip!
      If b% <= 0 Then b% = 1
      If PunchPresserOptions% <> 1 Then
         A% = Parts_per_strip!
         C% = 1
      End If
   End If
End If

Blocks_Per_Sheet = b%
Blanks_Per_Block = A%

   
   OFFALL1 = ASheet_Length! - Trim_Cut! - dim1! * Blocks_Per_Sheet
   OFFALL2 = ASheet_Width! - Trim_Cut! - dim2! * Blanks_Per_Block
   Rot1 = False: Rot2 = False
   If (OFFALL1 < 2) And (Blocks_Per_Sheet > 1) Then Rot1 = True
   If (OFFALL2 < 2) And (Blanks_Per_Block > 1) Then Rot2 = True
   
   Denting% = 0
   If (dim1! <= 4) And (dim1! >= 2) And Rot1 Then
      Blocks_Per_Sheet = Blocks_Per_Sheet - 1
      Denting% = 1
   End If
   
   If (dim2! <= 4) And (dim2! >= 2) And Rot2 Then
      Blanks_Per_Block = Blanks_Per_Block - 1
      If Denting% = 1 Then
         Denting% = 3
      Else
         Denting% = 2
      End If
   End If

   parts_per_sheet = Blocks_Per_Sheet * Blanks_Per_Block * C%


If parts_per_sheet <> 0 Then
'
' calculated GW
'
   Gw! = Sheet_Width! * Sheet_Length! / 144 * lb_per_sq_ft! / parts_per_sheet
'   Gw! = (Int(Gw * 1000)) / 1000
   Gw! = Val(Format(Gw!, "0.000"))
   Call CalcActualWt(dim1!, dim2!, Aw!)
   Aw! = Aw! / Parts_per_strip!
Else

   If PurchaseBlank% Then
      If blankUnits$ = "LB" Then
'
' calculated GW
'
         Gw! = Sheet_Width! * Sheet_Length! / 144 * lb_per_sq_ft!
'         Gw! = (Int(Gw * 1000)) / 1000
         Gw! = Val(Format(Gw!, "0.000"))
      Else
         Gw! = 1
      End If
      Aw! = Gw!
      parts_per_sheet = 1
   Else
      RC% = 4
      FirstCutDir% = 0
   End If
End If
End Sub

Sub CalcLaborCost(LaborTot!)
Dim AddnlQDB As Database, AddnlQSet As Recordset

PartN$ = currform![PartNumber]

Criteria$ = "PartNumber = '" + PartN$ + "'"                         ' Set search criteria.
currform!txtCalcStat.Caption = "LC - Opening AddnlQ1"
Set AddnlQDB = DBEngine.Workspaces(0).Databases(0)
Set AddnlQSet = AddnlQDB.OpenRecordset("AddnlQ1", DB_OPEN_DYNASET)  ' Create dynaset.

'Set AddnlQDB = stAddnlQSet
'Set AddnlQSet = stAddnlQSet

AddnlQSet.FindFirst Criteria$                                       ' Find first occurrence.
currform!txtCalcStat.Caption = "Calculating Labor Cost"
LaborTot! = 0
Do Until AddnlQSet.NoMatch                                          ' Loop until no matching records.
   Hopc$ = AddnlQSet!OpCode
   If InStr(Hopc$, "*") = 0 Then
      rs! = AddnlQSet!RunStd
      Lr! = AddnlQSet!LaborRate
      'LaborTot! = LaborTot! + (rs! * Lr! * 2.56)
      'Labor Rate has Full Burden
      LaborTot! = LaborTot! + (rs! * Lr!)
   End If
   AddnlQSet.FindNext Criteria$                                    ' Find next occurrence.
   DoEvents
Loop                                                                ' End of loop.
End Sub

Sub CalcMultGrossWeight(dim1!, dim2!, Gw!, Aw!)
 Dim A!, b! '
 'Entered from user
 '   Part_Height
 '   Part_Width
 '   Bottom_Trim_Cut
 '   Top_Trim_Cut
 '
 'From material
 '   Sheet_Width
 '   Sheet_Length
 '   lb_per_sq_ft
 '
 '   Blocks_Per_Sheet
 '   Blanks_Per_Block
 '   Parts_Per_Sheet
 '

   d1! = dim1!
   d2! = Part_Width + Pt_Width!




   If (d1! = 0) Or (d2! = 0) Or (lb_per_sq_ft = 0) Then Exit Sub

   Call CalcActualWt(d1!, d2!, Aw!)

   If ExtraShear% Then
      A! = Int((Sheet_Length - Trim_Cut) / dim2!)
      Blocks_Per_Sheet! = Int(A!)
      Parts_Per_Block! = Int((Sheet_Width - TrimCut) / dim1!)
      Blanks_Per_Block! = Int((Sheet_Width - TrimCut) / dim1!)

      parts_per_sheet! = Blocks_Per_Sheet! * Parts_Per_Block! * Parts_Per_blank!

   Else
      A! = (Sheet_Length - Trim_Cut) / dim1!
      Blocks_Per_Sheet! = Int(A!)
   
      OFFALL1 = Sheet_Length! - Trim_Cut! - dim1! * Blocks_Per_Sheet!
      Rot1 = False
      If (OFFALL1 < 2) And (Blocks_Per_Sheet > 1) Then Rot1 = True
   
      If (dim1! <= 4) And (dim1! >= 2) And Rot1 Then
         Blocks_Per_Sheet! = Blocks_Per_Sheet! - 1
         Denting% = 1
      End If
   

      parts_per_sheet! = Blocks_Per_Sheet! * Parts_Per_blank!
      If (Multi$ = "LASER/SHEAR") Then
         Blanks_Per_Block = Int(Sheet_Width / dim2!)
         parts_per_sheet! = Blanks_Per_Block! * Blocks_Per_Sheet! * Parts_Per_blank!
      End If
         
   End If
   

   If parts_per_sheet! <> 0 Then
      Gw! = Sheet_Width * Sheet_Length / 144 * lb_per_sq_ft / parts_per_sheet
   '   Gw! = (Int(Gw! * 1000)) / 1000
      Gw! = Val(Format(Gw!, "0.000"))
   Else
      If (First_Dim! = Sheet_Length!) And (Second_dim! = Sheet_Width!) Then
'
' calculated GW
'
         Gw! = Sheet_Width! * Sheet_Length! / 144 * lb_per_sq_ft! / Parts_Per_blank
'         Gw! = (Int(Gw * 1000)) / 1000
         Gw! = Val(Format(Gw!, "0.000"))
         pw! = ItsAZero!(Part_Width!) 'currform![PartWidth])
         
         Aw! = Part_Height! * pw! / 144 * lb_per_sq_ft!
         Blocks_Per_Sheet! = 1
         parts_per_sheet = Parts_Per_blank
      Else
         Gw! = 0
      End If
   End If
End Sub

Sub calcs()
Dim MachQDB As Database, MachQSet As Recordset
Dim MachNQDB As Database, MachNQSet As Recordset
  'Parting tool width = .2
   Pt_Width! = 0.2: Trim_Cut = 0.1
   Grain$ = Trim$(UCase$(currform![GrainDir]))
   MachinesWithShears$ = "C-3C-4C-5C-6C-7C-8C-9V-1V-2V-4C10"
   
'   currform!lblXrefMessage.Visible = False
'
'   Set XrefQDB = DBEngine.Workspaces(0).Databases(0)
'   Set XrefQSet = XrefQDB.OpenRecordset("RMSFILES#_EGSSP1A0", DB_OPEN_DYNASET)  ' Create dynaset.
'   XrefQSet.MoveFirst
'   PartN$ = currform![PartNumber]
'   xPN$ = Left(PartN$, 7)
'   Do Until XrefQSet.EOF
'      If (Trim(XrefQSet!CURPN) = xPN$) Or (Trim(XrefQSet!NEWPN) = xPN$) Then
'
'         currform!lblXrefMessage.Visible = True
'         currform!lblXrefMessage.Caption = "This part has an associated part - " + Trim(XrefQSet!CURPN) + Right$(PartN, 1) + "/" + Trim(XrefQSet!NEWPN) + Right$(PartN, 1)
'         currform!cmd300Series.Enabled = True
'
'         Exit Do
'      End If
'      XrefQSet.MoveNext
'   Loop
   
   
   wh$ = currform![Warehouse]
   whl$ = currform!Field113.Column(10)


   If wh$ = "90" Then
      If whl$ = "2" Then
         currform![CalculationStatus] = 11
         Call ErrorMessages
         Exit Sub
      End If
      warehousewc$ = "302"
   Else
      If whl$ = "1" Then
         currform![CalculationStatus] = 11
         Call ErrorMessages
         Exit Sub
      End If
      warehousewc$ = "347"
   End If
   
   GrNone% = currform![GrainNone]
   currform!cmdDeleteFileFromTrumpfs.Visible = False
   currform!lblCalcStat.Visible = True
   currform!txtCalcStat.Caption = "Calculations underway"
   currform!txtCalcStat.Visible = True
   currform!txtCalcStat2.Visible = True
DoEvents
   OutPutData% = True
      If GrNone% Then
         GrNone% = False
         Grain$ = "ALONG FIRST"
         OutPutData% = False
         
         currform!txtCalcStat2.Caption = "Calculating along first dimension"
DoEvents
         GoSub CalcPart

         prc1 = currform![PartCost]
         
         GrNone% = False
         Grain$ = "ALONG SECOND"
         OutPutData% = True
         
         currform!txtCalcStat2.Caption = "Calculating along Second dimension"
DoEvents
         GoSub CalcPart

         prc2 = currform![PartCost]
         Debug.Print prc1, prc2
         If prc1 < prc2 Then
            currform!GrainDir = "Along First Dimension"
         ElseIf prc1 > prc2 Then
            currform!GrainDir = "Along Second Dimension"
         Else
            If First_Dim! < Second_dim! Then
               currform!GrainDir = "Along First Dimension"
            Else
               currform!GrainDir = "Along Second Dimension"
            End If
         End If
         Call GrainFromRec
         If currform!GrainDir <> "Along Second Dimension" Then
            Grain$ = currform!GrainDir
            GrNone% = False
            OutPutData% = True
         
            currform!txtCalcStat2.Caption = "Calculating along chosen dimension"
            DoEvents
            GoSub CalcPart
            GrNone% = True
         End If

      Else
         currform!txtCalcStat2.Caption = "Calculating along only dimension"
         GoSub CalcPart
      End If
   currform!cmdDeleteFileFromTrumpfs.Visible = True
   currform!lblCalcStat.Visible = False
   currform!txtCalcStat.Visible = False
   currform!txtCalcStat2.Visible = False
   Exit Sub

CalcPart:
   
   currform![GrossWt] = 0
   currform![ActualWt] = 0
   currform![Utilization] = 0
   currform![PartsPerSheet] = 0
   currform![BlocksPerSheet] = 0
   currform![BlanksPerBlock] = 0
   currform![ActualPartHeight] = 0
   currform![ActualPartWidth] = 0
   currform![SheetSize] = " "
   currform![BlankSize] = " "
   currform![PartSize] = " "
   DSF$ = UCase$(itsaNull$(currform![DatasheetFlag]))
   If DSF$ = "NONE" Then
      NoDataSheets% = 0
   ElseIf DSF$ = "REQ'D" Then
      NoDataSheets% = 1
   Else
      NoDataSheets% = 2
   End If
   currform![CalculationStatus] = 0
   First_Dim! = ItsAZero!(currform![FirstDim])
   Second_dim! = ItsAZero!(currform![SecDim])
   Denting% = 0
   
   Parts_Per_blank! = ItsAZero!(currform![PartsPerBlank])
   Part_Height! = ItsAZero!(currform![PartHeight])
   Bottom_Trim_Cut! = ItsAZero!(currform![BotTrimCut])
   TOP_TRIM_CUT! = ItsAZero!(currform![TopTrimCut])
   Part_Width! = ItsAZero!(currform![PartWidth])

   Gp$ = currform!Field113.Column(1)
   Gauge$ = Gp$

   Multi$ = Trim$(UCase$(currform![CutType]))
   TypeDeburr$ = Trim$(UCase$(currform![Deburr]))
'
'  ROTATE SHEET FOR BLANKS -- 12-NOV-09
'
' ----------------------------------------------------------
   Sheet_Width! = ItsAZero!(currform!Field113.Column(4))
   Sheet_Length! = ItsAZero!(currform!Field113.Column(3))
   
   RotateBlank = ItsAZero!(currform![GrainShear])
   If (Multi$ <> "NO CNC") And (Multi$ <> "BLANK") Then
      RotateBlank = 0
   End If
   
   If RotateBlank <> 0 Then
      Sheet_Width! = ItsAZero!(currform!Field113.Column(3))
      Sheet_Length! = ItsAZero!(currform!Field113.Column(4))
   End If
' ----------------------------------------------------------
'
'Density Change
'
   lb_per_sq_ft! = ItsAZero!(currform!Field113.Column(5))
'
'
'
   Location% = ItsAZero!(currform!Field113.Column(6))
   PricePerLB! = ItsAZero!(currform!Field113.Column(8))
   PurchaseBlank% = ItsAZero!(currform!Field113.Column(9))
   blankUnits$ = itsaNull$(currform!Field113.Column(11))
   MetalName$ = currform!Field113.Column(0)
   MetalPart$ = currform!Field113.Column(2)
   PunchDieDescr$ = currform!PunchDie
   PunchCounter% = Val(itsaNull$(currform!PunchCount))
   PunchPresserOptions% = currform!PunchPressOption
   If currform!GrainShearChk.Visible Then
      ExtraShear% = currform![GrainShear]
   Else
      ExtraShear% = False
   End If

   PartN$ = currform![PartNumber]
'
'insert check on primary CNC
'
   Set MachQDB = DBEngine.Workspaces(0).Databases(0)
   Set MachQSet = MachQDB.OpenRecordset("MachinesQ1", DB_OPEN_DYNASET)  ' Create dynaset.
   Criteria$ = "PartNumber = '" + PartN$ + "'"                         ' Set search criteria.
   PMachine$ = ""
   MachQSet.FindFirst Criteria$                                       ' Find first occurrence.

currform!txtCalcStat.Caption = "MP - look for primary machine"

   Do Until MachQSet.NoMatch                                          ' Loop until no matching records.
      If MachQSet!Prime = True Then
         If MachQSet!Tool <> "SHR" Then

            If PMachine$ <> "" Then
               currform![CalculationStatus] = 16
               Call ErrorMessages
               Exit Sub
            End If
            
            PMachine$ = MachQSet!MachineName
            PWC1$ = MachQSet!Tool
            PCTime! = MachQSet!CycleTime
         End If
      End If
      MachQSet.FindNext Criteria$                                    ' Find next occurrence.
      DoEvents
   Loop
   If (PMachine$ = "") And (Multi$ <> "NO CNC") And (Multi$ <> "BLANK") Then
      currform![CalculationStatus] = 15
      Call ErrorMessages
      Exit Sub
   End If
'
'
'

   Call Elem_ClearAllRecs(PartN$)
   
   If Val(itsaNull$(currform!Field113.Column(7))) <> 0 Then
      alt = 1
   Else
      alt = 0
   End If
   If (First_Dim! = 0) Or (Second_dim! = 0) Or (lb_per_sq_ft! = 0) Then
      currform![CalculationStatus] = 6
      Call ErrorMessages
      Exit Sub
   End If
   If ((Multi$ = "MULTIPLE") Or (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "SLUG") Or (Multi$ = "LASER/SHEAR")) And (Parts_Per_blank! = 0) Then
      currform![CalculationStatus] = 6
      Call ErrorMessages
      Exit Sub
   End If
   If (Multi$ = "BLANK") Then
      If (Second_dim! > Sheet_Width!) Then
         currform![CalculationStatus] = 2
         Call ErrorMessages
         Exit Sub
      End If
   End If
   
   If (Multi$ = "MULTIPLE") And (Part_Width! = 0) Then
      currform![CalculationStatus] = 10
      Call ErrorMessages
      Exit Sub
   End If
      
   If (Bottom_Trim_Cut! < 2) And (Multi$ = "MULTIPLE") Then
      currform![CalculationStatus] = 5
      Call ErrorMessages
      Exit Sub
   End If

   
   If Multi$ = "LASER" Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
      Part_Width! = (Sheet_Width! / Parts_Per_blank) - Pt_Width!
      Bottom_Trim_Cut! = 0
      TOP_TRIM_CUT! = 0
      
      If (Multi$ = "LASER/SHEAR") Then
         
         Part_Width! = (Second_dim! / Parts_Per_blank) - Pt_Width!
      End If
   End If
   
   Celltype$ = UCase$(currform![CellDeburrTypes])
   MetalName$ = UCase(currform!Field113.Column(0))
   If Celltype = "TIME SAVER" Then
      If ((Not (InStr(MetalName$, "COLD ROLL") = 0) And (Not (InStr(MetalName$, "S/S") = 0)))) Then
         ' aluminized
         currform![CalculationStatus] = 19
         Call ErrorMessages
         Exit Sub
      End If
   End If
   
   If Multi$ <> "BLANK" Then
      Calcerr0% = currform![CalculationStatus]
      GoSub CalcMaterialWt
      calcerr1% = currform![CalculationStatus]
      aw1! = Gw!
      aw2! = 0
      If alt = 1 And Multi$ <> "MULTIPLE" Then
         currentMetal$ = currform![MetalType]
         currform![MetalType] = itsaNull$(currform!Field113.Column(7))
'
'  ROTATE SHEET FOR BLANKS -- 12-NOV-09
'
' ----------------------------------------------------------
         Sheet_Width! = ItsAZero!(currform!Field113.Column(4))
         Sheet_Length! = ItsAZero!(currform!Field113.Column(3))
         
         RotateBlank = ItsAZero!(currform![GrainShear])
         If (Multi$ <> "NO CNC") And (Multi$ <> "BLANK") Then
            RotateBlank = 0
         End If
         
         If RotateBlank <> 0 Then
            Sheet_Width! = ItsAZero!(currform!Field113.Column(3))
            Sheet_Length! = ItsAZero!(currform!Field113.Column(4))
         End If
' ----------------------------------------------------------

'
'Density Change
'
         lb_per_sq_ft! = ItsAZero!(currform!Field113.Column(5))
'
'
'
         Location% = ItsAZero!(currform!Field113.Column(6))
         PricePerLB! = ItsAZero!(currform!Field113.Column(8))
         PurchaseBlank% = ItsAZero!(currform!Field113.Column(9))

         currform![CalculationStatus] = Calcerr0%
         GoSub CalcMaterialWt
         calcerr2% = currform![CalculationStatus]
         aw2! = Gw!

         If (((aw1! <= aw2!) And (calcerr1% = 0)) Or (calcerr2% <> 0) Or (aw2! = 0)) Then
            currform![MetalType] = currentMetal$
'
'  ROTATE SHEET FOR BLANKS -- 12-NOV-09
'
' ----------------------------------------------------------
               Sheet_Width! = ItsAZero!(currform!Field113.Column(4))
               Sheet_Length! = ItsAZero!(currform!Field113.Column(3))
               
               RotateBlank = ItsAZero!(currform![GrainShear])
               If (Multi$ <> "NO CNC") And (Multi$ <> "BLANK") Then
                  RotateBlank = 0
               End If
               
               If RotateBlank <> 0 Then
                  Sheet_Width! = ItsAZero!(currform!Field113.Column(3))
                  Sheet_Length! = ItsAZero!(currform!Field113.Column(4))
               End If
' ----------------------------------------------------------
'
'Density Change
'
            lb_per_sq_ft! = ItsAZero!(currform!Field113.Column(5))
'
'
'
            Location% = ItsAZero!(currform!Field113.Column(6))
            PricePerLB! = ItsAZero!(currform!Field113.Column(8))
            PurchaseBlank% = ItsAZero!(currform!Field113.Column(9))
            currform![CalculationStatus] = Calcerr0%
            GoSub CalcMaterialWt
         End If
      End If
   End If
   If currform![CalculationStatus] = 0 Then
 
      GoSub DoAnswers
      
      If Celltype = "TIME SAVER" Then
         If ((currform!ActualPartHeight < 5) And (currform!ActualPartWidth < 5)) Then
            ' too small for time saver
            currform![CalculationStatus] = 20
            Call ErrorMessages
            Exit Sub
         End If
      End If
      
      If ((Bottom_Trim_Cut! < 2) Or (Bottom_Trim_Cut! >= FirstCut) Or (TOP_TRIM_CUT! >= FirstCut)) And (Multi$ = "MULTIPLE") Then
         currform![CalculationStatus] = 5
         Call ErrorMessages
         Exit Sub
      End If
      CalculatedGrossWeight! = Gw!
      Call MakeProcesses
      
      GoSub CalcPrice
      Call PurgeCNCs
   End If
   
   Blank_wt = First_Dim! * Second_dim! / 144 * lb_per_sq_ft!
   If Blank_wt > 50 Then
      currform!WeightWarn.Visible = True
      currform!WeightWarn.Caption = "Warning Blank Weight of " + Format(Blank_wt, "0") + "lbs. exceeded maximum."
   End If
Return
Exit Sub

DoAnswers:
   If Multi$ = "BLANK" Then FirstCutDir% = 1
   Select Case FirstCutDir%
      Case 1
         If (Multi$ = "MULTIPLE") Or (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
            Call CalcMultGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!)
            If (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
               currform![ActualPartHeight] = currform![PartHeight]
               currform![ActualPartWidth] = currform![PartWidth]
            Else
               currform![ActualPartHeight] = First_Dim! - TOP_TRIM_CUT! - Bottom_Trim_Cut!
               currform![ActualPartWidth] = currform![PartWidth]
            End If
         Else
            Call CalcGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!, RC%)
            If RC% <> 0 Then
               currform![CalculationStatus] = RC%
               Call ErrorMessages
            End If
            currform![ActualPartHeight] = First_Dim!
            currform![ActualPartWidth] = Second_dim!
         End If
         If (Multi$ <> "LASER") And (Multi$ <> "SALVAGNINI") And (Multi$ <> "LASER/SHEAR") Or (Multi$ = "SLUG") Then
            currform![PartHeight] = First_Dim!
         End If
         FirstCut! = First_Dim!
         SecondCut! = Second_dim!
         
         If ExtraShear% Then
            fc$ = "Along Second Dimension"
            currform!GrDirOpt = 2
         Else
            fc$ = "Along First Dimension"
            currform!GrDirOpt = 1
         End If
      Case 2
         Call CalcGrossWeight(Second_dim!, First_Dim!, Gw!, Aw!, RC%)
         If RC% <> 0 Then
            currform![CalculationStatus] = RC%
            Call ErrorMessages
         End If
         fc$ = "Along Second Dimension"
         currform!GrDirOpt = 2
         If (Multi$ <> "LASER") And (Multi$ <> "SALVAGNINI") And (Multi$ <> "LASER/SHEAR") Or (Multi$ = "SLUG") Then
            currform![PartHeight] = Second_dim!
         End If
         currform![ActualPartHeight] = Second_dim!
         currform![ActualPartWidth] = First_Dim!
         FirstCut! = Second_dim!
         SecondCut! = First_Dim!
      Case Else
         fc$ = currform![GrainDir]
         currform![PartHeight] = First_Dim!
         currform![ActualPartHeight] = First_Dim!
         currform![ActualPartWidth] = Second_dim!
         FirstCut! = First_Dim!
         SecondCut! = Second_dim!
         If Multi$ = "BLANK" Then FirstCutDir% = 1
  End Select
  Actual_PartHeight = currform![ActualPartHeight]
  Actual_PartWidth = currform![ActualPartWidth]
         
   If (currform![ActualPartHeight] >= 19) Or (currform![ActualPartWidth] >= 19) Then
      currform![CellDeburrTypes] = "Hand Deburr"
      Celltype$ = UCase$(currform![CellDeburrTypes])
   End If

  '##################33
   If FirstCutDir% = 0 Then
      currform![CalculationStatus] = 1
   Else
      Call CalcActualWt(Actual_PartHeight!, Actual_PartWidth!, Aw!) 'per Rick Bergeson 10-Oct-2006
      currform![GrainDir] = fc$
      If Aw! > Gw! Then Aw! = Gw!
      currform![GrossWt] = Gw!
      currform![ActualWt] = Aw!
      currform![Utilization] = 0
      If Gw! <> 0 Then
         currform![Utilization] = Aw! / Gw!
      End If
      currform![PartsPerSheet] = parts_per_sheet!
      currform![BlocksPerSheet] = Blocks_Per_Sheet!
      currform![BlanksPerBlock] = Blanks_Per_Block!
         
      currform![SheetSize] = Format$(Sheet_Width!, "###0.000") + " X " + Format$(Sheet_Length!, "###0.000")
      If (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
         currform![PartSize] = Format$(currform![PartHeight], "###0.000") + " X " + Format$(currform![PartWidth], "###0.000")
      Else
         currform![PartSize] = Format$(currform![ActualPartHeight], "###0.000") + " X " + Format$(currform![ActualPartWidth], "###0.000")
      End If
      currform![BlankSize] = Format$(First_Dim!, "###0.000") + " X " + Format$(Second_dim!, "###0.000")
   End If
   Call ErrorMessages
Return
CalcPrice:
'
'  Cost Calculations
'
   Call CalcLaborCost(LaborTot!)
   If PurchaseBlank% Then
      currform![MaterialCost] = Val(Format(PricePerLB!, "#####0.####"))
   Else
      currform![MaterialCost] = Val(Format(Gw! * PricePerLB!, "#####0.####"))
   End If
   currform![LaborCost] = Val(Format(LaborTot!, "#####0.####"))
   currform![PartCost] = currform![MaterialCost] + currform![LaborCost]
   Debug.Print currform![MaterialCost], currform![LaborCost], currform![PartCost]
Return

CalcMaterialWt:
   If (Multi$ = "NO CNC") And (Punch$ <> "!NONE!") And (currform!PunchPressOption = 2) And (Sheet_Width <> Second_dim!) Then
      currform![CalculationStatus] = 2
      FirstCutDir% = 0
   End If
      
   If (Multi$ = "MULTIPLE") Or (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
      If (Sheet_Width <> Second_dim!) And (Not (ExtraShear%)) And (Multi$ <> "LASER/SHEAR") Then
         currform![CalculationStatus] = 2
         FirstCutDir% = 0
      ElseIf (((PartWidth + Pt_Width) * Parts_Per_blank) - Pt_Width > Sheet_Width) And (Multi$ <> "LASER") And (Multi$ <> "SALVAGNINI") And (Multi$ <> "SLUG") And (Multi$ <> "LASER/SHEAR") Then
         currform![CalculationStatus] = 3
         FirstCutDir% = 0
      ElseIf (Bottom_Trim_Cut! < 2) And (Multi$ <> "LASER") And (Multi$ <> "SALVAGNINI") And (Multi$ <> "SLUG") And (Multi$ <> "LASER/SHEAR") Then
         currform![CalculationStatus] = 5
         FirstCutDir% = 0
      Else
         Call CalcMultGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!)
         FirstCutDir% = 1
      End If
   Else

      If Not (GrNone%) Then
         If Left$(Grain$, 11) = "ALONG FIRST" Then
            FirstCutDir% = 1
            Call CalcGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!, RC%)
            If RC% <> 0 Then
               currform![CalculationStatus] = RC%
               Call ErrorMessages
            End If

         Else
            FirstCutDir% = 2
            Call CalcGrossWeight(Second_dim!, First_Dim!, Gw!, Aw!, RC%)
            If RC% <> 0 Then
               currform![CalculationStatus] = RC%
               Call ErrorMessages
            End If

         End If
      Else
         Call CalcGrossWeight(First_Dim!, Second_dim!, Gw1!, Aw!, RC%)
         If RC% <> 0 Then
            currform![CalculationStatus] = RC%
            Call ErrorMessages
         End If
         Call CalcGrossWeight(Second_dim!, First_Dim!, Gw2!, Aw!, RC%)
         If RC% <> 0 Then
            currform![CalculationStatus] = RC%
            Call ErrorMessages
         End If
         If Gw1! < Gw2! Then
            FirstCutDir% = 1
            Call CalcGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!, RC%)
            If RC% <> 0 Then
               currform![CalculationStatus] = RC%
               Call ErrorMessages
            End If
         Else
            FirstCutDir% = 2
            Call CalcGrossWeight(Second_dim!, First_Dim!, Gw!, Aw!, RC%)
            If RC% <> 0 Then
               currform![CalculationStatus] = RC%
               Call ErrorMessages
            End If
         End If

         If Gw1! = Gw2! Then
            If First_Dim! < Second_dim! Then
               FirstCutDir% = 1
               Call CalcGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!, RC%)
               If RC% <> 0 Then
                  currform![CalculationStatus] = RC%
                  Call ErrorMessages
               End If
            Else
               FirstCutDir% = 2
               Call CalcGrossWeight(Second_dim!, First_Dim!, Gw!, Aw!, RC%)
               If RC% <> 0 Then
                  currform![CalculationStatus] = RC%
                  Call ErrorMessages
               End If
            End If
         End If
      End If
   End If
   Call ErrorMessages
Return

End Sub

Sub Calculate_All()
   Dim MainDB As Database, MainSet As Recordset
   Dim MainTableDef As TableDef
   Dim DocName As String
   Dim LinkCriteria As String
   Dim MyForm As Form

   Set MainDB = DBEngine.Workspaces(0).Databases(0)
   currform.Refresh
   PN$ = currform!PartNumber

End Sub

Sub Calculate_Button()
   On Error GoTo Bad_Record
   DoCmd.Hourglass True
   If Trim$(currform!PartNumber) <> "" Then
      On Error GoTo NoMaterialSelected
      Gp$ = currform!Field113.Column(1)
      
      On Error GoTo NoCutType
      Multi$ = Trim$(UCase$(currform![CutType]))
      
      On Error GoTo NoDeburr
      TypeDeburr$ = Trim$(UCase$(currform![Deburr]))

      On Error GoTo NoFirstDim
      f! = currform![FirstDim]
      
      On Error GoTo 0
      Call calcs
   End If
   On Error GoTo 0
   DoCmd.Hourglass False
   Exit Sub

NoMaterialSelected:
   currform![CalculationStatus] = 11
   Resume Done

NoFirstDim:
   currform![CalculationStatus] = 12
   Resume Done

NoCutType:
   currform![CalculationStatus] = 13
   Resume Done

NoDeburr:
   currform![CalculationStatus] = 14
   Resume Done

Bad_Record:
   currform![CalculationStatus] = 7
   Resume Done
   Resume Next
   Resume
Done:
   Call ErrorMessages
   On Error GoTo 0

End Sub

Function CalculateRec()
   Call Calculate_All
End Function

Sub CheckGrainShear()
   M$ = itsaNull$(currform.CutType)
   MN$ = itsaNull$(currform!Field113.Column(0))
   If (M$ = "MULTIPLE") Or (M$ = "LASER") Or (M$ = "SALVAGNINI") Or (M$ = "LASER/SHEAR") Or (M$ = "SLUG") Then
      If InStr(MN$, "S/S") <> 0 Then
         currform!GrainShearChk.Visible = True
         If currform!GrainShearChk Then
            currform!Text239.Visible = True                 ' parts per blank
            currform!Field238.Visible = True                ' parts per blank
            currform!Text147.Visible = True                 ' blanks per block
            currform!BlanksPerBlock.Visible = True          ' blanks per block
         End If
      Else
         currform!GrainShearChk.Visible = False
      End If
   Else
      currform!GrainShearChk.Visible = False
   End If
End Sub

Sub ckPrimaryScreen()
   If PrimaryScreen$ = "" Then
      PrimaryScreen$ = "14" + Chr$(34) + " Process Sheet"
      If Left$(Initforms$, 2) = "14" Then
         DocName$ = "14" + Chr$(34) + " Process Sheet"
      Else
         DocName$ = "Process Sheet"
      End If
   PrimaryScreen$ = DocName$
   End If

End Sub

Sub CNC_Verbage(DbSel%, vb$)
      
   Select Case DbSel%
      Case 1
         '            123456789012345678901234567890123456789
         If AddnlHandDeburr!() = 0 Then
               vb$ = "NOTCH, PIERCE, & HAND DEBURR (3) EDGES "
               If TOP_TRIM_CUT! <> 0 Then
                  vb$ = "NOTCH, PIERCE, & HAND DEBURR (2) EDGES "
               End If

         Else
               vb$ = "NOTCH, PIERCE, & HAND DEBURR (3) EDGES "
               If TOP_TRIM_CUT! <> 0 Then
                  vb$ = "NOTCH, PIERCE, & HAND DEBURR (2) EDGES "
               End If
         vb$ = vb$ + " INCLUDING INTERNAL CUTOUTS            "
            Call ds_add("HANDDEBURR", "AEdg")
         End If
         Call ds_add("HANDDEBURR", "MEdg")

      Case 2
         If (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
            slugispart% = False
            prm$ = Left$(PMachine$, 3)
            Select Case prm$
               Case "C-1", "C-2", "C-3", "C-4", "C-5", "C-6", "C-7", "C-8", "C-9", "V-1", "V-2", "V-4", "C10"
                        vb$ = "NOTCH, PIERCE, & DEBURR USING          "
                  vb$ = vb$ + "TIMESAVER                              "
                  slugispart% = True
               Case Else
                  vb$ = "CUT COMPLETE & DEBURR USING TIMESAVER  "
            End Select
            If (Multi$ = "SLUG") Then slugispart% = True
         Else
               vb$ = "NOTCH, PIERCE, & DEBURR USING          "
         vb$ = vb$ + "TIMESAVER                              "
         End If

         Call ds_add("TIMESAVER", "SHRD")
      Case 3
         If AddnlHandDeburr!() = 0 Then
               vb$ = "NOTCH, PIERCE, HAND DEBURR (3) EDGES,  "
         vb$ = vb$ + "SHEAR & HAND DEBURR (1) EDGE           "
         Else
               vb$ = "NOTCH, PIERCE, HAND DEBURR (3) EDGES   "
         vb$ = vb$ + "INCLUDING INTERNAL CUTOUTS, SHEAR &    "
         vb$ = vb$ + "HAND DEBURR (1) EDGE                   "
            Call ds_add("HANDDEBURR", "AEdg")
         End If
         
         Call Add_Shear_Verbage(vb$)

         Call ds_add("HANDDEBURR", "1Edg")
         Call ds_add("HANDDEBURR", "MEdg")
         Call ds_add("MULTSHEAR", "CONT")
      Case 4
         If AddnlHandDeburr!() = 0 Then
               vb$ = "NOTCH, PIERCE, HAND DEBURR (2) EDGES,  "
         vb$ = vb$ + "SHEAR, &  HAND DEBURR (2) EDGES        "
         Else
               
               vb$ = "NOTCH, PIERCE, HAND DEBURR (2) EDGES   "
         vb$ = vb$ + "INCLUDING INTERNAL CUTOUTS, SHEAR, &   "
         vb$ = vb$ + "HAND DEBURR (2) EDGES                  "
            Call ds_add("HANDDEBURR", "AEdg")
         End If
         
         Call Add_Shear_Verbage(vb$)
         
         Call ds_add("HANDDEBURR", "2Edg")
         Call ds_add("HANDDEBURR", "MEdg")
         Call ds_add("MULTSHEAR", "CONT")
      Case 5
         If AddnlHandDeburr!() = 0 Then
               vb$ = "NOTCH, PIERCE, HAND DEBURR (3) EDGES,  "
         vb$ = vb$ + "SHEAR, & DEBURR (1) EDGE USING         "
         vb$ = vb$ + "PEDESTAL GRINDER                       "
         Else
               vb$ = "NOTCH, PIERCE, HAND DEBURR (3) EDGES,  "
         vb$ = vb$ + "SHEAR, & DEBURR (1) EDGE USING         "
         vb$ = vb$ + "PEDESTAL GRINDER                       "
            Call ds_add("HANDDEBURR", "AEdg")
         End If
         
         Call Add_Shear_Verbage(vb$)

         Call ds_add("HANDDEBURR", "MEdg")
         Call ds_add("PEDESTAL", "1Edg")
         Call ds_add("MULTSHEAR", "CONT")
      Case 6
         If AddnlHandDeburr!() = 0 Then
               vb$ = "NOTCH, PIERCE, HAND DEBURR (2) EDGES,  "
         vb$ = vb$ + " SHEAR, & DEBURR (2) EDGES USING       "
         vb$ = vb$ + " PEDESTAL GRINDER                      "
         Else
               vb$ = "NOTCH, PIERCE, HAND DEBURR (2) EDGES,  "
         vb$ = vb$ + " SHEAR, & DEBURR (2) EDGES USING       "
         vb$ = vb$ + " PEDESTAL GRINDER                      "
            Call ds_add("HANDDEBURR", "AEdg")
         End If
         
         Call Add_Shear_Verbage(vb$)

         Call ds_add("HANDDEBURR", "MEdg")
         Call ds_add("PEDESTAL", "2Edg")
         Call ds_add("MULTSHEAR", "CONT")
      Case 7
               vb$ = "NOTCH, PIERCE, HAND DEBURR, SHEAR, &   "
         vb$ = vb$ + "DEBURR USING TIMESAVER                 "
         
         Call Add_Shear_Verbage(vb$)

         Call ds_add("HANDDEBURR", "MEdg")
         Call ds_add("TIMESAVER", "SHRD")
         Call ds_add("MULTSHEAR", "T/S ")
      Case 8
         If AddnlHandDeburr!() = 0 Then
               vb$ = "NOTCH, PIERCE, SHEAR, & HAND DEBURR    "
         vb$ = vb$ + "ALL EDGES                              "
         Else
               vb$ = "NOTCH, PIERCE, SHEAR, & HAND DEBURR    "
         vb$ = vb$ + "ALL EDGES INCLUDING INTERNAL CUTOUTS   "
            Call ds_add("HANDDEBURR", "AEdg")
         End If
         
         Call Add_Shear_Verbage(vb$)

         Call ds_add("HANDDEBURR", "4Edg")
         Call ds_add("MULTSHEAR", "CONT")
      Case 9
         If AddnlHandDeburr!() = 0 Then
               vb$ = "NOTCH, PIERCE, SHEAR & DEBURR ALL      "
         vb$ = vb$ + "EDGES USING PEDESTAL GRINDER           "
         Else
               vb$ = "NOTCH, PIERCE, SHEAR, HAND DEBURR      "
         vb$ = vb$ + "INSIDE CUTOUTS, & DEBURR EDGES USING   "
         vb$ = vb$ + "PEDESTAL GRINDER                       "
            Call ds_add("HANDDEBURR", "AEdg")
         End If
         
         Call Add_Shear_Verbage(vb$)

         Call ds_add("PEDESTAL", "4Edg")
         Call ds_add("MULTSHEAR", "CONT")
      Case 10
               vb$ = "NOTCH, PIERCE, SHEAR & DEBURR USING    "
         vb$ = vb$ + "TIMESAVER                              "
         Call ds_add("TIMESAVER", "SHRD")
         Call ds_add("MULTSHEAR", "T/S ")
         
         Call Add_Shear_Verbage(vb$)

      Case 11
         If (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
            slugispart% = False
            prm$ = Left$(PMachine$, 3)
            Select Case prm$
               Case "C-1", "C-2", "C-3", "C-4", "C-5", "C-6", "C-7", "C-8", "C-9", "V-1", "V-2", "V-4", "C10"
                  If AddnlHandDeburr!() = 0 Then
                           vb$ = "NOTCH, PIERCE, & HAND DEBURR ALL       "
                     vb$ = vb$ + "EDGES                                  "
                  Else
                           vb$ = "NOTCH, PIERCE, & HAND DEBURR ALL       "
                     vb$ = vb$ + "EDGES INCLUDING INTERNAL CUTOUTS       "
                     Call ds_add("HANDDEBURR", "AEdg")
                  End If
                  slugispart% = True
               Case Else
                  If AddnlHandDeburr!() = 0 Then
                     vb$ = "CUT COMPLETE & HAND DEBURR ALL EDGES   "
                  Else
                           vb$ = "CUT COMPLETE & HAND DEBURR ALL EDGES   "
                     vb$ = vb$ + "INCLUDING INTERNAL CUTOUTS             "
                     Call ds_add("HANDDEBURR", "AEdg")
                  End If
            End Select
            If (Multi$ = "SLUG") Then slugispart% = True
         Else
            If AddnlHandDeburr!() = 0 Then
                     vb$ = "NOTCH, PIERCE, & HAND DEBURR ALL       "
               vb$ = vb$ + "EDGES                                  "
            Else
                           '123456789012345678901234567890123456789"
                     vb$ = "NOTCH, PIERCE, & HAND DEBURR ALL       "
               vb$ = vb$ + "EDGES INCLUDING INTERNAL CUTOUTS       "
                  Call ds_add("HANDDEBURR", "AEdg")
            End If
         End If

         Call ds_add("HANDDEBURR", "4Edg")
      Case 12
         If AddnlHandDeburr!() = 0 Then
               vb$ = "NOTCH, PIERCE, & DEBURR ALL EDGES      "
         vb$ = vb$ + "USING PEDESTAL GRINDER                 "
         Else
               vb$ = "NOTCH, PIERCE, HAND DEBURR INTERNAL    "
         vb$ = vb$ + "CUTOUTS, & DEBURR ALL EDGES USING      "
         vb$ = vb$ + "PEDESTAL GRINDER                       "
            Call ds_add("HANDDEBURR", "AEdg")
         End If
         Call ds_add("PEDESTAL", "4Edg")
      Case 13
         If AddnlHandDeburr!() = 0 Then
               vb$ = "NOTCH, PIERCE, HAND DEBURR (3) EDGES,  "
               If TOP_TRIM_CUT! <> 0 Then
                  vb$ = "NOTCH, PIERCE, HAND DEBURR (2) EDGES,  "
               End If
         vb$ = vb$ + "& SHEAR                                "
         Else
               vb$ = "NOTCH, PIERCE, HAND DEBURR (3) EDGES   "
               If TOP_TRIM_CUT! <> 0 Then
                  vb$ = "NOTCH, PIERCE, HAND DEBURR (2) EDGES   "
               End If
         vb$ = vb$ + "INCLUDING INTERNAL CUTOUTS, & SHEAR    "
            Call ds_add("HANDDEBURR", "AEdg")
         End If
         
         Call Add_Shear_Verbage(vb$)

         Call ds_add("HANDDEBURR", "MEdg")
         Call ds_add("MULTSHEAR", "CONT")
      Case 14
               vb$ = "NOTCH, PIERCE, & SHEAR                 "
         
         Call Add_Shear_Verbage(vb$)

         Call ds_add("MULTSHEAR", "CONT")
      Case 15
               vb$ = "NOTCH, PIERCE, & DEBURR USING          "
         vb$ = vb$ + "TIMESAVER                              "
         Call ds_add("TIMESAVER", "MULT")
      Case 16
               vb$ = "NOTCH, PIERCE, DEBURR USING TIMESAVER, "
         vb$ = vb$ + " & SHEAR                               "
         
         Call Add_Shear_Verbage(vb$)

         Call ds_add("TIMESAVER", "MULT")
         Call ds_add("MULTSHEAR", "T/S ")
      Case Else
         vb$ = ""
   End Select
Exit Sub


End Sub

Sub CutTypeFormSettings()
   Select Case currform.CutType
      Case "Single", "Single/Shear"
         
         currform!chkRotateBlank.Visible = False
         currform!lblRotateBlank.Visible = False
         
         currform!PartsPerBlank.Visible = False
         currform!BotTrimCut.Visible = False
         currform!TopTrimCut.Visible = False
         currform!PartWidth.Visible = False
         currform!SubForm2.Visible = True
         currform!Button200.Visible = True
         currform!CalcCNCtape.Visible = True
         currform!Text232.Visible = False
         currform!EntPartHeight.Visible = False

         currform!Text239.Visible = False                ' parts per blank
         currform!Field238.Visible = False               ' parts per blank
         currform!Text147.Visible = True                 ' blanks per block
         currform!BlanksPerBlock.Visible = True          ' blanks per block
      
      Case "Multiple"
         currform!chkRotateBlank.Visible = False
         currform!lblRotateBlank.Visible = False
         
         currform!PartsPerBlank.Visible = True
         currform!BotTrimCut.Visible = True
         currform!PartWidth.Visible = True
         currform!TopTrimCut.Visible = True
         currform!SubForm2.Visible = True
         currform!Button200.Visible = True
         currform!CalcCNCtape.Visible = True
         currform!Text232.Visible = False
         currform!EntPartHeight.Visible = False
         
         currform!Text239.Visible = True                 ' parts per blank
         currform!Field238.Visible = True                ' parts per blank
         currform!Text147.Visible = False                ' blanks per block
         currform!BlanksPerBlock.Visible = False         ' blanks per block
      
      Case "Laser", "Laser/Shear", "Slug", "Salvagnini"
         currform!chkRotateBlank.Visible = False
         currform!lblRotateBlank.Visible = False
         
         currform!PartsPerBlank.Visible = True
         currform!BotTrimCut.Visible = False
         currform!PartWidth.Visible = True
         currform!TopTrimCut.Visible = False
         currform!SubForm2.Visible = True
         currform!Button200.Visible = True
         currform!CalcCNCtape.Visible = True
         currform!Text232.Visible = True
         currform!EntPartHeight.Visible = True
         
         currform!Text239.Visible = True                 ' parts per blank
         currform!Field238.Visible = True                ' parts per blank
         currform!Text147.Visible = False                ' blanks per block
         currform!BlanksPerBlock.Visible = False         ' blanks per block
         If currform.CutType = "Laser/Shear" Then
         currform!Text147.Visible = True                 ' blanks per block
            currform!BlanksPerBlock.Visible = True       ' blanks per block
         End If
     
     Case "No CNC"
         currform!chkRotateBlank.Visible = True
         currform!lblRotateBlank.Visible = True
         
         currform!PartsPerBlank.Visible = False
         currform!BotTrimCut.Visible = False
         currform!TopTrimCut.Visible = False
         currform!PartWidth.Visible = False
         currform!SubForm2.Visible = False
         currform!Button200.Visible = False
         currform!CalcCNCtape.Visible = False
         currform!Text232.Visible = False
         currform!EntPartHeight.Visible = False

         currform!Text239.Visible = False                ' parts per blank
         currform!Field238.Visible = False               ' parts per blank
         currform!Text147.Visible = True                 ' blanks per block
         currform!BlanksPerBlock.Visible = True          ' blanks per block

      Case "Blank"
         currform!chkRotateBlank.Visible = True
         currform!lblRotateBlank.Visible = True
         
         currform!PartsPerBlank.Visible = False
         currform!BotTrimCut.Visible = False
         currform!TopTrimCut.Visible = False
         currform!PartWidth.Visible = False
         currform!SubForm2.Visible = False
         currform!Button200.Visible = False
         currform!CalcCNCtape.Visible = False
         currform!Text232.Visible = False
         currform!EntPartHeight.Visible = False

         currform!Text239.Visible = False                ' parts per blank
         currform!Field238.Visible = False               ' parts per blank
         currform!Text147.Visible = False                ' blanks per block
         currform!BlanksPerBlock.Visible = False         ' blanks per block
         
      Case Else
         currform!chkRotateBlank.Visible = False
         currform!lblRotateBlank.Visible = False
         
         currform!PartsPerBlank.Visible = False
         currform!BotTrimCut.Visible = False
         currform!TopTrimCut.Visible = False
         currform!PartWidth.Visible = False
         currform!SubForm2.Visible = False
         currform!Button200.Visible = False
         currform!CalcCNCtape.Visible = False
         currform!Text232.Visible = False
         currform!EntPartHeight.Visible = False

         currform!Text239.Visible = False                ' parts per blank
         currform!Field238.Visible = False               ' parts per blank
         currform!Text147.Visible = False                ' blanks per block
         currform!BlanksPerBlock.Visible = False         ' blanks per block
         
         currform![CalculationStatus] = 9
   End Select
   currform!MaterialInfo.Caption = itsaNull$(currform!Field113.Column(1)) + " - " + itsaNull$(currform!Field113.Column(2)) + " - Warehouse " + itsaNull$(currform!Field113.Column(10))
   currform!WeightWarn.Visible = False
   Call CheckGrainShear
   Call PunchPressOptions
End Sub

Sub Delete_Part()
   Dim MainDB As Database, MainSet As Recordset
   Dim Main2DB As Database, Main2Set As Recordset
   Dim MachNamesDB As Database, MachNamesSet As Recordset
   Dim MachQDB As Database, MachQSet As Recordset

   Dim MainTableDef As TableDef
   Dim DocName As String
   Dim LinkCriteria As String
   Dim MyForm As Form

   Set MainDB = DBEngine.Workspaces(0).Databases(0)
   Set Main2DB = DBEngine.Workspaces(0).Databases(0)
   Set MachNamesDB = DBEngine.Workspaces(0).Databases(0)
   Set MachQDB = DBEngine.Workspaces(0).Databases(0)
   currform.Refresh
   PN$ = currform!PartNumber

   GoSub OPEN_Machs
   GoSub DeleteEm

   GoSub OPEN_Addnl
   GoSub DeleteEm
   
   GoSub Open_Data
   GoSub DeleteEm
   
   GoSub OPEN_Press
   GoSub DeleteEm
   
   GoSub Open_Mains

   MainSet.Seek ">=", PN$
   If Not (MainSet.NoMatch) Then
      MainSet.MovePrevious
      If Not (MainSet.BOF) Then
         px$ = MainSet!PartNumber
      End If
   End If

   GoSub DeleteEm
   MainSet.MoveFirst
   currform.Requery
Exit Sub

DeleteEm:
   MainSet.Seek ">=", PN$
   If Not (MainSet.NoMatch) Then
      Do While Trim$(MainSet!PartNumber) = PN$
         MainSet.Delete
         MainSet.MoveNext
         If (MainSet.EOF) Then Exit Do
      Loop
   End If
Return

Open_Mains:
   Set MainSet = MainDB.OpenRecordset("Process", DB_OPEN_TABLE)   ' Create dynaset.
   Set Main2Set = Main2DB.OpenRecordset("Process", DB_OPEN_TABLE)   ' Create dynaset.
'   Set mainset = StMainSet
'   Set main2Set = StMainSet
   MainSet.Index = "PrimaryKey"
   Main2Set.Index = "PrimaryKey"

Return

OPEN_Addnl:
   Set MainSet = MainDB.OpenRecordset("AddnlProc", DB_OPEN_TABLE)   ' Create dynaset.
   Set Main2Set = Main2DB.OpenRecordset("AddnlProc", DB_OPEN_TABLE)   ' Create dynaset.
'   Set mainset = StAddnlSet
'   Set main2Set = StAddnlSet
   MainSet.Index = "PartNumber"
   Main2Set.Index = "PartNumber"
Return

OPEN_Machs:
   Set MainSet = MainDB.OpenRecordset("Machines", DB_OPEN_TABLE)   ' Create dynaset.
   Set Main2Set = Main2DB.OpenRecordset("Machines", DB_OPEN_TABLE)   ' Create dynaset.
'   Set mainset = StMachQSet
'   Set main2Set = StMachQSet
   MainSet.Index = "PartNumber"
   Main2Set.Index = "PartNumber"
Return

Open_Data:
   Set MainSet = MainDB.OpenRecordset("DataSheet", DB_OPEN_TABLE)   ' Create dynaset.
   Set Main2Set = Main2DB.OpenRecordset("DataSheet", DB_OPEN_TABLE)   ' Create dynaset.
   MainSet.Index = "PartNumber"
   Main2Set.Index = "PartNumber"
Return

OPEN_Press:
   Set MainSet = MainDB.OpenRecordset("PressBrakeOps", DB_OPEN_TABLE)   ' Create dynaset.
   Set Main2Set = Main2DB.OpenRecordset("PressBrakeOps", DB_OPEN_TABLE)   ' Create dynaset.
'   Set mainset = StPressOpsSet
'   Set main2Set = StPressOpsSet
   MainSet.Index = "PartNumber"
   Main2Set.Index = "PartNumber"
Return

End Sub

Sub Det_CNC_Highest_Runtime(PartN$, CNC_Highest_RunTime!, REPOSITION_FLAG$)
Dim MachQDB As Database, MachQSet As Recordset
Dim MachNQDB As Database, MachNQSet As Recordset

   MAX_PERCENTAGE_OVER_LOWEST_RUNTIME = 1.2


Criteria$ = "PartNumber = '" + PartN$ + "'"                             ' Set search criteria.

Set MachQDB = DBEngine.Workspaces(0).Databases(0)
Set MachQSet = MachQDB.OpenRecordset("MachinesQ1", DB_OPEN_DYNASET)     ' Create dynaset.


'Set MachQDB = DBEngine.Workspaces(0).Databases(0)
'Set MachQSet = StMachQ2Set

currform!txtCalcStat.Caption = "Determine cnc highest runtime"

   MachQSet.FindFirst Criteria$                                         ' Find first occurrence.
   Do Until MachQSet.NoMatch                                            ' Loop until no matching records.
      If MachQSet!Prime = True Then
         PMachine$ = MachQSet!MachineName
         PWC1$ = MachQSet!Tool
         PCTime! = MachQSet!CycleTime
      End If
      MachQSet.FindNext Criteria$                                       ' Find next occurrence.
      DoEvents
   Loop

   LOWEST_RUNTIME = 100000

   MachQSet.FindFirst Criteria$                                         ' Find first occurrence.
   Do Until MachQSet.NoMatch                                            ' Loop until no matching records.
      MN$ = MachQSet!MachineName
      On Error GoTo toolset
      TL$ = MachQSet!Tool
      Cy! = Val(MachQSet!CycleTime)

      If PMachine$ = "C-1000" Or PMachine$ = "C-2000" Then
         If MN$ = "C-1000" Or MN$ = "C-2000" Then
            ck = 1
         Else
            ck = 0
         End If
      Else
         If MN$ = "C-1000" Or MN$ = "C-2000" Then
            ck = 0
         Else
            ck = 1
         End If
      End If
      If ck = 1 Then
         If (TL$ = "STD") Or (TL$ = "R/S") Then
            If (Cy! < LOWEST_RUNTIME) And (Cy! > 0) Then
               LOWEST_RUNTIME = Cy!
               REPOSITION_FLAG$ = TL$
            End If
         End If
      End If
      MachQSet.FindNext Criteria$
   Loop

   MAX_HIGHEST_RUNTIME = LOWEST_RUNTIME * MAX_PERCENTAGE_OVER_LOWEST_RUNTIME
   CNC_Highest_RunTime = LOWEST_RUNTIME
   
   MachQSet.FindFirst Criteria$                                       ' Find first occurrence.
   Do Until MachQSet.NoMatch                                          ' Loop until no matching records.
      MN$ = MachQSet!MachineName
      On Error GoTo toolset
      TL$ = MachQSet!Tool

      Cy! = Val(MachQSet!CycleTime)

      If PMachine$ = "C-1000" Or PMachine$ = "C-2000" Then
         If MN$ = "C-1000" Or MN$ = "C-2000" Then
            ck = 1
         Else
            ck = 0
         End If
      Else
         If MN$ = "C-1000" Or MN$ = "C-2000" Then
            ck = 0
         Else
            ck = 1
         End If
      End If
      If ck = 1 Then
         If (TL$ = "STD") Or (TL$ = "R/S") Then
            If (Cy! <= MAX_HIGHEST_RUNTIME) And (Cy! > LOWEST_RUNTIME) And (Cy! > CNC_Highest_RunTime) And (Cy! > 0) Then
               CNC_Highest_RunTime = Cy!
               REPOSITION_FLAG$ = TL$
            End If
         End If
      End If
      MachQSet.FindNext Criteria$
      DoEvents
   Loop

   If CNC_Highest_RunTime! < PCTime! Then
      CNC_Highest_RunTime! = PCTime!
   End If

   If CNC_Highest_RunTime = 100000 Then
      currform![CalculationStatus] = 8
   End If

Exit Sub

toolset:
   TL$ = ""
   On Error GoTo 0
Resume Next

End Sub

Sub Det_CNC_Standard(CNC_STD, CNC_Highest_RunTime, Repostition_Flag$)

   currform!txtCalcStat.Caption = "Determine cnc standard"
   
   Call Elem_ClearArray

    ACTIVATE_PRESS = 0.013
   REPOSITION_TIME = 0.043
        Paper_Work = 0.06
         MAJOR_DIM = 40
    Major_Dim_Time = 0.06
    CNC_Pfd = 1.1
    If (PMachine$ = "C-3000") Or (PMachine$ = "C-4000") Or (PMachine$ = "C-5000") Or (PMachine$ = "C-6000") Or (PMachine$ = "C-7000") Or (PMachine$ = "C-8000") Or (PMachine$ = "C-9000") Or (PMachine$ = "V-1000") Or (PMachine$ = "V-2000") Or (PMachine$ = "V-4000") Or (PMachine$ = "C10000") Then
       If Multi$ = "MULTIPLE" And (Not (SecondShear)) Then
          CNC_Pfd = 1.15
       End If
    End If
    Elem!(33) = (CNC_Pfd - 1) * 100


   Blank_wt = First_Dim! * Second_dim! / 144 * lb_per_sq_ft!
   If (First_Dim! > 36) Or (Second_dim! > 36) Then
         LOAD_TIME = 0.214
         If Blank_wt <= 4 Then UNLOAD_TIME = 0.061
         If (Blank_wt > 4) And (Blank_wt <= 8) Then UNLOAD_TIME = 0.062
         If (Blank_wt > 8) And (Blank_wt <= 12) Then UNLOAD_TIME = 0.063
         If (Blank_wt > 12) And (Blank_wt <= 20) Then UNLOAD_TIME = 0.064
         If Blank_wt > 20 Then UNLOAD_TIME = 0.065
   Else
         If (First_Dim! > 15) Or (Second_dim! > 15) Then
               LOAD_TIME = 0.171
               If Blank_wt <= 4 Then UNLOAD_TIME = 0.05
               If (Blank_wt > 4) And (Blank_wt <= 8) Then UNLOAD_TIME = 0.051
               If (Blank_wt > 8) And (Blank_wt <= 12) Then UNLOAD_TIME = 0.052
               If (Blank_wt > 12) And (Blank_wt <= 20) Then UNLOAD_TIME = 0.053
               If Blank_wt > 20 Then UNLOAD_TIME = 0.054
         Else
               LOAD_TIME = 0.107
               If Blank_wt <= 4 Then UNLOAD_TIME = 0.039
               If (Blank_wt > 4) And (Blank_wt <= 8) Then UNLOAD_TIME = 0.04
               If (Blank_wt > 8) And (Blank_wt <= 12) Then UNLOAD_TIME = 0.041
               If (Blank_wt > 12) And (Blank_wt <= 20) Then UNLOAD_TIME = 0.042
               If Blank_wt > 20 Then UNLOAD_TIME = 0.043
         End If
   End If

   CNC_STD = 0
   Machine_Cycle = CNC_Highest_RunTime / 60
   
   Elem!(23) = CNC_Highest_RunTime
   Elem!(24) = 60
   Elem!(22) = Machine_Cycle

   If Repostition_Flag$ = "R/S" Then
      CNC_STD = REPOSITION_TIME
      Elem!(14) = CNC_STD
   End If

   If (First_Dim! > MAJOR_DIM) Or (Second_dim! > MAJOR_DIM) Then
      CNC_STD = CNC_STD + Major_Dim_Time
      Elem!(26) = Major_Dim_Time
   End If

   CNC_STD = CNC_STD + ACTIVATE_PRESS
   CNC_STD = CNC_STD + LOAD_TIME
   CNC_STD = CNC_STD + UNLOAD_TIME
   CNC_STD = CNC_STD + Machine_Cycle
   CNC_STD = CNC_STD + Paper_Work
   CNC = CNC_STD
   
   Elem!(6) = LOAD_TIME
   Elem!(10) = ACTIVATE_PRESS
   Elem!(18) = UNLOAD_TIME

   If (Multi$ = "MULTIPLE") Or (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "SLUG") Or (Multi$ = "LASER/SHEAR") Then
      CNC_STD = CNC_STD / Parts_Per_blank
      ppb = Parts_Per_blank
   Else
      ppb = 1
   End If
   CNC_STD = CNC_STD * CNC_Pfd / 60

   Elem!(31) = Internal_Labor!
   Elem!(32) = Internal_Walk!
   Elem!(30) = Internal_Labor! + Internal_Walk!

   
   Elem!(0) = Paper_Work                        ' Paperwork
   Elem!(1) = CNC                               ' total select time
   Elem!(2) = ppb                               ' # of parts
   Elem!(3) = Elem!(1) / Elem!(2)               ' # of minutes
   Elem!(4) = Elem!(3) * CNC_Pfd                ' over head
   Elem!(5) = Elem!(4) / 60                     ' standard hours
   typ$ = " "
   PartN$ = currform!PartNumber
   Call Elem_Add(PartN$, typ$, "CNC")
End Sub

Sub Det_Deburr_Run_Times(CNCTime!, DbProcSel%, complete%)


RU_PER_PACE = 0.01
paces_from_CNC_to_Shear = 4
paces_from_CNC_to_Timesaver = 3.2
paces_from_CNC_to_Pedestal = 3.78
paces_from_Shear_to_Pedestal = 2
paces_from_Shear_to_Timesaver = 1.6
paces_from_Shear_to_Line = 7.2
paces_from_Pedestal_to_Timesaver = 3
paces_from_Pedestal_to_Line = 8.2
paces_from_Line_to_CNC = 6
pfd = 1.15
If Multi$ = "MULTIPLE" Then
   MultiNoParts = Parts_Per_blank
Else
   MultiNoParts = 1
End If
currform!txtCalcStat.Caption = "Determine deburr run times"
DoEvents
Calc_Mult_Hnd_DB:
   Call Det_HandDeburr(mhdb!, rx!, 4)
   mhdb! = mhdb! * 60

Calc_Mult_TS_DB:
   Call Det_TimeSaver_Labor(mts!, rx!, False, BadTs%)
   mts! = mts! * 60
   If BadTs% Then
      dbtype!(15, 0) = 0
      dbtype!(16, 0) = 0
   End If

Calc_TimeSaver:
   Call Det_TimeSaver_Labor(ts!, rx!, True, BadTs%)
   ts! = ts! * 60
   If BadTs% Then
      dbtype!(2, 0) = 0
      dbtype!(7, 0) = 0
      dbtype!(10, 0) = 0
   End If

Calc_Shear:
   Call Det_Mult_Shear(SHEAR!, TShear!)
   SHEAR! = SHEAR! * 60
   TShear! = TShear! * 60

Calc_Hand_DB1:
   Call Det_HandDeburr(HDB1!, rx!, 1)
   HDB1! = HDB1! * 60

Calc_Hand_DB2:
   Call Det_HandDeburr(HDB2!, rx!, 2)
   HDB2! = HDB2! * 60

Calc_Hand_DB4:
   Call Det_HandDeburr(hdb4!, rx!, 3)
   hdb4! = hdb4! * 60

Calc_Hand_DBAddnl:
   Call Det_HandDeburr(ahdb!, rx!, 5)
   ahdb! = ahdb! * 60

Calc_Pdstl_DB1:
   PDB1! = 0
   Call Det_Pedestal_Grinder_Standard(Actual_PartHeight!, Actual_PartWidth!, 2, 1!, PDB1!)
   PDB1! = PDB1! * 60

Calc_Pdstl_DB2:
   PDB2! = 0
   Call Det_Pedestal_Grinder_Standard(Actual_PartHeight!, Actual_PartWidth!, 4, 1!, PDB2!)
   PDB2! = PDB2! * 60

Calc_Pdstl_DB4:
   PDB4! = 0
   Call Det_Pedestal_Grinder_Standard(Actual_PartHeight!, Actual_PartWidth!, 8, 1!, PDB4!)
   PDB4! = PDB4! * 60


Quickest = 0
For dbproc = 1 To 16
   If dbtype!(dbproc, 0) = 1 Then
      Paces! = 0
      complete% = 0
      On dbproc GoSub dbp1, dbp2, dbp3, dbp4, dbp5, dbp6, dbp7, dbp8, dbp9, dbp10, dbp11, dbp12, dbp13, dbp14, dbp15, dbp16
      dbtype!(dbproc, 1) = dbt! + (Paces! * RU_PER_PACE * 60)
      If complete% = 0 And (dbtype!(dbproc, 1) <= CNCTime!) Then
         If Quickest = 0 Then
            Quickest = dbproc
            QComplete = complete%
         End If
         If (dbtype!(dbproc, 1) < dbtype!(Quickest, 1)) Then
            Quickest = dbproc
            QComplete = complete%
         End If
      End If

   Else
      dbtype!(dbproc, 1) = 0
   End If
   DoEvents
Next
complete% = QComplete

If Quickest = 0 Then
   For i = 1 To 5
      Select Case i
         Case 1
            dbproc = 16
            complete% = 1
         Case 2
            dbproc = 13
            complete% = 1
         Case 3
            dbproc = 14
            complete% = 2
         Case 4
            dbproc = 15
            complete% = 1
         Case 5
            dbproc = 1
            complete% = 1
         Case Else
      End Select
      If (dbtype!(dbproc, 1) <= CNCTime!) And (dbtype!(dbproc, 1) <> 0) Then
         Quickest = dbproc
         Exit For
      End If
   Next
End If
DbProcSel% = Quickest
If DbProcSel% <> 0 Then
   On DbProcSel% GoSub dbp1, dbp2, dbp3, dbp4, dbp5, dbp6, dbp7, dbp8, dbp9, dbp10, dbp11, dbp12, dbp13, dbp14, dbp15, dbp16
   Internal_Labor! = dbt!
   Internal_Walk! = (Paces! * RU_PER_PACE * 60)
Else
   Internal_Labor! = 0
   Internal_Walk! = 0
   complete% = 2
End If


Exit Sub
dbp1:
   dbt! = mhdb! + ahdb!
   Paces! = 0
   complete% = 1
Return

dbp2:
   dbt! = ts!
   Paces! = paces_from_CNC_to_Timesaver + paces_from_Line_to_CNC
Return

dbp3:
   dbt! = mhdb! + SHEAR! + HDB1! * MultiNoParts + ahdb!
   Paces! = paces_from_CNC_to_Shear + paces_from_Shear_to_Line + paces_from_Line_to_CNC
Return

dbp4:
   dbt! = mhdb! + SHEAR! + HDB2! * MultiNoParts + ahdb!
   Paces! = paces_from_CNC_to_Shear + paces_from_Shear_to_Line + paces_from_Line_to_CNC
Return

dbp5:
   dbt! = mhdb! + SHEAR! + PDB1! * MultiNoParts + ahdb!
   Paces! = paces_from_CNC_to_Shear + paces_from_Shear_to_Pedestal + paces_from_Pedestal_to_Line + paces_from_Line_to_CNC
Return

dbp6:
   dbt! = mhdb! + SHEAR! + PDB2! * MultiNoParts + ahdb!
   Paces! = paces_from_CNC_to_Shear + paces_from_Shear_to_Pedestal + paces_from_Pedestal_to_Line + paces_from_Line_to_CNC
Return

dbp7:
   dbt! = mhdb! + TShear! + ts! * MultiNoParts '------not used
   Paces! = paces_from_CNC_to_Shear + paces_from_Shear_to_Timesaver + paces_from_Line_to_CNC
Return

dbp8:
   dbt! = SHEAR! + hdb4! * MultiNoParts + ahdb!
   Paces! = paces_from_CNC_to_Shear + paces_from_Shear_to_Line + paces_from_Line_to_CNC
Return

dbp9:
   dbt! = SHEAR! + PDB4! * MultiNoParts + ahdb!
   Paces! = paces_from_CNC_to_Shear + paces_from_Shear_to_Pedestal + paces_from_Pedestal_to_Line + paces_from_Line_to_CNC
Return

dbp10:
   dbt! = TShear! + ts! * MultiNoParts
   Paces! = paces_from_CNC_to_Shear + paces_from_Shear_to_Timesaver + paces_from_Line_to_CNC
Return

dbp11:
   dbt! = hdb4! + ahdb!
   Paces! = (paces_from_Line_to_CNC + paces_from_Line_to_CNC) / 4

Return

dbp12:
   dbt! = PDB4! + ahdb!
   Paces! = (paces_from_CNC_to_Pedestal + paces_from_Pedestal_to_Line + paces_from_Line_to_CNC) / 4
Return

dbp13:
   dbt! = mhdb! + SHEAR! + ahdb!
   Paces! = paces_from_CNC_to_Shear + paces_from_CNC_to_Shear
   complete% = 1
Return

dbp14:
   dbt! = SHEAR!
   Paces! = paces_from_CNC_to_Shear + paces_from_CNC_to_Shear
   complete% = 2
Return

dbp15:
   dbt! = mts!
   Paces! = paces_from_CNC_to_Timesaver + paces_from_Line_to_CNC
   complete% = 1
Return

dbp16:
   dbt! = mts! + TShear!
   Paces! = paces_from_CNC_to_Timesaver + paces_from_Shear_to_Line + paces_from_CNC_to_Shear
   complete% = 1
Return

End Sub

Sub Det_HandDeburr(Labor!, Rstd!, HDB%)
   '
   ' HDB = 1 Hand Deburr 1
   '       2 Hand Deburr 2
   '       3 Hand Deburr 4
   '       4 Multiple Hand Deburr
   '       5 Additional Hand Deburr
   '
   currform!txtCalcStat.Caption = "Determine hand deburr"
   DoEvents
   PartN$ = currform![PartNumber]
   Elem1! = 0.036
   ppb = 1
   Select Case HDB%
      Case 1
         Inches = Actual_PartWidth!
         edg$ = "1Edg"
      Case 2
         Inches = Actual_PartWidth! * 2
         edg$ = "2Edg"
      Case 3
         Inches = Actual_PartHeight! * 2 + Actual_PartWidth! * 2
         edg$ = "4Edg"
      Case 4
         ppb = Parts_Per_blank!
         If ppb = 0 Then ppb = 1
         Inches = Actual_PartHeight! * (ppb + 1)
         If TopTrimCut <> 0 Then
            Inches = Inches + Actual_PartWidth! * ppb
         End If
         edg$ = "MEdg"
      Case 5
         Inches = ItsAZero(currform!AddnlDeburrInches)
         If Inches = 0 Then Elem1! = 0
         edg$ = "AEdg"
      Case Else
         Inches = 0
   End Select
   Elem2! = Inches * 0.002
   Labor! = Elem1! + Elem2!

   Elem!(6) = Elem1!            'Elem1A
   Elem!(10) = Elem2!           'Elem2A
   Elem!(11) = Inches           'Elem2V1

   Elem!(14) = Labor! * 60

   Elem!(0) = 0                                 ' Paperwork
   Elem!(1) = Labor!                            ' total select time
   Elem!(2) = 1                                 ' # of parts
   Elem!(3) = Elem!(1) / Elem!(2)               ' # of minutes
   Elem!(4) = Elem!(3) * 1.15                   ' over head
   Elem!(5) = Elem!(4) / 60                     ' standard hours
   Rstd! = Elem!(5)
   Call Elem_Add(PartN$, edg$, "HANDDEBURR")
End Sub
Sub Det_Shake(ForP$, Rstd!)
   '
   ' Shake and Break time
   '
   currform!txtCalcStat.Caption = "Determine Shake and Break"
   DoEvents
   PartN$ = currform![PartNumber]
   Select Case ForP$
    Case "F"       'is this a Fab Shake n break?
      Elem1! = 0.01
      Elem2! = 0.17153915     ' was .1199
    Case "FM"       'certian metals and difficulties in safety handling
      Elem1! = 0.01
      Elem2! = 0.180095652    ' was .1199 from Kenny Law time study should now be .1803 (due to added Safety proceedures)
    Case Else   'no this is a pot
      Elem1 = 0
      Elem2 = 0.2
   End Select
   Labor! = Elem1! + Elem2!

   Elem!(6) = Elem1!            'Elem1A
   Elem!(10) = Elem2!           'Elem2A
   
   Elem!(14) = Labor! * 60

   Elem!(0) = 0.033                             ' Paperwork
   Elem!(1) = Labor! + 0.033                    ' total select time
   Elem!(2) = 1                                 ' # of parts
   Elem!(3) = Elem!(1) / Elem!(2)               ' # of minutes
   Elem!(4) = Elem!(3) * 1.15                   ' over head
   Elem!(5) = Elem!(4) / 60                     ' standard hours
   Rstd! = Elem!(5)
   Call Elem_Add(PartN$, "    ", "SHAKEBREAK")
End Sub

Sub Det_LASER_Standard(PN$, Rstd!, ctime!)
   Dim MachQDB As Database, MachQSet As Recordset
   Dim MachNQDB As Database, MachNQSet As Recordset


   Criteria$ = "PartNumber = '" + PN$ + "'"                             ' Set search criteria.



   Set MachQDB = DBEngine.Workspaces(0).Databases(0)
   Set MachQSet = MachQDB.OpenRecordset("MachinesQ1", DB_OPEN_DYNASET)     ' Create dynaset.
   
   currform!txtCalcStat.Caption = "Doing Laser Standard"
   MachQSet.FindFirst Criteria$                                         ' Find first occurrence.
   Do Until MachQSet.NoMatch                                            ' Loop until no matching records.
      If MachQSet!Prime = True Then
         PMachine$ = MachQSet!MachineName
         PWC1$ = MachQSet!Tool
         PCTime! = MachQSet!CycleTime
         Exit Do
      End If
      MachQSet.FindNext Criteria$                                       ' Find next occurrence.
      DoEvents
   Loop


   Paperwork = 0.06
   Activate = 0.013
   pfd = 1.1


   ctime! = PCTime!
   md = First_Dim!
   If md < Second_dim! Then
      md = Second_dim!
   End If
   Rus = 0
   Select Case md
      Case Is <= 15
         Rus = 0.107
      Case Is <= 36
         Rus = 0.171
      Case Else
         Rus = 0.214
   End Select
   

   ct = ctime! / 60
   SelectTime = Rus + Activate + ct + Paperwork

   Mstd! = (SelectTime / Parts_Per_blank!)
   Rstd! = Mstd! * pfd / 60

   Elem!(6) = Rus               'Elem1A
   Elem!(10) = Activate         'Elem2A
   Elem!(14) = ct               'Elem3A
   Elem!(15) = ctime!           'Elem3V1
   Elem!(16) = 60               'Elem3V2
   
   Elem!(0) = Paperwork         'PaperWork
   Elem!(1) = SelectTime        'TotalSelectTime
   Elem!(2) = Parts_Per_blank!  'StandardParts
   Elem!(3) = Mstd!             'StandardParts/Min
   Elem!(4) = pfd * Mstd!       'PFd
   Elem!(5) = Rstd!             'StandardParts/Hour
   Call Elem_Add(PN$, "    ", "LASER")

End Sub

Sub Det_Salvagnini_Standard(PN$, Rstd!, ctime!)
   Dim MachQDB As Database, MachQSet As Recordset
   Dim MachNQDB As Database, MachNQSet As Recordset


   Criteria$ = "PartNumber = '" + PN$ + "'"                             ' Set search criteria.



   Set MachQDB = DBEngine.Workspaces(0).Databases(0)
   Set MachQSet = MachQDB.OpenRecordset("MachinesQ1", DB_OPEN_DYNASET)     ' Create dynaset.
   
   currform!txtCalcStat.Caption = "Doing Salvagnini Standard"
   MachQSet.FindFirst Criteria$                                         ' Find first occurrence.
   Do Until MachQSet.NoMatch                                            ' Loop until no matching records.
      If MachQSet!Prime = True Then
         PMachine$ = MachQSet!MachineName
         PWC1$ = MachQSet!Tool
         PCTime! = MachQSet!CycleTime
         Exit Do
      End If
      MachQSet.FindNext Criteria$                                       ' Find next occurrence.
      DoEvents
   Loop


   Paperwork = 0.06
   pfd = 1.1


   ctime! = PCTime!

   ct = ctime! / 60
   SelectTime = ct + Paperwork

   Mstd! = (SelectTime)
   Rstd! = Mstd! * pfd / 60

   Elem!(6) = ct                'Elem1A
   
   Elem!(0) = Paperwork         'PaperWork
   Elem!(1) = SelectTime        'TotalSelectTime
   Elem!(2) = 1!                'StandardParts
   Elem!(3) = Mstd!             'StandardParts/Min
   Elem!(4) = pfd * Mstd!       'PFd
   Elem!(5) = Rstd!             'StandardParts/Hour
   Call Elem_Add(PN$, "SALV", "SALVAGNINI")

End Sub

Sub Det_Mult_Shear(SHEAR!, TShear!)
   Paperwork = 0.06
currform!txtCalcStat.Caption = "Determine multiple shear runtime"
   pfd = 1.15
   Call Elem_ClearArray
   Blank_wt = First_Dim! * Second_dim! / 144 * lb_per_sq_ft!
   If (Actual_PartHeight < 5.5) And (Actual_PartWidth < 5.5) Then ' 5.5 - the fixture is used when less than 5.5
      
      Elem!(6) = 0.09
      Elem!(7) = 1

      Elem!(10) = 0.03
      Elem!(11) = 1

      Elem!(14) = 0.045
      Elem!(15) = 1
   End If
   
   Elem!(6) = Elem!(6) * Elem!(7)
   Elem!(10) = Elem!(10) * Elem!(11)
   Elem!(14) = Elem!(14) * Elem!(15)
   
   Elem1 = Elem!(6) + Elem!(10) + Elem!(14)

   Elem!(18) = 0.015
   Elem!(19) = 1
   
   Elem!(22) = 0.021
   Elem!(23) = 1
   
   Elem!(42) = 0.039
   Elem!(43) = 1
   
   If TOP_TRIM_CUT > 0 Then
      Elem!(19) = 2
      Elem!(23) = 2
      
      Elem3 = 0.014
      Select Case Blank_wt
         Case Is < 4
            Elem4 = 0.027
         Case Is < 10
            Elem4 = 0.029
         Case Is < 20
            Elem4 = 0.031
         Case Is < 30
            Elem4 = 0.033
         Case Is < 40
            Elem4 = 0.035
         Case Else
      End Select
      Elem!(30) = Elem3
      Elem!(31) = 1
      Elem!(46) = Elem4
      Elem!(47) = Elem4 * 1000
      Elem!(48) = 1

   Else
      Elem3 = 0
      Elem4 = 0
   End If
   
   Elem!(18) = Elem!(18) * Elem!(19)
   Elem!(22) = Elem!(22) * Elem!(23)
   Elem!(42) = Elem!(42) * Elem!(43)
   Elem2 = Elem!(18) + Elem!(22) + Elem!(42)

   If Bottom_Trim_Cut > 0 Then
      Elem3 = Elem3 + 0.014
      Elem!(34) = 0.014
      Elem!(35) = 1
   End If

   Select Case Blank_wt
      Case Is < 4
         Elem5 = 0.053
         Elem6 = 0.067
      Case Is < 10
         Elem5 = 0.062
         Elem6 = 0.079
      Case Else
         Elem5 = 0.074
         Elem6 = 0.095
   End Select
   Elem!(38) = Elem5
   Elem!(39) = Elem5 * 1000
   Elem!(40) = 1

   SHEAR! = Elem1 + Elem2 + Elem3 + Elem4 + Elem5
   TShear! = Elem1 + Elem2 + Elem3 + Elem4 + Elem6
   Elem!(50) = SHEAR * 60
   Elem!(0) = Paperwork                         ' Paperwork
   Elem!(1) = SHEAR + Paperwork                 ' total select time
   Elem!(2) = 1                                 ' # of parts
   Elem!(3) = Elem!(1) / Elem!(2)               ' # of minutes
   Elem!(4) = Elem!(3) * pfd                    ' over head
   Elem!(5) = Elem!(4) / 60                     ' standard hours

   PartN$ = currform!PartNumber
   Call Elem_Add(PartN$, "CONT", "MULTSHEAR")

   Elem!(38) = Elem6
   Elem!(39) = Elem6 * 1000
   Elem!(40) = 1
   
   Elem!(50) = TShear * 60

   Elem!(0) = Paperwork                         ' Paperwork
   Elem!(1) = TShear + Paperwork                ' total select time
   Elem!(2) = 1                                 ' # of parts
   Elem!(3) = Elem!(1) / Elem!(2)               ' # of minutes
   Elem!(4) = Elem!(3) * pfd                    ' over head
   Elem!(5) = Elem!(4) / 60                     ' standard hours
   Call Elem_Add(PartN$, "T/S ", "MULTSHEAR")

End Sub

Sub Det_Pedestal_Grinder_Standard(DIMENSION_1, DIMENSION_2, Side%, RunStd!, Labor!)
'
'                       Side
'                         1            PEDESTAL_GRINDER_STD_1,
'                         2            PEDESTAL_GRINDER_STD_2,
'                         3            PEDESTAL_GRINDER_STD_11,
'                         4            PEDESTAL_GRINDER_STD_22,
'                         5            PEDESTAL_GRINDER_STD_12,
'                         6            PEDESTAL_GRINDER_STD_112,
'                         7            PEDESTAL_GRINDER_STD_122,
'                         8            PEDESTAL_GRINDER_STD_1122,
'
'                         1            PEDESTAL_GRINDER_LABOR_1,
'                         2            PEDESTAL_GRINDER_LABOR_2,
'                         3            PEDESTAL_GRINDER_LABOR_11,
'                         4            PEDESTAL_GRINDER_LABOR_22,
'                         5            PEDESTAL_GRINDER_LABOR_12,
'                         6            PEDESTAL_GRINDER_LABOR_112,
'                         7            PEDESTAL_GRINDER_LABOR_122,
'                         8            PEDESTAL_GRINDER_LABOR_1122
'
   Call Elem_ClearArray
      PartN$ = currform![PartNumber]
currform!txtCalcStat.Caption = "Determine Pedestal grinder Standard"
      Paperwork = 0.01
      PEDESTAL_GRINDER_MACHINE_TIME_PER_INCH = 0.005
      Pedestal_Grinder_Pfd = 1.15

   If Labor! = 1 Then noelem = 1 Else noelem = 0
   Blank_wt = DIMENSION_1 * DIMENSION_2 / 144 * lb_per_sq_ft!
   Body_Movements = 2 * 0.01 '(* TURN OR WALK/PACE *)

   If (DIMENSION_1 > 30) Or (DIMENSION_2 > 30) Then
      SINGLE_EDGE_HANDLING = 0.066
      MULTIPLE_EDGE_HANDLING = 0.036
   Else
      If (DIMENSION_1 > 20) Or (DIMENSION_2 > 20) Then
         SINGLE_EDGE_HANDLING = 0.058
         MULTIPLE_EDGE_HANDLING = 0.032
      Else
         If (DIMENSION_1 > 10) Or (DIMENSION_2 > 10) Then
            SINGLE_EDGE_HANDLING = 0.05
            MULTIPLE_EDGE_HANDLING = 0.028
         Else
            If (DIMENSION_1 > 4) Or (DIMENSION_2 > 4) Then
               SINGLE_EDGE_HANDLING = 0.041
               MULTIPLE_EDGE_HANDLING = 0.024
            Else
              SINGLE_EDGE_HANDLING = 0.033
              MULTIPLE_EDGE_HANDLING = 0.02
            End If
         End If
      End If
   End If
      Select Case Side%
         Case 1
            TOTAL_INCHES_DEBURRED = DIMENSION_1
            Number_Of_Edges_Deburred = 1
            typ$ = "1Edg"
         Case 2
            TOTAL_INCHES_DEBURRED = DIMENSION_2
            Number_Of_Edges_Deburred = 1
            typ$ = "1Edg"
         Case 3
            TOTAL_INCHES_DEBURRED = DIMENSION_1 * 2
            Number_Of_Edges_Deburred = 2
            typ$ = "2Edg"
         Case 4
            TOTAL_INCHES_DEBURRED = DIMENSION_2 * 2
            Number_Of_Edges_Deburred = 2
            typ$ = "2Edg"
         Case 5
            TOTAL_INCHES_DEBURRED = DIMENSION_1 + DIMENSION_2
            Number_Of_Edges_Deburred = 2
            typ$ = "2Edg"
         Case 6
            TOTAL_INCHES_DEBURRED = DIMENSION_1 * 2 + DIMENSION_2
            Number_Of_Edges_Deburred = 3
            typ$ = "3Edg"
         Case 7
            TOTAL_INCHES_DEBURRED = DIMENSION_1 + DIMENSION_2 * 2
            Number_Of_Edges_Deburred = 3
            typ$ = "3Edg"
         Case 8
            TOTAL_INCHES_DEBURRED = DIMENSION_1 * 2 + DIMENSION_2 * 2
            Number_Of_Edges_Deburred = 4
            typ$ = "4Edg"
         Case Else
      End Select
      Pedestal_Grinder_Handling_Time = (Number_Of_Edges_Deburred - 1) * MULTIPLE_EDGE_HANDLING + SINGLE_EDGE_HANDLING
      PEDESTAL_GRINDER_MACHINE_TIME = TOTAL_INCHES_DEBURRED * PEDESTAL_GRINDER_MACHINE_TIME_PER_INCH
      Pedestal_Grinder_Labor = 0
      Pedestal_Grinder_Labor = Pedestal_Grinder_Handling_Time + PEDESTAL_GRINDER_MACHINE_TIME + Body_Movements
      PEDESTAL_GRINDER_STD = (Pedestal_Grinder_Labor + Paperwork) * Pedestal_Grinder_Pfd / 60

      Labor! = Pedestal_Grinder_Labor
      RunStd! = PEDESTAL_GRINDER_STD

                     
      Elem!(6) = SINGLE_EDGE_HANDLING
      Elem!(7) = SINGLE_EDGE_HANDLING * 1000
      
      Elem!(10) = (Number_Of_Edges_Deburred - 1) * MULTIPLE_EDGE_HANDLING
      Elem!(12) = (Number_Of_Edges_Deburred - 1)
      Elem!(11) = MULTIPLE_EDGE_HANDLING * 1000

      Elem!(14) = TOTAL_INCHES_DEBURRED * PEDESTAL_GRINDER_MACHINE_TIME_PER_INCH
      Elem!(15) = TOTAL_INCHES_DEBURRED

      Elem!(18) = Body_Movements

      Elem!(22) = Pedestal_Grinder_Labor * 60
       
      Elem!(0) = Paperwork                         ' Paperwork
      Elem!(1) = Pedestal_Grinder_Labor + Paperwork ' total select time
      Elem!(2) = 1                                 ' # of parts
      Elem!(3) = Elem!(1) / Elem!(2)               ' # of minutes
      Elem!(4) = Elem!(3) * Pedestal_Grinder_Pfd   ' over head
      Elem!(5) = Elem!(4) / 60                     ' standard hours
      If noelem = 0 Then
         Call Elem_Add(PartN$, typ$, "PEDESTAL")
      End If
End Sub

Sub DET_PressBrake_Standard(r!, hits, w2$, W3$, W4$, M$)
   Dim PressTab As Database, PressTabSet As Recordset
   Set PressTab = DBEngine.Workspaces(0).Databases(0)
   Set PressTabSet = PressTab.OpenRecordset("PressBrakes", DB_OPEN_TABLE)

currform!txtCalcStat.Caption = "Determine pressbrake runtime"
   Call Elem_ClearArray
   PressTabSet.Index = "ByType"
   PressTabSet.MoveFirst
   PressTabSet.Seek ">=", currform!PressBrake
   If Not (NoMatch) Then
      w2$ = PressTabSet!wc2
      If w2$ = "302" Then w2$ = warehousewc$
      W3$ = PressTabSet!wc3
      W4$ = PressTabSet!wc4
      M$ = PressTabSet!PressBrake
   End If

   
   pfd = 1.15
   Paperwork = 0.033
 '  If Multi$ = "LASER" Then
      Blank_wt = Actual_PartHeight! * Actual_PartWidth! / 144 * lb_per_sq_ft!
 '  Else
 '     Blank_Wt = Part_Height! * Part_Width! / 144 * lb_per_sq_ft!
 '  End If

   Select Case Blank_wt
      Case Is <= 4
         elm5 = 0.048
         elm7 = 0.032
         frq = 0
      Case Is <= 8
         elm5 = 0.071
         elm7 = 0.036
         frq = 4
      Case Is <= 12
         elm5 = 0.085
         elm7 = 0.041
         frq = 8
      Case Is <= 20
         elm5 = 0.095
         elm7 = 0.045
         frq = 12
      Case Else
         elm5 = 0.102
         elm7 = 0.05
         frq = 16
   End Select
   Elem!(6) = elm5
   Elem!(11 + frq) = hits - 1

   elm7 = (hits - 1) * elm7
   
   Elem!(10 + frq) = elm7
   
   elm9 = hits * 0.069 ' 0.069
   Elem!(30) = elm9
   Elem!(31) = hits

   elm11 = hits * 0.083
   Elem!(34) = elm11
   Elem!(35) = hits

   Totaltime = elm5 + elm7 + elm9 + elm11 + Paperwork
   r! = Totaltime * pfd / 60
   
   Elem!(0) = Paperwork                         ' Paperwork
   Elem!(1) = Totaltime                         ' total select time
   Elem!(2) = 1                                 ' # of parts
   Elem!(3) = Elem!(1) / Elem!(2)               ' # of minutes
   Elem!(4) = Elem!(3) * pfd                    ' over head
   Elem!(5) = Elem!(4) / 60                     ' standard hours
   typ$ = " "
   PartN$ = currform!PartNumber
   Call Elem_Add(PartN$, typ$, "PRESSBRAKE")
   Call ds_add("PRESSBRAKE", typ$)

End Sub
Sub DET_PEM_Standard(r!, hits, w2$, W3$, W4$, AM$)
'
' r!    = runstd
' hits  = number of presses
' W2-W4 = Work centers
' am$   = Auto or Manual
'
   Dim PemTab As Database, PemTabSet As Recordset
'   Set PemTab = DBEngine.Workspaces(0).Databases(0)
'   Set PemTabSet = PemTab.OpenRecordset("PEM", DB_OPEN_TABLE)

currform!txtCalcStat.Caption = "Determine PEM runtime"
   Call Elem_ClearArray
'   PressTabSet.Index = "ByType"
'   PressTabSet.MoveFirst
'   PressTabSet.Seek ">=", currform!PressBrake
'   If Not (NoMatch) Then
'      w2$ = PressTabSet.wc2
'      If w2$ = "302" Then w2$ = warehousewc$
'      W3$ = PressTabSet.wc3
'      W4$ = PressTabSet.wc4
'      M$ = PressTabSet.PressBrake
'   End If

   
   pfd = 1.15
   Paperwork = 0.01
 '  If Multi$ = "LASER" Then
'      Blank_Wt = Actual_PartHeight! * Actual_PartWidth! / 144 * lb_per_sq_ft!
 '  Else
      Blank_wt = CalculatedGrossWeight!
 '  End If
'   Call CalcGrossWeight(110, 48, Gw!, Aw!, RC%)
   Select Case Blank_wt
      Case Is <= 4
         elm5 = 0.048
         elm6 = 0.032
         frq = 10
      Case Is <= 8
         elm5 = 0.056
         elm6 = 0.036
         frq = 14
      Case Is <= 12
         elm5 = 0.063
         elm6 = 0.041
         frq = 18
      Case Is <= 20
         elm5 = 0.069
         elm6 = 0.045
         frq = 22
      Case Else
         elm5 = 0.073
         elm6 = 0.05
         frq = 26
   End Select
   Elem!(6) = elm5
   
   If Left$(AM$, 1) = "A" Then
      amx = 0
      em7a = 0.042
      em7b = 0.047
   Else
      amx = hits
      em7a = 0.058
      em7b = 0.063
   End If

   elm6 = (hits - 1) * elm6
   
   Elem!(frq) = elm6
   Elem!(frq + 1) = hits - 1
   
   Elem!(32) = em7a
   Elem!(33) = em7b
   
   elm7 = hits * em7b
   Elem!(30) = elm7
   Elem!(31) = hits
   
   elm9 = amx * 0.037
   Elem!(38) = elm9
   Elem!(39) = amx

   elm8 = 1 * 0.015
   Elem!(34) = elm8
   Elem!(35) = 1

   Totaltime = elm5 + elm6 + elm7 + elm8 + elm9 + Paperwork
   r! = Totaltime * pfd / 60
   
   Elem!(0) = Paperwork                         ' Paperwork
   Elem!(1) = Totaltime                         ' total select time
   Elem!(2) = 1                                 ' # of parts
   Elem!(3) = Elem!(1) / Elem!(2)               ' # of minutes
   Elem!(4) = Elem!(3) * pfd                    ' over head
   Elem!(5) = Elem!(4) / 60                     ' standard hours
   typ$ = AM$
   PartN$ = currform!PartNumber
   Call Elem_Add(PartN$, typ$, "PEM")
   Call ds_add("PEM", typ$)

End Sub
Sub Det_Shear_Standard(QUADRANT, First_Cut_Std, Second_Cut_Std, Multiple_Cut_Std, Multiple_Cut_Labor)

currform!txtCalcStat.Caption = "Determine shear runtimes"
DoEvents
                  PROGRAM_SETUP_TIME = 0.166
        OBTAIN_AND_STARTUP_VACCULIFT = 0.099
        WALK_TO_AND_FROM_MATERIAL_Q1 = 0.167
        WALK_TO_AND_FROM_MATERIAL_Q2 = 0.32
        WALK_TO_AND_FROM_MATERIAL_Q3 = 0.5
        WALK_TO_AND_FROM_MATERIAL_Q4 = 0.667
                        OBTAIN_SHEET = 0.18
          INSERT_TO_WRKHLDR_AND_STOP = 0.083
                 ACTIVATE_FOOT_PEDAL = 0.015
               ACTIVATE_START_BUTTON = 0.015
                                RateR = 0.0024
              PULLMAX_FIXED_FEEDRATE = 0.045
               NIAGRA_FIXED_FEEDRATE = 0.028
             PULLMAX_LAST_PART_EJECT = 0.05
              NIAGRA_LAST_PART_EJECT = 0.024
                  PULLMAX_SQUARE_CUT = 0.045
                   NIAGRA_SQUARE_CUT = 0.028
              REMOVE_SCRAP_AND_ASIDE = 0.039
           PICK_UP_AND_MOVE_TO_SHEAR = 0.028
             MOVE_AND_POSITION_PEICE = 0.024
    REMOVE_REPOSITION_AND_REASSEMBLE = 0.029
                           Paperwork = 0.4
                           Shear_Pfd = 1.15
                 LOT_SIZE_RED_OFFALL = 0.8 + 0.05  '80% Lot size reduction and 5% offall (to be added to first cut pf&d)
   
   PartN$ = currform![PartNumber]

   Blank_wt = FirstCut * Sheet_Width / 144 * lb_per_sq_ft!

   If FirstCut >= Sheet_Width Then MAJOR_DIMENSION = FirstCut

   If FirstCut < Sheet_Width Then MAJOR_DIMENSION = Sheet_Width

   SPIN_BLANK_ON_FIRSTCUT = 0
   SPIN_BLANK_ON_SECCUT = 0

   SHEAR_1_OFFALL = Sheet_Length - TRIM_CUT_LENGTH - FirstCut * Blocks_Per_Sheet
   SHEAR_2_OFFALL = Sheet_Width - TRIM_CUT_LENGTH - SecondCut! * Blanks_Per_Block

   If (SHEAR_1_OFFALL < 2) And (Blocks_Per_Sheet > 1) Then SPIN_BLANK_ON_FIRSTCUT = REMOVE_REPOSITION_AND_REASSEMBLE
   If (SHEAR_2_OFFALL < 2) And (Blanks_Per_Block > 1) Then SPIN_BLANK_ON_SECCUT = REMOVE_REPOSITION_AND_REASSEMBLE

   WALK_TO_AND_FROM_MATERIAL = WALK_TO_AND_FROM_MATERIAL_Q1
   If ExtraShear% Then
      First_Cut_Std = (RateR * SecondCut + PULLMAX_FIXED_FEEDRATE) * Blocks_Per_Sheet
   Else
      First_Cut_Std = (RateR * FirstCut + PULLMAX_FIXED_FEEDRATE) * Blocks_Per_Sheet
   End If
   First_Cut_Std = First_Cut_Std + PROGRAM_SETUP_TIME + OBTAIN_AND_STARTUP_VACCULIFT + WALK_TO_AND_FROM_MATERIAL
   First_Cut_Std = First_Cut_Std + OBTAIN_SHEET + INSERT_TO_WRKHLDR_AND_STOP
   First_Cut_Std = First_Cut_Std + ACTIVATE_FOOT_PEDAL + ACTIVATE_START_BUTTON + PULLMAX_LAST_PART_EJECT
   First_Cut_Std = First_Cut_Std + PULLMAX_SQUARE_CUT + REMOVE_SCRAP_AND_ASIDE + SPIN_BLANK_ON_FIRSTCUT + Paperwork
   GoSub CalcFirstCutStuff
   First_Cut_Std = First_Cut_Std / parts_per_sheet * (Shear_Pfd + LOT_SIZE_RED_OFFALL) / 60
   
   
   
   
   Select Case Multi$
      Case "SINGLE", "NO CNC", "LASER/SHEAR"
      
         SPIN_BLANK_ON_SECCUT = 0
         If (SHEAR_2_OFFALL < 2) And (Blanks_Per_Block > 1) Then SPIN_BLANK_ON_SECCUT = REMOVE_REPOSITION_AND_REASSEMBLE

         Second_Cut_Std = (RateR * SecondCut! + NIAGRA_FIXED_FEEDRATE) * Blanks_Per_Block
         Second_Cut_Std = Second_Cut_Std + PROGRAM_SETUP_TIME
         Second_Cut_Std = Second_Cut_Std + ACTIVATE_FOOT_PEDAL
         Second_Cut_Std = Second_Cut_Std + ACTIVATE_START_BUTTON
         Second_Cut_Std = Second_Cut_Std + NIAGRA_LAST_PART_EJECT
         Second_Cut_Std = Second_Cut_Std + NIAGRA_SQUARE_CUT
         Second_Cut_Std = Second_Cut_Std + REMOVE_SCRAP_AND_ASIDE
         Second_Cut_Std = Second_Cut_Std + PICK_UP_AND_MOVE_TO_SHEAR
         Second_Cut_Std = Second_Cut_Std + MOVE_AND_POSITION_PEICE
         Second_Cut_Std = Second_Cut_Std + SPIN_BLANK_ON_SECCUT
         Second_Cut_Std = Second_Cut_Std + Paperwork
         GoSub CalcSecondCutStuff
         Second_Cut_Std = Second_Cut_Std / Blanks_Per_Block
         Second_Cut_Std = Second_Cut_Std * Shear_Pfd
         Second_Cut_Std = Second_Cut_Std / 60
   
      Case "MULTIPLE"
         If ExtraShear% Then
            SPIN_BLANK_ON_SECCUT = 0
            If (SHEAR_2_OFFALL < 2) And (Blanks_Per_Block > 1) Then SPIN_BLANK_ON_SECCUT = REMOVE_REPOSITION_AND_REASSEMBLE

            Second_Cut_Std = (RateR * FirstCut + NIAGRA_FIXED_FEEDRATE) * Blanks_Per_Block
            Second_Cut_Std = Second_Cut_Std + PROGRAM_SETUP_TIME
            Second_Cut_Std = Second_Cut_Std + ACTIVATE_FOOT_PEDAL
            Second_Cut_Std = Second_Cut_Std + ACTIVATE_START_BUTTON
            Second_Cut_Std = Second_Cut_Std + NIAGRA_LAST_PART_EJECT
            Second_Cut_Std = Second_Cut_Std + NIAGRA_SQUARE_CUT
            Second_Cut_Std = Second_Cut_Std + REMOVE_SCRAP_AND_ASIDE
            Second_Cut_Std = Second_Cut_Std + PICK_UP_AND_MOVE_TO_SHEAR
            Second_Cut_Std = Second_Cut_Std + MOVE_AND_POSITION_PEICE
            Second_Cut_Std = Second_Cut_Std + SPIN_BLANK_ON_SECCUT
            Second_Cut_Std = Second_Cut_Std + Paperwork
            GoSub CalcSecondCutStuff
            Second_Cut_Std = Second_Cut_Std / (Blanks_Per_Block * Parts_Per_blank!)
            Second_Cut_Std = Second_Cut_Std * Shear_Pfd
            Second_Cut_Std = Second_Cut_Std / 60
      
         End If

         Number_Of_Top_Cuts = 0
         If TOP_TRIM_CUT > 0 Then Number_Of_Top_Cuts = 1
           
         Multiple_Cut_Labor = RateR * Bottom_Trim_Cut + NIAGRA_FIXED_FEEDRATE
         Multiple_Cut_Labor = ((RateR * TOP_TRIM_CUT + NIAGRA_FIXED_FEEDRATE) * Number_Of_Top_Cuts) + Multiple_Cut_Labor
         Multiple_Cut_Labor = Multiple_Cut_Labor + ACTIVATE_FOOT_PEDAL
         Multiple_Cut_Labor = Multiple_Cut_Labor + REMOVE_SCRAP_AND_ASIDE
         Multiple_Cut_Labor = Multiple_Cut_Labor + PICK_UP_AND_MOVE_TO_SHEAR
         Multiple_Cut_Labor = Multiple_Cut_Labor + MOVE_AND_POSITION_PEICE

         Multiple_Cut_Std = Multiple_Cut_Labor
         Multiple_Cut_Std = Multiple_Cut_Std + PROGRAM_SETUP_TIME
         Multiple_Cut_Std = Multiple_Cut_Std + NIAGRA_LAST_PART_EJECT
         Multiple_Cut_Std = Multiple_Cut_Std + ACTIVATE_START_BUTTON
         Multiple_Cut_Std = Multiple_Cut_Std + Paperwork
         GoSub CalcMultipleCutStuff
         Multiple_Cut_Std = Multiple_Cut_Std / Parts_Per_blank
         Multiple_Cut_Std = Multiple_Cut_Std * Shear_Pfd
         Multiple_Cut_Std = Multiple_Cut_Std / 60
      Case Else
   End Select
Exit Sub

CalcFirstCutStuff:

   Call Elem_ClearArray
    Elem!(6) = 1
    Elem!(7) = PROGRAM_SETUP_TIME
    Elem!(8) = 1
    Elem!(9) = OBTAIN_AND_STARTUP_VACCULIFT
   Elem!(10) = 1
   Elem!(11) = WALK_TO_AND_FROM_MATERIAL
   Elem!(12) = 1
   Elem!(13) = OBTAIN_SHEET
   Elem!(14) = 1
   Elem!(15) = INSERT_TO_WRKHLDR_AND_STOP
   Elem!(16) = 1
   Elem!(17) = ACTIVATE_FOOT_PEDAL
   Elem!(18) = 1
   Elem!(19) = ACTIVATE_START_BUTTON
   
   If ExtraShear% Then
      Elem!(20) = SecondCut
      Elem!(22) = (RateR * SecondCut + PULLMAX_FIXED_FEEDRATE) * Blocks_Per_Sheet
   Else
      Elem!(20) = FirstCut
      Elem!(22) = (RateR * FirstCut + PULLMAX_FIXED_FEEDRATE) * Blocks_Per_Sheet
   End If
   Elem!(21) = Blocks_Per_Sheet

   Elem!(29) = 1
   Elem!(30) = PULLMAX_LAST_PART_EJECT
   Elem!(33) = 1
   Elem!(34) = PULLMAX_SQUARE_CUT
   Elem!(37) = 1
   Elem!(38) = REMOVE_SCRAP_AND_ASIDE
   If SPIN_BLANK_ON_FIRSTCUT <> 0 Then
      Elem!(43) = 1
      Elem!(44) = SPIN_BLANK_ON_FIRSTCUT
   End If
   
   Elem!(0) = Paperwork                         ' Paperwork
   Elem!(1) = First_Cut_Std                     ' total select time
   Elem!(2) = parts_per_sheet                   ' # of parts
   Elem!(3) = Elem!(1) / Elem!(2)               ' # of minutes
   Elem!(4) = Elem!(3) * (Shear_Pfd + LOT_SIZE_RED_OFFALL) ' over head
   Elem!(5) = Elem!(4) / 60                     ' standard hours
   Elem!(46) = 85                               ' Lot size reduction and offall
   Call Elem_Add(PartN$, "FRST", "SHEAR")
Return

CalcSecondCutStuff:
   Call Elem_ClearArray
    Elem!(6) = 1
    Elem!(7) = PROGRAM_SETUP_TIME
   Elem!(16) = 1
   Elem!(17) = ACTIVATE_FOOT_PEDAL
   Elem!(18) = 1
   Elem!(19) = ACTIVATE_START_BUTTON
   
   If ExtraShear% Then
      Elem!(23) = FirstCut
      Elem!(25) = (RateR * FirstCut + NIAGRA_FIXED_FEEDRATE) * Blanks_Per_Block
   Else
      Elem!(23) = SecondCut!
      Elem!(25) = (RateR * SecondCut! + NIAGRA_FIXED_FEEDRATE) * Blanks_Per_Block
   End If
   Elem!(24) = Blanks_Per_Block

   Elem!(31) = 1
   Elem!(32) = NIAGRA_LAST_PART_EJECT
   Elem!(35) = 1
   Elem!(36) = NIAGRA_SQUARE_CUT
   Elem!(37) = 1
   Elem!(38) = REMOVE_SCRAP_AND_ASIDE
   Elem!(39) = 1
   Elem!(40) = PICK_UP_AND_MOVE_TO_SHEAR
   Elem!(41) = 1
   Elem!(42) = MOVE_AND_POSITION_PEICE
   If SPIN_BLANK_ON_SECCUT <> 0 Then
      Elem!(43) = 1
      Elem!(44) = SPIN_BLANK_ON_SECCUT
   End If
   
   Elem!(0) = Paperwork                         ' Paperwork
   Elem!(1) = Second_Cut_Std                    ' total select time
   If ExtraShear% Then
      Elem!(2) = Blanks_Per_Block * Parts_Per_blank! ' # of parts
   Else
      Elem!(2) = Blanks_Per_Block               ' # of parts
   End If
   Elem!(3) = Elem!(1) / Elem!(2)               ' # of minutes
   Elem!(4) = Elem!(3) * Shear_Pfd              ' over head
   Elem!(5) = Elem!(4) / 60                     ' standard hours
   Elem!(46) = 0                                ' Lot size reduction and offall
   Call Elem_Add(PartN$, "SCND", "SHEAR")
Return

CalcMultipleCutStuff:
   Call Elem_ClearArray
    Elem!(6) = 1
    Elem!(7) = PROGRAM_SETUP_TIME
   Elem!(16) = 1
   Elem!(17) = ACTIVATE_FOOT_PEDAL
   Elem!(18) = 1
   Elem!(19) = ACTIVATE_START_BUTTON
   
   Elem!(23) = Bottom_Trim_Cut
   Elem!(24) = 1
   Elem!(25) = (RateR * Bottom_Trim_Cut + NIAGRA_FIXED_FEEDRATE)

   Elem!(26) = TOP_TRIM_CUT * Number_Of_Top_Cuts
   Elem!(27) = Number_Of_Top_Cuts
   Elem!(28) = (RateR * TOP_TRIM_CUT + NIAGRA_FIXED_FEEDRATE) * Number_Of_Top_Cuts

   Elem!(31) = 1
   Elem!(32) = NIAGRA_LAST_PART_EJECT
   Elem!(35) = 1
   Elem!(36) = NIAGRA_SQUARE_CUT
   Elem!(37) = 1
   Elem!(38) = REMOVE_SCRAP_AND_ASIDE
   Elem!(39) = 1
   Elem!(40) = PICK_UP_AND_MOVE_TO_SHEAR
   Elem!(41) = 1
   Elem!(42) = MOVE_AND_POSITION_PEICE
   
   Elem!(0) = Paperwork                         ' Paperwork
   Elem!(1) = Multiple_Cut_Std                  ' total select time
   Elem!(2) = Parts_Per_blank                   ' # of parts
   Elem!(3) = Elem!(1) / Elem!(2)               ' # of minutes
   Elem!(4) = Elem!(3) * Shear_Pfd              ' over head
   Elem!(5) = Elem!(4) / 60                     ' standard hours
   Elem!(46) = 0                                ' Lot size reduction and offall
   Call Elem_Add(PartN$, "MULT", "SHEAR")
Return

End Sub

Sub Det_TimeSaver_Labor(Labor!, Rstd!, shrd%, Bad%)
'
'  labor is in minutes
'  Standard is in hours
'
currform!txtCalcStat.Caption = "Determine timesaver runtime"
DoEvents
   PartN$ = currform![PartNumber]
   Call Elem_ClearArray
   pfd = 1.15
   Paperwork = 0.01
   If shrd% Then
      typ$ = "SHRD"
      If (Multi$ = "MULTIPLE") Or (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
         Elem1 = 0.15 / Parts_Per_blank!
         Elem!(7) = Parts_Per_blank!            ' Elem1V1
      Else
         Elem1 = 0.15
         Elem!(7) = 1                           ' Elem1V1
      End If
      
      If Actual_PartHeight > Actual_PartWidth Then
         MajorDim = Actual_PartHeight
         MinorDim = Actual_PartWidth
      Else
         MajorDim = Actual_PartWidth
         MinorDim = Actual_PartHeight
      End If
      
   Else
      typ$ = "MULT"
      Elem1 = 0.15
      Elem!(7) = 1                              ' Elem1V1
      
      If First_Dim! > Second_dim! Then
         MajorDim = First_Dim!
         MinorDim = Second_dim!
      Else
         MajorDim = Second_dim!
         MinorDim = First_Dim!
      End If
   End If
   
   Elem!(6) = Elem1                             ' Elem1A
   Elem!(8) = 1                                 ' Elem1V2
   
   Elem2 = MajorDim * 0.002
   Elem!(10) = Elem2                            ' Elem2A
   Elem!(11) = MajorDim                         ' Elem2v1
   
   Elem3 = 0.047
   Elem!(14) = Elem3                            ' Elem3A
   Labor! = Elem1 + Elem2 + Elem3

   Elem!(18) = Labor! * 60

   If (MinorDim > 36) Then
      Bad% = True
   Else
      Bad% = False
   End If
   Elem!(0) = Paperwork                         ' Paperwork
   Elem!(1) = Labor! + Paperwork                ' total select time
   Elem!(2) = 1                                 ' # of parts
   Elem!(3) = Elem!(1)                          ' # of minutes
   Elem!(4) = Elem!(3) * pfd                    ' over head
   Elem!(5) = Elem!(4) / 60                     ' standard hours
   Rstd! = Elem!(5)
   Call Elem_Add(PartN$, typ$, "TIMESAVER")
End Sub

Sub diskout()
   Dim MainDB As Database, MainSet As Recordset
   Dim Main2DB As Database, Main2Set As Recordset
   
   Dim MainTableDef As TableDef
   Dim DocName As String
   Dim LinkCriteria As String
   Dim MyForm As Form

   Set MainDB = DBEngine.Workspaces(0).Databases(0)
   Set Main2DB = DBEngine.Workspaces(0).Databases(0)
   
'   currform.Refresh
   PN$ = currform!PartNumber

   Set MainSet = MainDB.OpenRecordset("Process", DB_OPEN_TABLE)   ' Create dynaset.
   Set Main2Set = Main2DB.OpenRecordset("RMSFILES#_MSWKP811", DB_OPEN_DYNASET)  ' Create dynaset.
   MainSet.Index = "PrimaryKey"
'   Main2Set.Index = "PrimaryKey"
   Close #2
   
   On Error Resume Next
   MkDir "C:\Files\Process\"
   On Error GoTo 0
   
   Open "C:\Files\Process\junk.dat" For Output As #2
   Print #2, "********** Beginning of Uploaded Text **********"
   MainSet.Seek ">=", PN$
   If Not (MainSet.NoMatch) Then
'      MainSet.MovePrevious
      If Not (MainSet.BOF) Then
         px$ = MainSet!PartNumber
         pps = MainSet!PartsPerSheet

'         Print #2, rpad$("(" + Trim$(Str$(pps)) + "/SHEET)", 30) + lpad$("GR. WT.- " + Format$(MainSet!GrossWt, "0.000"), 30)
'         Print #2, Center$("MATERIAL " + MainSet!MetalType, 60)
         hist$ = itsaNull$(MainSet!History)
         Call PARSE(hist$, eco$, ")", RCx%)
         If eco$ <> "" Then eco$ = eco$ + ")"
         prt$ = Trim$(MainSet!PartNumber)
         prt$ = "B" + Left$(prt$, 3) + "-" + Mid$(prt$, 4)
'         Print #2, Center$(prt$ + " " + Trim$(MainSet!PartName), 60)
'         Print #2, Center$(eco$, 60)
'         Print #2,
         
         GoSub Getlines
      End If
   End If
   Print #2, "********** End of Uploaded Text **********"
   Close #2
   
   Set Main2Set = Main2DB.OpenRecordset("RMSFILES#_MSWKP811", DB_OPEN_DYNASET)  ' Create dynaset.
   
   On Error Resume Next
   Main2Set.MoveFirst
   On Error GoTo 0
   Users$ = myNTUserName$

   Do
      If Not (Main2Set.EOF) Then
         If Trim$(Main2Set![USERID]) = Users$ Then
            Main2Set.Delete
         End If
         DoEvents
      Else
         DoEvents
         Exit Do
      End If
      Main2Set.MoveNext
   Loop

   On Error Resume Next
   MkDir "C:\Files\Process\"
   On Error GoTo 0
   
   Open "c:\Files\Process\junk.dat" For Input As #2
  ' Main2Set.MoveFirst
   rec = 0
   ptn$ = currform!PartNumber
   'ptn$ = Left$(ptn$, 7)
   ptn$ = Mid(PN$, 1, Len(PN$) - 1)

   Set Main2Set = Main2DB.OpenRecordset("RMSFILES#_MSWKP811", DB_OPEN_DYNASET)  ' Create dynaset.
   While Not (EOF(2))
      Line Input #2, axc$
      Main2Set.AddNew
      rec = rec + 10
      Main2Set![USERID] = Users$
      Main2Set![RECNO] = lpad$(Trim$(Str$(rec)), 5)
      Main2Set![UPLTXT] = axc$
      Main2Set![PRD#] = rpad(ptn$, 15)
      Main2Set.Update
   Wend
   Close #2
Exit Sub

Getlines:
   Set MainSet = MainDB.OpenRecordset("AP by PN and OPCode", DB_OPEN_DYNASET)
'   MainSet.Index = "PartNumber"
   MainSet.FindFirst ("PartNumber = '" + PN$ + "'")
   
   If Not (MainSet.NoMatch) Then
      Do While Trim$(MainSet!PartNumber) = PN$
         opcd$ = Left(Trim(itsaNull$(MainSet!OpCode)) + " ", 1)
         If InStr("!@#$%^&*", opcd$) = 0 Then
            A$ = "OP. " + Trim$(MainSet!OpCode) + " "
            A$ = A$ + Trim$(itsaNull$(MainSet!Machine)) + " - "
            A$ = A$ + MainSet!Description
            While InStr(A$, "  ") <> 0
               ix = InStr(A$, "  ")
               A$ = Left$(A$, ix) + Mid$(A$, ix + 2)
            Wend
            Do While Len(A$) > 0
               If Len(A$) <= 60 Then
                  Print #2, A$
                  Exit Do
               End If
               
               bx$ = Left$(A$, 61)
               
               ix = LastInStr(bx$, " ")
               If ix = 0 Then ix = 60
               If ix = 61 Then ix = 60
               
               bx$ = Left$(A$, ix)
               A$ = Trim$(Mid$(A$, ix + 1))
               Print #2, bx$
            Loop
            Print #2,
         End If
         MainSet.MoveNext
         If (MainSet.EOF) Then Exit Do
      Loop
   End If
Return

End Sub
Sub UpdateAS400()
   Dim MainDB As Database, MainSet As Recordset
   Dim Main2DB As Database, Main2Set As Recordset
   
   Set MainDB = DBEngine.Workspaces(0).Databases(0)
   
'   currform.Refresh
   PN$ = currform!PartNumber
   PN$ = Left$(PN$, 7)
   wh$ = currform!Warehouse
   Set MainSet = MainDB.OpenRecordset("RMSFILES#_PSNWP1A0", DB_OPEN_DYNASET)  ' Create dynaset.
   MainSet.FindFirst "PRDNO = '" + PN$ + "'"
   
   If Not (MainSet.NoMatch) Then
      Gws$ = Format(itsaNull$(currform!GrossWt), "#.000")
      aws$ = Format(itsaNull$(currform!ActualWt), "#.000")
      matl$ = currform!Field113.Column(2)
'      Mtl$ = itsaNull$(currform!Material)
      MainSet.Edit
      MainSet!netwt = aws$
      MainSet!GRSwt = Gws$
      MainSet![MATL#] = matl$
      MainSet.Update
   End If
   pnn$ = Left$(PN$, 1)
   Select Case pnn$
      Case "2"
         flnn$ = "KBBLP1A0-2"
      Case "8"
         flnn$ = "KBBLP1A0-8"
      Case "9"
         flnn$ = "KBBLP1A0-9"
      Case Else
         flnn$ = "KBBLP1A0"
   End Select
   Set MainSet = MainDB.OpenRecordset(flnn$, DB_OPEN_DYNASET)  ' Create dynaset.
   MainSet.FindFirst "PRDNO = '" + PN$ + "'"
   Do
      If Not (MainSet.NoMatch) Then
         If MainSet!KBLWH = wh$ Then
            pps$ = currform!PartsPerSheet
            ppb$ = currform!PartsPerBlank
            MainSet.Edit
            MainSet!SSIZE3 = pps$
            MainSet!BSIZE3 = ppb$
            MainSet.Update
            Exit Do
         Else
            MainSet.FindNext "PRDNO = '" + PN$ + "'"
         End If
      Else
         Exit Do
      End If
   Loop
End Sub

Function LastInStr(st$, ins$)
'
' searches st$ for ins$ and returns the starting position
' of the last occurance of ins$.
'
'
' example:
'                123456789012345678901234
'        st$=   "XXXXXXXXXXXXabcXXXabcXXX"
'       ins$=   "abc"
'
'  LastInStr=19
'
'
   lins = Len(ins$)
   lst = Len(st$)
   If (InStr(st$, ins$) = 0) Or (lins > lst) Then
      LastInStr = 0
      Exit Function
   End If
   For ix = lst - lins + 1 To 1 Step -1
      If Mid$(st$, ix, lins) = ins$ Then
         Exit For
      End If
   Next
   LastInStr = ix
End Function




Sub ds_add(dsType$, Oper$)
   fnd = 0
   For i = 0 To 40
      If Ds$(i) = "" Then
         fnd = 1
         Exit For
      End If
   Next
   If fnd = 1 Then
      Ds$(i) = dsType$ + "~~" + Oper$
   End If
End Sub

Sub Edit_The_Shear_Files()

   Open ShearsName For Input As #1
      Line Input #1, Sheet1path$
      Line Input #1, Sheet2path$
   Close #1
   Sheet1path$ = Trim$(Sheet1path$)
   Sheet2path$ = Trim$(Sheet2path$)

   FL$ = Trim$(currform!PartNumber)
   Rev$ = Right$(FL$, 1)
   If (Rev$ = "-") Or (InStr("0123456789", Rev$) <> 0) Then
      Rev$ = ""
   End If
   fx = Len(FL$)
   fl1$ = Sheet1path$ + "\" + Left$(FL$, fx - 1) + "." + Rev$
   fl2$ = Sheet2path$ + "\" + Left$(FL$, fx - 1) + "." + Rev$

   s = 0
   On Error GoTo NoShear
   Open fl1$ For Input As #1
   Close #1
   On Error GoTo 0

   If s = 0 Then
       x = Shell("NOTEPAD.EXE " + fl1$, 1)
   End If

   
   s = 0
   On Error GoTo NoShear
   Open fl2$ For Input As #1
   Close #1
   On Error GoTo 0
   
   If s = 0 Then
       x = Shell("NOTEPAD.EXE " + fl2$, 1)
   End If

Exit Sub

NoShear:
   s = 1
   Resume Next

End Sub

Sub Elem_Add(PartN$, Oper$, ShType$)
Dim DataShDB As Database, DataShSet As Recordset

Criteria$ = "PartNumber = '" + PartN$ + "'"                         ' Set search criteria.
Set DataShDB = DBEngine.Workspaces(0).Databases(0)
Set DataShSet = DataShDB.OpenRecordset("DataSheetQ1", DB_OPEN_DYNASET)

   If NoDataSheets% = 0 Then
      Exit Sub
   End If
   DataShSet.AddNew
   
   DataShSet!PartNumber = PartN$
   DataShSet!Operation = Oper$
   DataShSet!SheetType = ShType$
   DataShSet!Generated = True

                DataShSet!Paperwork = Elem!(0)
          DataShSet!TotalSelectTime = Elem!(1)
            DataShSet!StandardParts = Elem!(2)
   DataShSet![StandardMinutes/part] = Elem!(3)
                   DataShSet![pf&d] = Elem!(4)
     DataShSet![StandardHours/part] = Elem!(5)

    DataShSet!Elem1A = Elem!(6)
   DataShSet!Elem1V1 = Elem!(7)
   DataShSet!Elem1V2 = Elem!(8)
   DataShSet!Elem1V3 = Elem!(9)

    DataShSet!Elem2A = Elem!(10)
   DataShSet!Elem2V1 = Elem!(11)
   DataShSet!Elem2V2 = Elem!(12)
   DataShSet!Elem2V3 = Elem!(13)

    DataShSet!Elem3A = Elem!(14)
   DataShSet!Elem3V1 = Elem!(15)
   DataShSet!Elem3V2 = Elem!(16)
   DataShSet!Elem3V3 = Elem!(17)

    DataShSet!Elem4A = Elem!(18)
   DataShSet!Elem4V1 = Elem!(19)
   DataShSet!Elem4V2 = Elem!(20)
   DataShSet!Elem4V3 = Elem!(21)

    DataShSet!Elem5A = Elem!(22)
   DataShSet!Elem5V1 = Elem!(23)
   DataShSet!Elem5V2 = Elem!(24)
   DataShSet!Elem5V3 = Elem!(25)

    DataShSet!Elem6A = Elem!(26)
   DataShSet!Elem6V1 = Elem!(27)
   DataShSet!Elem6V2 = Elem!(28)
   DataShSet!Elem6V3 = Elem!(29)

    DataShSet!Elem7A = Elem!(30)
   DataShSet!Elem7V1 = Elem!(31)
   DataShSet!Elem7V2 = Elem!(32)
   DataShSet!Elem7V3 = Elem!(33)

    DataShSet!Elem8A = Elem!(34)
   DataShSet!Elem8V1 = Elem!(35)
   DataShSet!Elem8V2 = Elem!(36)
   DataShSet!Elem8V3 = Elem!(37)

    DataShSet!Elem9A = Elem!(38)
   DataShSet!Elem9V1 = Elem!(39)
   DataShSet!Elem9V2 = Elem!(40)
   DataShSet!Elem9V3 = Elem!(41)

    DataShSet!Elem10A = Elem!(42)
   DataShSet!Elem10V1 = Elem!(43)
   DataShSet!Elem10V2 = Elem!(44)
   DataShSet!Elem10V3 = Elem!(45)

    DataShSet!Elem11A = Elem!(46)
   DataShSet!Elem11V1 = Elem!(47)
   DataShSet!Elem11V2 = Elem!(48)
   DataShSet!Elem11V3 = Elem!(49)

    DataShSet!Elem12A = Elem!(50)
   DataShSet!Elem12V1 = Elem!(51)
   DataShSet!Elem12V2 = Elem!(52)
   DataShSet!Elem12V3 = Elem!(53)
   DataShSet.Update

    
End Sub

Sub Elem_ClearAllRecs(PartN$)

Dim DataShDB As Database, DataShSet As Recordset
If Not (OutPutData%) Then
   Exit Sub
End If

Criteria$ = "PartNumber = '" + PartN$ + "'"                         ' Set search criteria.
Set DataShDB = DBEngine.Workspaces(0).Databases(0)
Set DataShSet = DataShDB.OpenRecordset("DataSheetQ1", DB_OPEN_DYNASET)
   

DataShSet.FindFirst Criteria$                                       ' Find first occurrence.
Do Until DataShSet.NoMatch                                          ' Loop until no matching records.
    s$ = DataShSet!PartNumber
    If DataShSet!Generated = True Then
       DataShSet.Delete                                                ' Delete it.
    End If
    DataShSet.FindNext Criteria$                                    ' Find next occurrence.
Loop                                                                ' End of loop.


End Sub

Sub Elem_ClearArray()
'   If Not (NoDataSheets%) Then
      For i = 0 To 53
         Elem!(i) = 0
         DoEvents
      Next
'   endif
End Sub

Sub Elem_Del()
Dim DataShDB As Database, DataShSet As Recordset

PartN$ = currform!PartNumber
Criteria$ = "PartNumber = '" + PartN$ + "'"                         ' Set search criteria.
Set DataShDB = DBEngine.Workspaces(0).Databases(0)
Set DataShSet = DataShDB.OpenRecordset("DataSheetQ1", DB_OPEN_DYNASET)

DataShSet.FindFirst Criteria$                                       ' Find first occurrence.

Do Until DataShSet.NoMatch                                          ' Loop until no matching records.
    Oper$ = DataShSet!Operation
    ShType$ = DataShSet!SheetType
    Cmp$ = ShType$ + "~~" + Oper$
    fnd = 0
    
    For i = 0 To 40
       dx$ = Ds$(i)
       If dx$ = "" Then Exit For

       If dx$ = Cmp$ Then
          fnd = 1
          Exit For
       End If
    Next
    If fnd = 0 Then
       If DataShSet!Generated = True Then
          DataShSet.Delete                                             ' Delete it.
       End If
    End If
    DataShSet.FindNext Criteria$                                    ' Find next occurrence.
Loop

End Sub

Sub ErrorMessages()
   If currform![CalculationStatus] = 0 Then
      currform!TextCalcErr.Visible = False
   Else
     currform!TextCalcErr.Visible = True
      Select Case currform![CalculationStatus]
         Case 1
            currform!TextCalcErr.Caption = "Calculation Error"
         Case 2
            currform!TextCalcErr.Caption = "Calculation Error Invalid 2nd Dim"
         Case 3
            currform!TextCalcErr.Caption = "Calculation Error Invalid Sheet Width"
         Case 4
            currform!TextCalcErr.Caption = "Calculation Parts/Sheet = 0"
         Case 5
            currform!TextCalcErr.Caption = "Invalid PMI Trim Cut "
         Case 6
            currform!TextCalcErr.Caption = "Unable to Calculate Zeros in entries"
         Case 7
            currform!TextCalcErr.Caption = "Bad Record Information"
         Case 8
            currform!TextCalcErr.Caption = "Unable to Calculate Cycle Time"
         Case 9
            currform!TextCalcErr.Caption = "Cut Type Not Entered"
         Case 10
            currform!TextCalcErr.Caption = "Invalid Part Width"
         Case 11
            currform!TextCalcErr.Caption = "Invalid Material Selected"
         Case 12
            currform!TextCalcErr.Caption = "Calculation Error Invalid 1nd Dim"
         Case 13
            currform!TextCalcErr.Caption = "No Cut Type Selected"
         Case 14
            currform!TextCalcErr.Caption = "Deburr Type Not Selected"
         Case 15
            currform!TextCalcErr.Caption = "No Primary CNC Selected"
         Case 16
            currform!TextCalcErr.Caption = "More Than One Primary CNC Selected"
         Case 17
            currform!TextCalcErr.Caption = "C-1000 Must Use CB CL PB"
         Case 18
            currform!TextCalcErr.Caption = "Invalid Work Center for Warehouse"
         Case 19
            currform!TextCalcErr.Caption = "Deburr type cannot be Timer Saver if Metal type is Aluminized"
         Case 20
            currform!TextCalcErr.Caption = "Part too small to run through Timer Saver"
         Case Else
            currform!TextCalcErr.Caption = "Unknown Error"
      End Select
   End If
End Sub

Sub Find_By_MakeNumber()
    PN$ = currform!PartNumber
    DocName = PrimaryScreen$
    DoCmd.OpenForm DocName, , , LinkCriteria
    DoCmd.GoToControl "PartName"
    DoCmd.GoToControl "PhantomNumber"
    DoCmd.FindRecord PN$, A_ANYWHERE, False, A_DOWN, , , True
    DoCmd.DoMenuItem A_FORMBAR, A_EDITMENU, 9
End Sub

Sub Find_By_PartNumber()
    PN$ = currform!PartNumber
    DocName = PrimaryScreen$
    DoCmd.OpenForm DocName, , , LinkCriteria
    DoCmd.GoToControl "PartName"
    DoCmd.GoToControl "PartNumber"
    DoCmd.FindRecord PN$, A_ANYWHERE, False, acSearchAll, , , True
    DoCmd.DoMenuItem A_FORMBAR, A_EDITMENU, 9
End Sub

Function FormitI$(A%, x$)
   l = Len(x$)
   FormitI$ = lpad$(Format$(A%, x$), l)

End Function

Function FormitS$(A!, x$)
   l = Len(x$)
   FormitS$ = lpad$(Format$(A!, x$), l)
End Function

Sub GOTOPARTNUMBER(PN$, PScreen$)
    DocName = PScreen$
    DoCmd.OpenForm DocName, , , LinkCriteria
    DoCmd.GoToControl "PartName"
    DoCmd.GoToControl "PartNumber"
    DoCmd.FindRecord PN$, A_ANYWHERE, False, A_DOWN, True, , True
End Sub

Sub GrainFromRec()
   On Error GoTo CHKGRAIN
   Gd$ = currform!GrainDir
   On Error GoTo 0
   Select Case Gd$
      Case "Along First Dimension"
         currform!GrDirOpt = 1
      Case "Along Second Dimension"
         currform!GrDirOpt = 2
      Case "No Grain Direction"
         currform!GrDirOpt = 3
      Case Else
         currform!GrDirOpt = 0
   End Select
gr_exit:
Exit Sub
CHKGRAIN:
   If Err = 94 Then
      currform!GrainDir = "No Grain Direction"
      currform!GrDirOpt = 3
      Resume gr_exit
   End If
   Resume Next

   
End Sub

Sub HistoryR()
    If IsNull(currform!IssueNumber) Then currform!IssueNumber = "   "
    If IsNull(currform!History) Then currform!History = " "
    If IsNull(currform!Reason) Then currform!Reason = " "
    currform!PreviousIssue = currform!IssueNumber
    currform!PreviousDate = currform!IssueDate
    isss = Val(itsaNull((currform!IssueNumber)))
    currform!IssueNumber = Trim$(Str$(isss + 1))
    currform!IssueDate = Date$
    H$ = currform!History
    H$ = "(" + Trim$(currform!Reason) + "/" + Date$ + ")" + H$
    currform!History = RTrim$(rpad$(H$, 200))

End Sub

Function instrl(A$, b$)
   la% = Len(A$)
   lb% = Len(b$)
   xp% = la%
   For i% = la% To 1 Step -1
      va$ = Left$(Mid$(A$, i%), lb%)
      If va$ = b$ Then
         xp% = i%
         Exit For
      End If
   Next
   instrl = xp%
End Function

Function itsaNull$(variableField)
   If IsNull(variableField) Then
      IzzIt$ = ""
   Else
      IzzIt$ = variableField
   End If
   itsaNull$ = IzzIt$
End Function

Function ItsAZero!(variableField)
   If IsNull(variableField) Then
      IzzIt1! = 0
   Else
      IzzIt1! = variableField
   End If
   ItsAZero! = IzzIt1!
End Function

Function lpad$(A$, l)
   lpad$ = Right$(Space$(l) + A$, l)
End Function

Sub MakeProcesses()

Dim AddnlQDB As Database, AddnlQSet As Recordset
Dim AddnlDB As Database, AddnlSet As Recordset
Dim MachQDB As Database, MachQSet As Recordset
Dim MachNQDB As Database, MachNQSet As Recordset
Dim PressBrk As Database, PressBrkSet As Recordset
Dim PunchPress As Database, PunchPressSet As Recordset
Dim PemPress As Database, PemPressSet As Recordset


currform!txtCalcStat.Caption = "Entering Make Process"
DoEvents
PartN$ = currform![PartNumber]
warehouses$ = currform![Warehouse]
DescrW = 39
Criteria$ = "PartNumber = '" + PartN$ + "'"                         ' Set search criteria.
currform!txtCalcStat.Caption = "MP - Opening AddnlQ1"
DoEvents
Set AddnlQDB = DBEngine.Workspaces(0).Databases(0)
Set AddnlQSet = AddnlQDB.OpenRecordset("AddnlQ1", DB_OPEN_DYNASET)  ' Create dynaset.

currform!txtCalcStat.Caption = "MP - Opening AddnlPROC"
DoEvents

Set AddnlDB = DBEngine.Workspaces(0).Databases(0)
Set AddnlSet = AddnlQDB.OpenRecordset("AddnlPROC", DB_OPEN_TABLE)   ' Create dynaset.

currform!txtCalcStat.Caption = "MP - Opening PressBrakeQ1"
DoEvents

Set PressBrk = DBEngine.Workspaces(0).Databases(0)
Set PressBrkSet = PressBrk.OpenRecordset("PressBrakeQ1", DB_OPEN_DYNASET)   ' Create dynaset.

currform!txtCalcStat.Caption = "MP - Opening PEMPressQ1"
DoEvents

Set PemPress = DBEngine.Workspaces(0).Databases(0)
Set PemPressSet = PemPress.OpenRecordset("PEMPressQ1", DB_OPEN_DYNASET)   ' Create dynaset.

currform!txtCalcStat.Caption = "MP - Opening PunchPress"
DoEvents

Set PunchPress = DBEngine.Workspaces(0).Databases(0)
Set PunchPressSet = PunchPress.OpenRecordset("PunchPress", DB_OPEN_TABLE)   ' Create dynaset.

PunchPressSet.Index = "Die"


AddnlQSet.FindFirst Criteria$                                       ' Find first occurrence.
Do Until AddnlQSet.NoMatch                                          ' Loop until no matching records.
    Generated% = AddnlQSet!Generated                                ' Get Generation flag.
    s$ = AddnlQSet!PartNumber
    If Generated% = True Then                                       ' if this is a generated record the delete it
       AddnlQSet.Delete                                             ' Delete it.
    Else
       If warehouses$ = "90" Then
          If AddnlQSet!wc2 = "345" Or AddnlQSet!wc2 = "347" Then
            currform![CalculationStatus] = 18
            Call ErrorMessages
            Exit Sub
          End If
       Else
          If AddnlQSet!wc2 = "302" Or AddnlQSet!wc2 = "304" Then
            currform![CalculationStatus] = 18
            Call ErrorMessages
            Exit Sub
          End If
       End If

    End If

    AddnlQSet.FindNext Criteria$                                    ' Find next occurrence.
    DoEvents
Loop                                                                ' End of loop.

   

Set MachQDB = DBEngine.Workspaces(0).Databases(0)
Set MachQSet = MachQDB.OpenRecordset("MachinesQ1", DB_OPEN_DYNASET)  ' Create dynaset.
'Set MachQSet = StMachQ2Set

Set MachNQDB = DBEngine.Workspaces(0).Databases(0)
Set MachNQSet = MachNQDB.OpenRecordset("MachineNames", DB_OPEN_TABLE)  ' Create dynaset.
'Set MachNQSet = StMachNamesSet
MachNQSet.Index = "PrimaryKey"

For i = 0 To 40             ' clear the data sheet requirements array
   Ds$(i) = ""
Next
PMachine$ = ""
   MachQSet.FindFirst Criteria$                                       ' Find first occurrence.

currform!txtCalcStat.Caption = "MP - look for primary machine"

   Do Until MachQSet.NoMatch                                          ' Loop until no matching records.
      If MachQSet!Prime = True Then
         If MachQSet!Tool <> "SHR" Then
      
            If PMachine$ <> "" Then
               currform![CalculationStatus] = 16
               Call ErrorMessages
               Exit Sub
            End If
            PMachine$ = MachQSet!MachineName
            PWC1$ = MachQSet!Tool
            PCTime! = MachQSet!CycleTime
         End If
      End If
      MachQSet.FindNext Criteria$                                    ' Find next occurrence.
      DoEvents
   Loop
   If (PMachine$ = "") And (Multi$ <> "NO CNC") And (Multi$ <> "BLANK") Then
      currform![CalculationStatus] = 15
      Call ErrorMessages
      Exit Sub
   End If
   If Left$(PMachine$, 3) = "C-1" And currform!PressBrake <> 1 Then
      If currform!PressBrake <> 7 Then
         currform![CalculationStatus] = 17
         Call ErrorMessages
         Exit Sub
      End If
   End If
   If (Multi$ <> "NO CNC") And (Multi$ <> "BLANK") Then
      Call Det_CNC_Highest_Runtime(PartN$, CNCTime!, r$)
   End If
   GoSub CheckTheDeburrStuff
   If Not (PurchaseBlank%) Then
      If (First_Dim! <> Sheet_Length!) Or (Second_dim! <> Sheet_Width!) Then
         Call Det_Shear_Standard(1, First_Cut_Std, Second_Cut_Std, Multiple_Cut_Std, Multiple_Cut_Labor)
      End If
   End If

currform!txtCalcStat.Caption = "MP - generate processes"
DoEvents
              
   OpCode% = 10
   Select Case Multi$
      Case "SINGLE"
         GoSub Shear1
         GoSub Shear2
         If currform!PunchPressOption.Visible = True Then
            If currform!PunchPressOption = 1 Then
               GoSub PunchPress
            End If
         End If
         GoSub CNCOp
         If currform!PunchPressOption.Visible = True Then
            If currform!PunchPressOption = 2 Then
               GoSub PunchPress
            End If
         End If

      Case "MULTIPLE"
         GoSub Shear1
         If ExtraShear% Then
            ESTimes% = True
            GoSub Shear2
            ESTimes% = False
         End If

         GoSub CNCOp
         If SecondShear Then
            GoSub Shear2
         End If
      
      Case "LASER", "LASER/SHEAR", "SLUG"
         If (First_Dim! <> Sheet_Length!) Or (Second_dim! <> Sheet_Width!) Then
            GoSub Shear1
            If (ExtraShear%) Or (Multi$ = "LASER/SHEAR") Then
               ESTimes% = True
               GoSub Shear2
               ESTimes% = False
            End If
         End If
         
         GoSub CNCOp
      
      Case "SALVAGNINI"
         GoSub CNCOp
      
      Case "NO CNC"
         GoSub Shear1
         GoSub Shear2
         GoSub PunchPress

      Case "BLANK"
         GoSub Shear1
      Case Else
   End Select
   GoSub DeBurrOut
      
   If currform!PemBefore = True Then
      GoSub PemPress
      GoSub PressBrake
   Else
      GoSub PressBrake
      GoSub PemPress
   End If
 
   If OutPutData% Then
      currform.Refresh
      Call renumber
      If NoDataSheets% = 1 Then
         Call Elem_Del
      End If
      currform.Refresh
      Call ErrorMessages
   End If
 Exit Sub

AddAP:
' Input Parms:  OpCode%, PartN$, Descr$, wc1$-wc4$, machine$, ctime!, Rstd!
      opc$ = Opps$(OpCode%)
      AddnlSet.AddNew
      AddnlSet!PartNumber = PartN$
      AddnlSet!OpCode = opc$
      AddnlSet!Generated = True
      AddnlSet!Description = DESCR$
      AddnlSet!wc1 = lpad$(wc1$, 3)
      AddnlSet!wc2 = lpad$(wc2$, 3)
      AddnlSet!wc3 = lpad$(wc3$, 3)
      AddnlSet!wc4 = lpad$(wc4$, 3)
      AddnlSet!Machine = rpad$(Machine$, 30)
      AddnlSet!CycleTime = ctime!
      AddnlSet!RunStd = Rstd!
      AddnlSet.Update
Return

CNCOp:
      Select Case Multi$
         Case "SINGLE"
            If vb$ = "" Then
               DESCR$ = rpad$("NOTCH & PIERCE COMPLETE", DescrW)
               Call Add_Shear_Verbage(DESCR$)
            Else
               DESCR$ = vb$
            End If
         Case "MULTIPLE"
            If vb$ = "" Then
               DESCR$ = rpad$("NOTCH & PIERCE COMPLETE MULTIPLE", DescrW)
               Call Add_Shear_Verbage(DESCR$)
            Else
               DESCR$ = vb$
            End If
         Case "SALVAGNINI"
               DESCR$ = rpad$("LOAD / UNLOAD SALVAGNINI", DescrW)
         
         Case "LASER", "LASER/SHEAR", "SLUG"
            If (Multi$ = "SLUG") Then
               slugispart% = True
               vb$ = ""
            Else
               slugispart% = False
            End If
            If vb$ = "" Then
               prm$ = Left$(PMachine$, 3)
               Select Case prm$
                  Case "C-1", "C-2", "C-3", "C-4", "C-5", "C-6", "C-7", "C-8", "C-9", "V-1", "V-2", "V-4", "C10"
                     DESCR$ = rpad$("NOTCH & PIERCE COMPLETE - SLUG IS PART", DescrW)
                     Call Add_Shear_Verbage(DESCR$)
                     slugispart% = True
                  Case Else
                     If (Multi$ = "SLUG") Then
                        DESCR$ = rpad$("NOTCH & PIERCE COMPLETE - SLUG IS PART", DescrW)
                        Call Add_Shear_Verbage(DESCR$)
                        slugispart% = True
                     Else
                        DESCR$ = rpad$("CUT COMPLETE MULTIPLE", DescrW)
                        Call Add_Shear_Verbage(DESCR$)
                     End If
               End Select
                     
            Else
               DESCR$ = vb$
            End If
            If (Multi$ = "SLUG") Then slugispart% = True
         Case Else
            DESCR$ = rpad$("NOTCH & PIERCE COMPLETE", DescrW)
            GoSub DeburrIn
            Call Add_Shear_Verbage(DESCR$)
            DESCR$ = DESCR$ + db$
      End Select
     
'
'
      If (Multi$ = "MULTIPLE") Or (Multi$ = "LASER") Or (Multi$ = "SLUG") Or (Multi$ = "LASER/SHEAR") Then
         DESCR$ = DESCR$ + rpad$("(" + Format$(Parts_Per_blank!, "####0") + " PARTS/BLANK)", DescrW)
      End If
      wc1$ = "   ": wc2$ = "   ": wc3$ = "   ": wc4$ = "   ": Machine$ = " "
      DESCR$ = DESCR$ + rpad$("CNC's:", DescrW)
      MachQSet.FindFirst Criteria$                                       ' Find first occurrence.
      STDRD$ = "STD"
      If (Not (SecondShear)) And (Multi$ = "MULTIPLE") Then
         If InStr(MachinesWithShears$, Left$(PMachine$, 3)) <> 0 Then
            STDRD$ = "SNS"
         End If
      End If
      Do Until MachQSet.NoMatch                                          ' Loop until no matching records.
         If (MachQSet!Prime = True) Then
            MachNQSet.MoveFirst
            MName$ = MachQSet!MachineName
            MachNQSet.Seek "=", MName$
            
            If Not (MachNQSet.NoMatch) Then
               wc2$ = MachNQSet!wc2
               If wc2$ = "302" Then wc2$ = warehousewc$
               wc3$ = MachNQSet!wc3
               wc4$ = MachNQSet!wc4
            End If
         End If
         If MachQSet!Tool <> "***" Then
            Toool$ = MachQSet!Tool
            If Toool$ = "STD" Then
               If InStr(MachinesWithShears$, Left$(MachQSet!MachineName, 3)) = 0 Then
                  Toool$ = STDRD$
               End If
            End If

            dd$ = "(" + MachQSet!MachineName + "/" + Toool$
            DESCR$ = DESCR$ + rpad$(dd$ + "/" + Format$(MachQSet!CycleTime, "#####0.0") + ")", DescrW)
         End If
         MachQSet.FindNext Criteria$                                    ' Find next occurrence.
      Loop
      If ((Multi$ = "LASER") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG")) And Not (slugispart%) Then
         Call Det_LASER_Standard(PartN$, Rstd!, ctime!)
         Call ds_add("LASER", " ")
      ElseIf (Multi$ = "SALVAGNINI") And Not (slugispart%) Then
         Call Det_Salvagnini_Standard(PartN$, Rstd!, ctime!)
         Call ds_add("SALVAGNINI", " ")
      Else
         Call Det_CNC_Highest_Runtime(PartN$, ctime!, r$)
         Call Det_CNC_Standard(Rstd!, ctime!, r$)
         Call ds_add("CNC", " ")
      End If

      Machine$ = PMachine$
      wc1$ = PWC1$
   
      GoSub AddAP

      OpCode% = (OpCode% \ 10) + 1
      OpCode% = OpCode% * 10

      If ((Left$(PMachine$, 2) = "T-") Or (Left$(PMachine$, 3) = "L-2")) And (slugispart% = False) Then
         If PMachine = "L-2 3030 POT" Then
            Call Det_Shake("P", Rstd!)
         Else
            If MetalPart$ = "8111095" Or MetalPart$ = "8111126" Or MetalPart$ = "8110854" Or MetalPart$ = "8110799" Or MetalPart$ = "8111171" Or MetalPart$ = "8111172" Or MetalPart$ = "8110042" Then
               Call Det_Shake("FM", Rstd!)
            Else
               Call Det_Shake("F", Rstd!)
            End If
         End If
         Select Case Left$(PMachine$, 3)
            Case "T-1"
               wc2$ = "302" 'was 330 SG
               wc3$ = "071" 'was 017 SG
               wc4$ = "450"
            Case "T-2"
               wc2$ = "302" 'was 330 SG
               wc3$ = "072" 'was 018 SG
               wc4$ = "451"
            Case "T-3"
               wc2$ = "302" 'was 330 SG
               wc3$ = "073" 'was 019 SG
               wc4$ = "452"
            Case "T-4"
               wc2$ = "302" 'was 330 SG
               wc3$ = "074" 'was 020 SG
               wc4$ = "453"
            Case "L-2"
               wc2$ = "312"
               wc3$ = "119"
               wc4$ = "519"
            Case Else
         End Select
         wc1$ = ""
         Machine$ = "SHAKE"
         DESCR$ = "SHAKE AND BREAK PARTS FROM SKELETON"
         ctime! = 0
         'Input Parms:  OpCode%, PartN$, Descr$, wc1$-wc4$, machine$, ctime!, Rstd!
         GoSub AddAP
   
         OpCode% = (OpCode% \ 10) + 1
         OpCode% = OpCode% * 10
         
      End If
   Return


Shear1:
'
' First CUT
'
   If PurchaseBlank% Then
      Return
   End If
   Call ds_add("SHEAR", "FRST")
   ctime! = 0
   Rstd! = 0
   If FirstCutDir% = 2 Then
      DESCR$ = "USING PMI BLOCK TO " + Format$(Second_dim!, "####0.000") + " X "
      fc! = Second_dim!
      sc! = First_Dim!
   Else
      DESCR$ = "USING PMI BLOCK TO " + Format$(First_Dim!, "####0.000") + " X "
      fc! = First_Dim!
      sc! = Second_dim!
   End If
   If ExtraShear% Then
      DESCR$ = "USING PMI BLOCK TO " + Format$(Second_dim!, "####0.000") + " X "
      fc! = Second_dim!
      sc! = First_Dim!
   End If
   DESCR$ = rpad$(DESCR$ + Format$(Sheet_Width!, "####0.000"), DescrW)
   DESCR$ = DESCR$ + rpad$("(" + Format$(Blocks_Per_Sheet!, "###0") + " BLOCKS/SHEET)", DescrW)
   
   If Location% = 1 Then
      If warehousewc$ = "302" Then
         wc1$ = "   ": wc2$ = warehousewc$: wc3$ = "007": wc4$ = "007": Machine$ = "SHEAR 10"
         ShearWC$ = "007"
      Else
         wc1$ = "   ": wc2$ = warehousewc$: wc3$ = "007": wc4$ = "359": Machine$ = "SHEAR 10"
         ShearWC$ = "007"
      End If
   ElseIf Location% = 2 Then
      If warehousewc$ = "302" Then
         wc1$ = "   ": wc2$ = warehousewc$: wc3$ = "009": wc4$ = "009": Machine$ = "SHEAR 10"
         ShearWC$ = "009"
      Else
         wc1$ = "   ": wc2$ = warehousewc$: wc3$ = "009": wc4$ = "360": Machine$ = "SHEAR 10"
         ShearWC$ = "009" ' changed the 007's to 009
      End If
   Else
      Pm$ = Left$(PMachine$, 3)
      If ((Pm$ = "C-1") Or (Pm$ = "C-2")) And (warehousewc$ = "302") Then
         wc1$ = "   ": wc2$ = warehousewc$: wc3$ = "009": wc4$ = "009": Machine$ = "SHEAR 10"
         ShearWC$ = "009"
      Else
         wc1$ = "   ": wc2$ = warehousewc$: wc3$ = "009": wc4$ = "009": Machine$ = "SHEAR 10"
         ShearWC$ = "009" ' changed the 007's to 009
      End If
   End If
   If (Denting% = 1) Or (Denting% = 3) Then
      nt$ = "_BLOCK " + Trim$(Str$(Blocks_Per_Sheet! + 1)) + " UNUSABLE DUE TO DENTING)"
      DESCR$ = DESCR$ + "(NOTE:"
      Call AddDescr(DESCR$, nt$, DescrW)
   End If
      
   FCM$ = wc3$
   Rstd! = First_Cut_Std
   GoSub AddAP
   
   'OpCode% = OpCode% + 1
   'Descr$ = rpad$("SHEAR HELPER", DescrW)
   'wc1$ = "   ": wc2$ = warehousewc$: wc3$ = "010": wc4$ = "010": Machine$ = " "
   'Rstd! = First_Cut_Std
   'GoSub AddAP
   
   'If Fc! <= 12 Then
   '   OpCode% = OpCode% + 1
   '   Descr$ = rpad$("OFFALL LABOR", DescrW)
   '   wc1$ = "   ": wc2$ = warehousewc$: wc3$ = ShearWC$: wc4$ = "027": Machine$ = " "
   '   Rstd! = First_Cut_Std
   '   GoSub AddAP
   'End If
   OpCode% = (OpCode% \ 10) + 1
   OpCode% = OpCode% * 10

   Call Shear1FILE


Return
Shear2:
'
'  Second Cut
'
   If PurchaseBlank% Then
      Return
   End If
   Punch$ = currform!PunchNumber
   If (Multi$ = "NO CNC") And (Punch$ <> "!NONE!") And (currform!PunchPressOption = 2) Then
      Return
   End If
    
   ctime! = 0
   Rstd! = 0
   Bottom_Trim_Cut! = (currform![BotTrimCut])
   TOP_TRIM_CUT! = (currform![TopTrimCut])
   
   If (Multi$ = "MULTIPLE") And Not (ESTimes%) Then
      DESCR$ = rpad$("USING PMI SHEAR OFF EXCESS-" + Format$(Bottom_Trim_Cut!, "####0.00"), DescrW)
      dx$ = "BOTTOM"
      If TOP_TRIM_CUT! > 0 Then
         dx$ = dx$ + "/" + Format$(TOP_TRIM_CUT!, "####0.00") + " TOP"
      End If
      DESCR$ = DESCR$ + rpad$(dx$ + " (" + Format$(Parts_Per_blank!, "####0") + " PARTS/BLANK)", DescrW)
      fc! = Second_dim!
      If (Denting% = 2) Or (Denting% = 3) Then
         nt$ = "_BLANK " + Trim$(Str$(Blanks_Per_Block! + 1)) + " UNUSABLE DUE TO DENTING)"
         DESCR$ = DESCR$ + "(NOTE:"
         Call AddDescr(DESCR$, nt$, DescrW)
      End If
      If warehousewc$ = "302" Then
         wc1$ = "   ": wc2$ = warehousewc$: wc3$ = "009": wc4$ = "   ": Machine$ = "SHEAR 10"
      Else
         wc1$ = "   ": wc2$ = warehousewc$: wc3$ = "007": wc4$ = "   ": Machine$ = "SHEAR 10"
      End If
      Rstd! = Multiple_Cut_Std
      Call ds_add("SHEAR", "MULT")
      GoSub AddAP
   Else
      If ESTimes% Then
         DESCR$ = rpad$("USING PMI SQUARE END OF BLOCK,", DescrW)
         DESCR$ = DESCR$ + rpad$("SHEAR TO " + Format$(sc!, "####0.000") + " X " + Format$(fc!, "####0.000"), DescrW)
         DESCR$ = DESCR$ + rpad$("(" + Format$(Blanks_Per_Block!, "####0") + " BLANKS/BLOCK)", DescrW)
         Rstd! = Second_Cut_Std
      Else
         DESCR$ = rpad$("USING PMI SQUARE END OF BLOCK, ", DescrW)
         DESCR$ = DESCR$ + rpad$("SHEAR TO " + Format$(sc!, "####0.000") + " X " + Format$(fc!, "####0.000"), DescrW)
         DESCR$ = DESCR$ + rpad$("(" + Format$(Blanks_Per_Block!, "####0") + " BLANKS/BLOCK)", DescrW)
         Rstd! = Second_Cut_Std
      End If
      
      If (Denting% = 2) Or (Denting% = 3) Then
         nt$ = "_BLANK " + Trim$(Str$(Blanks_Per_Block! + 1)) + " UNUSABLE DUE TO DENTING)"
         DESCR$ = DESCR$ + "(NOTE:"
         Call AddDescr(DESCR$, nt$, DescrW)
      End If

      If (FCM$ = "009") And (warehousewc$ = "302") Then
         wc1$ = "   ": wc2$ = warehousewc$: wc3$ = "009": wc4$ = "   ": Machine$ = "SHEAR 10"
         GoSub AddAP
      Else
         wc1$ = "   ": wc2$ = warehousewc$: wc3$ = "007": wc4$ = "   ": Machine$ = "SHEAR 10"
         GoSub AddAP
      End If
      Call ds_add("SHEAR", "SCND")
   
   End If
   
'   OpCode% = OpCode% + 1
'   Descr$ = rpad$("SHEAR HELPER", DescrW)
'   wc1$ = "   ": wc2$ = warehousewc$: wc3$ = "010": wc4$ = "   ": Machine$ = " "
'   GoSub AddAP
   
   OpCode% = (OpCode% \ 10) + 1
   OpCode% = OpCode% * 10

   Call Shear2FILE

Return

DeBurrOut:
   If ((TypeDeburr$ = "OUTSIDE") Or (completedeburr% <> 0)) And (TypeDeburr$ <> "NONE") Then
      If InStr(TypeDeburr$, "OUTSIDE") <> 0 Then
         completedeburr% = 2
      End If

      Celltype$ = UCase$(currform![CellDeburrTypes])

      ctime! = 0: Rstd! = 0
      If (Left$(PMachine$, 3) = "L-2") Then 'took out (Left$(PMachine$, 2) = "T-") Or   "SG"
         wc2$ = "330"
         If (Left$(PMachine$, 3) = "L-2") Then
            wc2$ = "312"
         End If
      Else
         Select Case PMachine$
            Case "S4/Shear and Unload", "S4 and Unload"
               wc2$ = "365" 'WAS 302 SG
            Case "P4 and Unload", "S4/P4 and Unload", "S4/P4 Inline and Unl"
               wc2$ = "365"
            Case Else
               wc2$ = warehousewc$
         End Select
      End If
      wc1$ = "   ":  wc3$ = "016": wc4$ = "016": Machine$ = "DEBURR"
      If Multi$ = "MULTIPLE" Then
         If completedeburr% = 1 Then
            TOP_TRIM_CUT! = (currform![TopTrimCut])
            If TOP_TRIM_CUT! = 0 Then
               Select Case Celltype
                  Case "HAND DEBURR"
                     DESCR$ = rpad$("DEBURR EDGES w/ HAND GRINDER", DescrW)
                     Call Det_HandDeburr(hdb4!, Rstd!, 3)
                     Call ds_add("HANDDEBURR", "MEdg")
                  Case "TIME SAVER"
                     If Mt$ = "TIMESAVER" Then
                        DESCR$ = rpad$("DEBURR EDGES USING TIMESAVER", DescrW)
                        Call Det_TimeSaver_Labor(mts!, Rstd!, False, BadTs%)
                        Call ds_add("TIMESAVER", "SHRD")
                     Else
                        Call Det_Pedestal_Grinder_Standard(Actual_PartHeight, Actual_PartWidth, 2, Rstd!, 1!)      ' sidetype=2
                        DESCR$ = rpad$("DEBURR (1) EDGE w/ PEDESTAL GRINDER", DescrW)
                        Call ds_add("PEDESTAL", "1Edg")
                     End If
                  Case Else
                     Call Det_Pedestal_Grinder_Standard(Actual_PartHeight, Actual_PartWidth, 2, Rstd!, 1!)      ' sidetype=2
                     DESCR$ = rpad$("DEBURR (1) EDGE w/ PEDESTAL GRINDER", DescrW)
                     Call ds_add("PEDESTAL", "1Edg")
               End Select
           Else
               Select Case Celltype
                  Case "HAND DEBURR"
                     DESCR$ = rpad$("DEBURR EDGES w/ HAND GRINDER", DescrW)
                     Call Det_HandDeburr(hdb4!, Rstd!, 3)
                     Call ds_add("HANDDEBURR", "MEdg")
                  Case "TIME SAVER"
                     If Mt$ = "TIMESAVER" Then
                        DESCR$ = rpad$("DEBURR EDGES USING TIMESAVER", DescrW)
                        Call Det_TimeSaver_Labor(mts!, Rstd!, False, BadTs%)
                        Call ds_add("TIMESAVER", "SHRD")
                     Else
                        Call Det_Pedestal_Grinder_Standard(Actual_PartHeight, Actual_PartWidth, 4, Rstd!, 1!)      ' sidetype=22
                        DESCR$ = rpad$("DEBURR (2) EDGES w/ PEDESTAL GRINDER", DescrW)
                        Call ds_add("PEDESTAL", "2Edg")
                     End If
                  Case Else
                     Call Det_Pedestal_Grinder_Standard(Actual_PartHeight, Actual_PartWidth, 4, Rstd!, 1!)      ' sidetype=22
                     DESCR$ = rpad$("DEBURR (2) EDGES w/ PEDESTAL GRINDER", DescrW)
                     Call ds_add("PEDESTAL", "2Edg")
               End Select
            End If
         Else
               Select Case Celltype
                  Case "HAND DEBURR"
                     DESCR$ = rpad$("DEBURR EDGES w/ HAND GRINDER", DescrW)
                     Call Det_HandDeburr(hdb4!, Rstd!, 3)
                     Call ds_add("HANDDEBURR", "MEdg")
                  Case "TIME SAVER"
                     If Mt$ = "TIMESAVER" Then
                        DESCR$ = rpad$("DEBURR EDGES USING TIMESAVER", DescrW)
                        Call Det_TimeSaver_Labor(mts!, Rstd!, False, BadTs%)
                        Call ds_add("TIMESAVER", "SHRD")
                     Else
                        DESCR$ = rpad$("DEBURR EDGES w/ PEDESTAL GRINDER", DescrW)
                        Call Det_Pedestal_Grinder_Standard(Actual_PartHeight, Actual_PartWidth, 8, Rstd!, 1!)      ' sidetype=1122
                        Call ds_add("PEDESTAL", "4Edg")
                     End If
                  Case Else
                     DESCR$ = rpad$("DEBURR EDGES w/ PEDESTAL GRINDER", DescrW)
                     Call Det_Pedestal_Grinder_Standard(Actual_PartHeight, Actual_PartWidth, 8, Rstd!, 1!)      ' sidetype=1122
                     Call ds_add("PEDESTAL", "4Edg")
               End Select
         End If
      Else
         Select Case Celltype
            Case "HAND DEBURR"
               DESCR$ = rpad$("DEBURR EDGES w/ HAND GRINDER", DescrW)
               Call Det_HandDeburr(hdb4!, Rstd!, 3)
               Call ds_add("HANDDEBURR", "MEdg")
            Case "TIME SAVER"
               If Mt$ = "TIMESAVER" Then
                  DESCR$ = rpad$("DEBURR EDGES USING TIMESAVER", DescrW)
                  Call Det_TimeSaver_Labor(mts!, Rstd!, False, BadTs%)
                  Call ds_add("TIMESAVER", "SHRD")
               Else
                  DESCR$ = rpad$("DEBURR EDGES w/ PEDESTAL GRINDER", DescrW)
                  Call Det_Pedestal_Grinder_Standard(Actual_PartHeight, Actual_PartWidth, 8, Rstd!, 1!)      ' sidetype=1122
                  Call ds_add("PEDESTAL", "4Edg")
               End If
            Case Else
               DESCR$ = rpad$("DEBURR EDGES w/ PEDESTAL GRINDER", DescrW)
               Call Det_Pedestal_Grinder_Standard(Actual_PartHeight, Actual_PartWidth, 8, Rstd!, 1!)      ' sidetype=1122
               Call ds_add("PEDESTAL", "4Edg")
         End Select
      End If
      GoSub AddAP
      OpCode% = (OpCode% \ 10) + 1
      OpCode% = OpCode% * 10
   End If
Return

DeburrIn:
   db$ = ""
   If InStr(TypeDeburr$, "WITHIN") <> 0 Then
      db$ = " & DEBURR W/HAND GRINDER"
      If (InStr(MetalName$, "COLD ROLL") <> 0) Or (InStr(MetalName$, "S/S") <> 0) Then
         ' NOT aluminized
         db$ = db$ + " & AEM MACHINE"
      End If
   End If
   If db$ <> "" Then db$ = rpad$(db$, DescrW)
Return
PressBrake:
   If currform!PressBrake <> "1" Then
         
      PressBrkSet.FindFirst Criteria$                                       ' Find first occurrence.
      If Not (PressBrkSet.NoMatch) Then
         opc$ = itsaNull$(PressBrkSet!OpCode)
      End If
      PBDescr$ = "FORM_"
      PBG1 = 0
      totalhits = 0
      PrbrkOps = 0
      
      Do Until PressBrkSet.NoMatch                                          ' Loop until no matching records.
         Op$ = itsaNull$(PressBrkSet!OpCode)
         If Op$ <> "" Then
            angl$ = Trim$(UCase$(PressBrkSet!Angle))
            AnglC$ = Left$(angl$, 1)
            AnglR$ = Mid$(angl$, 2)
            AnglR$ = Trim$(Str$(Val(AnglR$)))
            Commnt$ = itsaNull$(PressBrkSet!comment)
            If Len(Commnt$) <> 0 Then
               Commnt$ = " " + Commnt$
            End If
             
            If Op$ = opc$ Then
               PBG1 = 1
            Else
            PrbrkOps = PrbrkOps + 1
               GoSub MakePressBrk
               opc$ = Op$
               PBG1 = 1
            End If
            totalhits = totalhits + PressBrkSet!hits
   
            Select Case AnglC$
               Case "S"                                   'spank
                  dd$ = "(" + Trim$(Str$(PressBrkSet!Breaks)) + ") SPANK TO " + AnglR$ + " DEGS" + Commnt$ + "~~~"
                  Call AddDescr(PBDescr$, dd$, DescrW)
               Case "O"                                   'offset
                  dd$ = "(" + Trim$(Str$(PressBrkSet!Breaks)) + ") " + AnglR$ + Chr$(34) + " OFFSET" + Commnt$ + "~~~"
                  Call AddDescr(PBDescr$, dd$, DescrW)
               Case "R"                                   'radius
                  dd$ = "(" + Trim$(Str$(PressBrkSet!Breaks)) + ") " + AnglR$ + Chr$(34) + " RADIUS" + Commnt$ + "~~~"
                  Call AddDescr(PBDescr$, dd$, DescrW)
               Case "F"                                   'form
                  If Len(angl$) = 1 Then
                     dd$ = "(" + Trim$(Str$(PressBrkSet!Breaks)) + ") " + Commnt$ + "~~~"
                     Call AddDescr(PBDescr$, dd$, DescrW)
                  Else
                     dd$ = "(" + Trim$(Str$(PressBrkSet!Breaks)) + ") @ " + AnglR$ + " DEGS" + Commnt$ + "~~~"
                     Call AddDescr(PBDescr$, dd$, DescrW)
                  End If
               Case "D"                                   'die setup
                  dd$ = AnglR$ + " DIE SETUP" + Commnt$ + "\\\"
                  Call AddDescr(PBDescr$, dd$, DescrW)
               Case "C"                                   'comment
                  dd$ = "(" + Trim$(Commnt$) + ")\\\"
                  Call AddDescr(PBDescr$, dd$, DescrW)
            End Select
         End If
         PressBrkSet.FindNext Criteria$                                    ' Find next occurrence.
      Loop                                                                ' End of loop.
   
      If PBG1 = 1 Then
         PrbrkOps = PrbrkOps + 1
         GoSub MakePressBrk
      End If
   End If
Return

MakePressBrk:
   cnt = 0: b = 0: A = 0
   Do While InStr(PBDescr$, "~~~") <> 0
      b = A
      A = InStr(PBDescr$, "~~~")
      Mid$(PBDescr$, A, 3) = ",  "
      cnt = cnt + 1
   Loop
   If cnt > 0 Then
      If b <> 0 Then
         Mid$(PBDescr$, A, 3) = " / "
         Mid$(PBDescr$, b, 3) = " & "
      Else
         Mid$(PBDescr$, A, 3) = " & "
      End If
      If cnt = 1 Then
         Mid$(PBDescr$, A, 3) = " / "
      End If
   End If
      
   dd$ = "(" + LTrim$(Str$(totalhits)) + "_TOTAL_HITS)"
   Call AddDescr(PBDescr$, dd$, DescrW)
   
   Do While InStr(PBDescr$, "\\\") <> 0
      A = InStr(PBDescr$, "\\\")
      Mid$(PBDescr$, A, 3) = " / "
      cnt = cnt + 1
   Loop

   

   DESCR$ = RTrim$(PBDescr$)
   wc1$ = "   "
   ctime! = 0
   
    

   Call DET_PressBrake_Standard(Rstd!, totalhits, wc2$, wc3$, wc4$, Machine$)
   
   'If there is a seperate operation on routing for panel bender it changes the work center to a regular pressbrake. SG 5/3/2024
   If Machine$ = "Trumpf 7020 PB" And PrbrkOps > 1 Then
        wc2$ = "302"
        wc3$ = "060"
        wc4$ = "235"
        Machine$ = "Trumpf 5130 #28"
   End If
   
   GoSub AddAP
   OpCode% = (OpCode% \ 10) + 1
   OpCode% = OpCode% * 10
   
   totalhits = 0
   PBDescr$ = "FORM_"
   PBG1 = 0

Return
PemPress:
   If currform!Pems = True Then
      ctime! = 0
      Rstd! = 0
      
      PemPressSet.FindFirst Criteria$                                       ' Find first occurrence.
      Do Until PemPressSet.NoMatch                                          ' Loop until no matching records.
         Op$ = itsaNull$(PemPressSet!OpCode)
         hits$ = itsaNull$(PemPressSet!hits)
         Pemn$ = itsaNull$(PemPressSet!PemNumber)
         StudS$ = itsaNull$(PemPressSet!Studsize)
         AnvilS$ = itsaNull$(PemPressSet!Anvil)
         PunchS$ = itsaNull$(PemPressSet!Punch)
         Machine$ = UCase$(itsaNull$(PemPressSet!AutoManual))
         wc1$ = "   "
         wc2$ = itsaNull$(PemPressSet!wc2)
         wc3$ = itsaNull$(PemPressSet!wc3)
         wc4$ = itsaNull$(PemPressSet!wc4)
         
         DESCR$ = "INSTALL (" + hits$ + ") " + Pemn$ + " USING " + PunchS$ + " PUNCH  AND " + AnvilS$ + " ANVIL PER DRAWING"

         ctime! = 0
         hitd = Val(hits$)
         Gw! = Gw!
         Call DET_PEM_Standard(Rstd!, hitd, wc2$, wc3$, wc4$, Machine$)
   
         GoSub AddAP
         OpCode% = (OpCode% \ 10) + 1
         OpCode% = OpCode% * 10
         
         PemPressSet.FindNext Criteria$                                    ' Find next occurrence.
      Loop                                                                ' End of loop.
   End If
Return

PunchPress:
   ctime! = 0
   Rstd! = 0
   Punch$ = currform!PunchNumber
   Crit$ = "Die Number = " + Punch$
   PunchPressSet.Seek "=", Punch$                              ' Find first occurrence.
   If (Not (PunchPressSet.NoMatch)) And (Not (PunchPressSet.EOF)) And (Punch$ <> "!NONE!") Then
      
      If IsNull(PunchPressSet!Location) Then
         PUNCHLOC$ = " "
      Else
         PUNCHLOC$ = PunchPressSet!Location
      End If
      
      If IsNull(PunchPressSet!Machine) Then
         PunchMach$ = " "
      Else
         PunchMach$ = PunchPressSet!Machine
      End If
      
      If IsNull(PunchPressSet![Safety Device]) Then
         PunchSafe$ = " "
      Else
         PunchSafe$ = PunchPressSet![Safety Device]
      End If
      
      If IsNull(PunchPressSet!comment) Then
         PunchCmnt$ = " "
      Else
         PunchCmnt$ = PunchPressSet!comment
      End If
      
      If PunchPressSet![Forming Die] Then
         DESCR$ = rpad$("NOTCH, PIERCE, & FORM COMPLETE_", DescrW)
      Else
         DESCR$ = rpad$("NOTCH & PIERCE COMPLETE_", DescrW)
      End If
      
      If PunchPressSet![Changeover Die] Then
         ChangeOver$ = "/(NOTE: VERIFY DIE IS SET FOR PART)/"
      Else
         ChangeOver$ = ""
      End If
      
      If (currform!CutType = "No CNC") And (Parts_per_strip! > 1) Then
         dd$ = "(" + Trim$(Str$(Parts_per_strip!)) + " PARTS/STRIP)"
         Call AddDescr(DESCR$, dd$, DescrW)
      End If
      '
      '
      '
      dd$ = " DIE #: " + Trim$(Punch$) + " /LOCATION:" + Trim$(PUNCHLOC$)
      Call AddDescr(DESCR$, dd$, DescrW)
      dd$ = "/" + Trim$(PunchMach$) + " /" + Trim$(PunchSafe$)
      Call AddDescr(DESCR$, dd$, DescrW)
      dd$ = ChangeOver$
      Call AddDescr(DESCR$, dd$, DescrW)
      dd$ = PunchCmnt$
      Call AddDescr(DESCR$, dd$, DescrW)
      Rstd! = ItsAZero!(currform!PunchStd)
    '  Call Det_PunchPress(Rstd!, CTime!, R$)
      If Left$(PunchMach$, 3) <> "150" Then
         wc1$ = "   ": wc2$ = warehousewc$: wc3$ = "006": wc4$ = "006": Machine$ = PunchMach$
      Else
         wc1$ = "   ": wc2$ = warehousewc$: wc3$ = "005": wc4$ = "005": Machine$ = PunchMach$
      End If
   
      GoSub AddAP
      OpCode% = (OpCode% \ 10) + 1
      OpCode% = OpCode% * 10
      
   End If

      
Return

CheckTheDeburrStuff:
'
' This routine sets up the dbtype array with 1's and 0's depending on whether or not the celltypedeburr
' should be calculated or not.
'
   '
   ' if single then
   '    2,11,12
   '    done
   ' endif
   '
   ' if top<>bot then           trim cut
   '    only 1 & 15
   '    done
   ' endif
   '
   ' if (top<>2) and (top<>2.25) then
   '    only 1 & 15
   '    done
   ' endif
   '
   ' if >=5 and (S/S or C/R) then
   '    1,3-10,13-16
   ' else
   '    1,3-9,13-14
   ' endif
   ' done
   '
   '
   ' CNC time
   '
   ' calc shear
   '
   ' calc Mult Hnd DB
   '
   ' calc timesaver
   '
   ' calc hand db1
   ' calc hand db2
   ' calc hand db4
   '
   ' calc pdstl db1
   ' calc pdstl db2
   ' calc pdstl db4
   '
   '

'
'   Init the dbtype table to zeros
'
   For i = 1 To 16
      dbtype!(i, 0) = 0
   Next
'
'
'  Determine if the timesaver can be used to deburr.
'
'
   SecondShear = True
   If ((TOP_TRIM_CUT! = 0) Or (TOP_TRIM_CUT! = Bottom_Trim_Cut!)) And ((Bottom_Trim_Cut! = 2) Or (Bottom_Trim_Cut! = 2.25)) Then
      SecondShear = False
   End If

   If (InStr(MetalName$, "COLD ROLL") <> 0) Or (InStr(MetalName$, "S/S") <> 0) Then
      ' NOT aluminized
      If ((currform!ActualPartHeight < 5) And (currform!ActualPartWidth < 5)) Then
         ' too small for timesaver
         Mt$ = "NO TIMESAVER"
      Else
         Mt$ = "TIMESAVER"
      End If
   Else
      Mt$ = "NO TIMESAVER"
   End If



'
'
'  Obtain the Primary Machine name.
'
'
   PrimeType$ = Left$(PMachine$, 3)
'
'
'  Single Part Deciphering
'
'
   If (Multi$ = "SINGLE") Or (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
      If InStr(MachinesWithShears$, PrimeType$) <> 0 Then
         dbtype!(2, 0) = 1
         dbtype!(11, 0) = 1
         dbtype!(12, 0) = 1
      Else
         dbtype!(2, 0) = 1
         dbtype!(11, 0) = 1
      End If
      If (InStr(TypeDeburr$, "OUTSIDE") <> 0) Or (InStr(TypeDeburr$, "NONE") <> 0) Then
         dbtype!(2, 0) = 0
         dbtype!(11, 0) = 0
         dbtype!(12, 0) = 0
      End If
'
'
'  Multiple and Laser Part Deciphering
'
'
   Else
      If InStr(MachinesWithShears$, PrimeType$) <> 0 Then
         If Actual_PartHeight < 1.75 Then       ' Minimum part length for CNC shear
            SecondShear = True
            dbtype!(1, 0) = 1
            dbtype!(15, 0) = 1
         Else
            dbtype!(1, 0) = 1
            dbtype!(3, 0) = 1
            dbtype!(4, 0) = 1
            dbtype!(5, 0) = 1
            dbtype!(6, 0) = 1
            dbtype!(8, 0) = 1
            dbtype!(9, 0) = 1
            dbtype!(10, 0) = 1
            dbtype!(13, 0) = 1
            dbtype!(14, 0) = 1
            dbtype!(16, 0) = 1
            dbtype!(15, 0) = 1
            If TOP_TRIM_CUT! > 0 Then
               dbtype!(3, 0) = 0
               dbtype!(5, 0) = 0
            End If
         End If
            
      ElseIf InStr("C-2C-6C-8C-9", PrimeType$) <> 0 Then
         SecondShear = True
         dbtype!(1, 0) = 1
         dbtype!(15, 0) = 1
      Else
         dbtype!(1, 0) = 1
      End If
      If (InStr(TypeDeburr$, "OUTSIDE") <> 0) Or (InStr(TypeDeburr$, "NONE") <> 0) Then
         For outsid = 1 To 16                           ' if the operator said OUTSIDE or NONE then none of the options are
            If outsid <> 14 Then                        ' valid except the shear only option #14
               dbtype!(outsid, 0) = 0                   'it could be sheared
            End If
         Next
      End If

   End If

'
'
'  Exclude all parts timesaver deburrs, if necessary.
'
'
   If Mt$ = "NO TIMESAVER" Then
      dbtype!(2, 0) = 0
      dbtype!(7, 0) = 0
      dbtype!(10, 0) = 0
      dbtype!(15, 0) = 0
      dbtype!(16, 0) = 0
   End If
'
'
'  Exclude invalid trim cuts for shear operations.
'
'
   If (InStr(MachinesWithShears$, PrimeType$) <> 0) And (Multi$ = "MULTIPLE") Then
      If TOP_TRIM_CUT! <> 0 Then
         If (TOP_TRIM_CUT! <> Bottom_Trim_Cut!) Or ((TOP_TRIM_CUT! <> 2) And (TOP_TRIM_CUT! <> 2.25)) Then
            For i = 2 To 14
               dbtype!(i, 0) = 0
            Next
            dbtype!(16, 0) = 0
         End If
      Else
         If ((Bottom_Trim_Cut! <> 2) And (Bottom_Trim_Cut! <> 2.25)) Then
            For i = 2 To 14
               dbtype!(i, 0) = 0
            Next
            dbtype!(16, 0) = 0
         End If
      End If
   End If

   Celltype$ = UCase$(currform![CellDeburrTypes])
'
'
'  Exclude operations that manual selection has indicated
'
'
   Select Case Celltype$
      Case "HAND DEBURR"
         dbtype!(2, 0) = 0
         dbtype!(5, 0) = 0
         dbtype!(6, 0) = 0
         dbtype!(7, 0) = 0
         dbtype!(9, 0) = 0
         dbtype!(10, 0) = 0
         dbtype!(12, 0) = 0
         dbtype!(15, 0) = 0
         dbtype!(16, 0) = 0
      
      Case "PEDESTAL"
         dbtype!(1, 0) = 0
         dbtype!(2, 0) = 0
         dbtype!(3, 0) = 0
         dbtype!(4, 0) = 0
         dbtype!(5, 0) = 0
         dbtype!(6, 0) = 0
         dbtype!(7, 0) = 0
         dbtype!(8, 0) = 0
         dbtype!(10, 0) = 0
         dbtype!(11, 0) = 0
         dbtype!(13, 0) = 0
         dbtype!(15, 0) = 0
         dbtype!(16, 0) = 0

      Case "TIME SAVER"
         dbtype!(1, 0) = 0
         dbtype!(3, 0) = 0
         dbtype!(4, 0) = 0
         dbtype!(5, 0) = 0
         dbtype!(6, 0) = 0
         dbtype!(7, 0) = 0
         dbtype!(8, 0) = 0
         dbtype!(9, 0) = 0
         dbtype!(11, 0) = 0
         dbtype!(12, 0) = 0
         dbtype!(13, 0) = 0

      Case Else
   End Select
   Call Det_Deburr_Run_Times(CNCTime!, DbSel%, completedeburr%)
'   SecondShear = True
'   If (TOP_TRIM_CUT! = 0 Or TOP_TRIM_CUT! = 2 Or TOP_TRIM_CUT! = 2.25) And (Bottom_TRIM_CUT! = 2 Or Bottom_TRIM_CUT! = 2.25) Then
'      SecondShear = False
'   End If

   'If ((DbSel% > 2) And (DbSel% < 11)) Or (DbSel% = 13) Or (DbSel% = 14) Or (DbSel% = 16) Then
   
   Call CNC_Verbage(DbSel%, vb$)
      
Return

End Sub

Sub NewGrain()
   If currform!GrDirOpt = 1 Then
      currform!GrainDir = "Along First Dimension"
   End If
   If currform!GrDirOpt = 2 Then
      currform!GrainDir = "Along Second Dimension"
   End If
   If currform!GrDirOpt = 3 Then
      currform!GrainDir = "No Grain Direction"
   End If
End Sub

Sub OpenMainFiles()
   
'AddnlQ1
 '  currform!txtCalcStat.visible = True
 '  currform!txtCalcStat.caption = "Open - Opening StAddnlQDB": DoEvents
 '  Set StAddnlQDB = DBEngine.Workspaces(0).Databases(0)
 '  Set StAddnlQSet = StAddnlQDB.OpenRecordset("AddnlQ1", DB_OPEN_DynaSet)

'AddnlQ2
 '  currform!txtCalcStat.caption = "Open - Opening StAddnlQDB2": DoEvents
 '  Set StAddnlQDB2 = StAddnlQDB
 '  Set StAddnlQSet2 = StAddnlQSet
 '
'AddnlPROC
 '  currform!txtCalcStat.caption = "Open - Opening StAddnlDB": DoEvents
 '  Set StAddnlDB = DBEngine.Workspaces(0).Databases(0)
 '  Set StAddnlSet = StAddnlQDB.OpenRecordset("AddnlPROC", DB_OPEN_Table)
 '
'MachineNames
'   currform!txtCalcStat.caption = "Open - Opening StMachNamesDB": DoEvents
'   Set StMachNamesDB = DBEngine.Workspaces(0).Databases(0)
'   Set StMachNamesSet = StMachNamesDB.OpenRecordset("MachineNames", DB_OPEN_Table)
'
'Machines
'   currform!txtCalcStat.caption = "Open - Opening StMachQDB": DoEvents
'   Set StMachQDB = DBEngine.Workspaces(0).Databases(0)
'   Set StMachQSet = StMachQDB.OpenRecordset("Machines", DB_OPEN_Table)
'
'MachinesQ2
'   currform!txtCalcStat.caption = "Open - Opening StMachQ2DB": DoEvents
'   Set StMachQ2DB = DBEngine.Workspaces(0).Databases(0)
'   Set StMachQ2Set = StMachQ2DB.OpenRecordset("Machines", DB_OPEN_DynaSet)
'
''Process
 '  currform!txtCalcStat.caption = "Open - Opening StMainDB": DoEvents
 '  Set StMainDB = DBEngine.Workspaces(0).Databases(0)
'   Set StMainSet = StMainDB.OpenRecordset("Process", DB_OPEN_Table)
'
''Process2
'   currform!txtCalcStat.caption = "Open - Opening StMain2DB": DoEvents
'   Set StMain2DB = StMainDB
'   Set StMain2Set = StMainSet
'
''PressTab
'   currform!txtCalcStat.caption = "Open - Opening StPressTab": DoEvents
'   Set StPressTab = DBEngine.Workspaces(0).Databases(0)
'   Set StPressTabSet = StPressTab.OpenRecordset("PressBrakes", DB_OPEN_Table)
'
''DataSheet
'   currform!txtCalcStat.caption = "Open - Opening StDataShDB": DoEvents
'   Set StDataShDB = DBEngine.Workspaces(0).Databases(0)
'   Set StDataShSet = StDataShDB.OpenRecordset("DataSheetQ1", DB_OPEN_DynaSet)
'
''PressBrake
'   currform!txtCalcStat.caption = "Open - Opening StPressBrk": DoEvents
'   Set StPressBrk = DBEngine.Workspaces(0).Databases(0)
'   Set StPressBrkSet = StPressBrk.OpenRecordset("PressBrakeQ1", DB_OPEN_DynaSet)
'
''PunchPress
'   currform!txtCalcStat.caption = "Open - Opening StPunchPress": DoEvents
'   Set StPunchPress = DBEngine.Workspaces(0).Databases(0)
'   Set StPunchPressSet = StPunchPress.OpenRecordset("PunchPress", DB_OPEN_Table)
'
'''PressBrakeOps
 '  currform!txtCalcStat.caption = "Open - Opening StPressOps": DoEvents
  ' Set StPressOps = DBEngine.Workspaces(0).Databases(0)
  ' Set StPressOpsSet = StPressOps.OpenRecordset("PressBrakeOps", DB_OPEN_Table)
  '
  ' currform!txtCalcStat.visible = False
'
End Sub

Function Opps$(OpCode%)
   Opps$ = Right$("      " + Str$(OpCode%), 4)
End Function

Sub PBFormView()
   PartN$ = currform![PartNumber]
   Set MachQDB = DBEngine.Workspaces(0).Databases(0)
   Set MachQSet = MachQDB.OpenRecordset("MachinesQ1", DB_OPEN_DYNASET)  ' Create dynaset.
   Criteria$ = "PartNumber = '" + PartN$ + "'"                         ' Set search criteria.
   PMachine$ = ""
   MachQSet.FindFirst Criteria$                                       ' Find first occurrence.
   FL$ = Trim$(UCase$(itsaNull(currform!PressBrake)))
   currform!txtPrime = ""
   PMachine$ = ""
   Do Until MachQSet.NoMatch                                          ' Loop until no matching records.
      If MachQSet!Prime = True Then
         PMachine$ = MachQSet!MachineName
         Exit Do
      End If
      MachQSet.FindNext Criteria$                                    ' Find next occurrence.
      DoEvents
   Loop
   currform!txtPrime = PMachine$
   currform!PressBrake.Requery
   Select Case FL$
      Case "1"
         currform!PressBrakeSubForm.Visible = False
      Case Else
         currform!PressBrakeSubForm.Visible = True
         

   End Select

End Sub
Sub PemPressView()
   FL$ = Trim$(UCase$(currform!Pems))
   Select Case FL$
      Case "-1"
         currform![PemPress Ops subform].Visible = True
         currform![lblPemBefore].Visible = True
         currform![PemBefore].Visible = True
      Case Else
         currform![PemPress Ops subform].Visible = False
         currform![lblPemBefore].Visible = False
         currform![PemBefore].Visible = False
   End Select

End Sub

Sub PunchPressOptions()
   If IsNull(currform!PunchDie) Then currform!PunchDie = "!NONE!"
   If Trim$(currform!PunchDie) = "" Then currform!PunchDie = "!NONE!"
   If (currform!CutType = "Multiple") Or (currform!CutType = "Laser") Or (currform!CutType = "Salvagnini") Or (currform!CutType = "Laser/Shear") Or (currform!CutType = "Slug") Then
      currform!PunchPressOption.Visible = False
      currform!PunchDie.Visible = False
      currform!PunchCount.Visible = False
      currform!PunchStd.Visible = False
   Else
      currform!PunchDie.Visible = True
      If (currform!CutType = "Single") Then
         currform!PunchOpt1.Caption = "Before CNC"
         currform!PunchOpt2.Caption = "After CNC"
         currform!PunchCount.Visible = False
         currform!PunchStd.Visible = True
      Else
         currform!PunchOpt1.Caption = "Single"
         currform!PunchOpt2.Caption = "Strip"
         If currform!PunchPressOption = 2 Then
            currform!PunchCount.Visible = True
            currform!PunchStd.Visible = True
         Else
            currform!PunchCount.Visible = True
            currform!PunchStd.Visible = True
         End If
      End If
      If currform!PunchDie = "!NONE!" Then
         currform!PunchPressOption.Visible = False
         currform!PunchCount.Visible = False
         currform!PunchStd.Visible = False
      Else
         currform!PunchPressOption.Visible = True
      End If
   End If
   If IsNull(currform!PunchPressOption) Then currform!PunchPressOption = 1
   If currform!PunchPressOption = 0 Then currform!PunchPressOption = 1
   If currform!PunchDie = "!NONE!" Then currform!PunchPressOption = 1

End Sub

Sub PurgeCNCs()
   If Not OutPutData% Then
      Exit Sub
   End If

   Dim MainDB As Database, MainSet As Recordset
   Dim MachNamesDB As Database, MachNamesSet As Recordset
   Dim MachQDB As Database, MachQSet As Recordset
   
   Set MainDB = DBEngine.Workspaces(0).Databases(0)
   Set MachNamesDB = DBEngine.Workspaces(0).Databases(0)
   Set MachQDB = DBEngine.Workspaces(0).Databases(0)

   
   Set MachNamesSet = MachNamesDB.OpenRecordset("MachineNames", DB_OPEN_TABLE)   ' Create dynaset.
   Set MachQSet = MachQDB.OpenRecordset("Machines", DB_OPEN_TABLE)   ' Create dynaset.
   Set MainSet = MainDB.OpenRecordset("Process", DB_OPEN_TABLE)   ' Create dynaset.
   
   PartN$ = currform![PartNumber]
   MainSet.Index = "PrimaryKey"
   MachQSet.MoveFirst
   MachQSet.Index = "PartNumber"
   MachQSet.Seek ">=", PartN$
         
   If Not (MachQSet.NoMatch) Then
      Do While Trim$(MachQSet!PartNumber) = PartN$
         A$ = MachQSet!Tool
         If (A$ = "***") Then
            MachQSet.Delete
         End If
         MachQSet.MoveNext
         If (MachQSet.EOF) Then Exit Do
      Loop
   End If
   currform.Refresh
End Sub
Public Function ShearsName() As String
   shearsdotpath$ = "C:\Files\Shears.pth"
   If Not Exists(shearsdotpath) Then
      shearsdotpath = "C:\Shears.pth"
      If Not Exists(shearsdotpath) Then
         shearsdotpath = ""
      End If
   End If
   ShearsName = shearsdotpath
End Function

Function ReadInits()
   On Error GoTo ErrorRead
   Open ShearsName For Input As #1
      Line Input #1, i$: Sheet1path$ = Trim$(i$)
      Line Input #1, i$: Sheet2path$ = Trim$(i$)
      Line Input #1, i$: Initforms$ = Trim$(i$)
      Line Input #1, i$: Directory$ = Trim$(i$)
      Line Input #1, i$: usrID$ = Trim$(i$)
   Close #1
   If Right$(Directory, 1) <> "\" Then
      Directory$ = Directory$ + "\"
   End If
   If Left$(Initforms$, 2) = "14" Then
      DocName$ = "14" + Chr$(34) + " Process Sheet"
   Else
      DocName$ = "Process Sheet"
   End If
   PrimaryScreen$ = DocName$
   'Put the configuation inside the database Leaving the As400 User in the Shears.Pth file. 1/11/2019 SG
    Set dbConfTableWA = DBEngine.Workspaces(0).Databases(0)
    Set rsConfTablewa = dbConfTableWA.OpenRecordset("ConfigurationTable")

    rsConfTablewa.MoveFirst
    Do While Not (rsConfTablewa.EOF)
        If rsConfTablewa!VarName = "Sheet1Path" Then Sheet1path$ = rsConfTablewa!VarValue
        If rsConfTablewa!VarName = "Sheet2Path" Then Sheet2path$ = rsConfTablewa!VarValue
        If rsConfTablewa!VarName = "Directory" Then Directory$ = rsConfTablewa!VarValue

        rsConfTablewa.MoveNext
    Loop
   
   
Exit Function

ErrorRead:
   i$ = ""
Resume Next
End Function




Sub RefreshFromPhantom(NewPart$, Oldpart$)
   ' NewPart$ = Make Part
   ' OldPart$ = Phantom Part
   '
   '  to refresh from a Phantom the folllowing steps must occur.
   '
   '    1)  Delete all Generated records from the Make part.
   '
   '    2)  copy in all records from the Phantom and mark them as Generated
   '
   '
   '
   '
   '
   '

   Dim MainDB As Database, MainSet As Recordset
   Dim Main2DB As Database, Main2Set As Recordset
   Dim MachNamesDB As Database, MachNamesSet As Recordset
   Dim MachQDB As Database, MachQSet As Recordset
   Dim AddnlQDB As Database, AddnlQSet As Recordset

   Dim MainTableDef As TableDef

   Set MainDB = DBEngine.Workspaces(0).Databases(0)
   Set Main2DB = DBEngine.Workspaces(0).Databases(0)
   Set MachNamesDB = DBEngine.Workspaces(0).Databases(0)
   Set MachQDB = DBEngine.Workspaces(0).Databases(0)
   Set AddnlQDB = DBEngine.Workspaces(0).Databases(0)
   
   Set AddnlQSet = AddnlQDB.OpenRecordset("AddnlProc", DB_OPEN_DYNASET)

   ErrM$ = " "
   GoSub XOpen_Mains

   Set MachNamesSet = MachNamesDB.OpenRecordset("MachineNames", DB_OPEN_TABLE)
   Set MachQSet = MachQDB.OpenRecordset("Machines", DB_OPEN_TABLE)
'   Set MachNamesSet = StMachNamesSet
'   Set MachQSet = StMachQSet
   
   If (Trim$(Oldpart$) <> "") And (Trim$(NewPart$) <> "") Then
      PartN$ = NewPart$
      If PartN$ <> "" Then
         If Oldpart$ <> PartN$ Then

            
            Main2Set.Seek "=", PartN$
            MainSet.Seek "=", Oldpart$

            Main2Set.Edit
            For i = 0 To MainSet.Fields.Count - 1
               fld$ = MainSet.Fields(i).name
               If (fld$ <> "PartNo") And (fld$ <> "PartNumber") And (fld$ <> "Phantom") Then
                  Main2Set.Fields(i) = MainSet.Fields(i)
               End If

            Next i
            Main2Set.Update

            GoSub XOPEN_Addnl

            MainSet.MoveFirst
            MainSet.Seek ">=", PartN$
            If Not (MainSet.NoMatch) Then
               Do While Trim$(MainSet!PartNumber) = PartN$
                  g% = MainSet!Generated                                ' Get Generation flag.
                  If g% = True Then                                       ' if this is a generated record the delete it
                     MainSet.Delete
                  End If
                  MainSet.MoveNext
                  If (MainSet.EOF) Then Exit Do
               Loop
            End If


            MainSet.MoveFirst
            MainSet.Seek ">=", Oldpart$

            If Not (MainSet.NoMatch) Then
            
               Do While Trim$(MainSet!PartNumber) = Oldpart$
                  Main2Set.AddNew
                  For i = 0 To MainSet.Fields.Count - 1
                     If MainSet.Fields(i).name = "PartNo" Then
                        Main2Set.Fields(i) = Oldpart$
                     Else
                        Main2Set.Fields(i) = MainSet.Fields(i)
                     End If
                     If MainSet.Fields(i).name = "Generated" Then
                        Main2Set.Fields(i) = True
                     End If
                  Next i
                  Main2Set!PartNumber = PartN$
                  Main2Set.Update
                  MainSet.MoveNext
                  If MainSet.EOF Then Exit Do
               Loop

            End If
            
            GoSub XOPEN_Machs
            MainSet.MoveFirst
            
            MainSet.Seek ">=", Oldpart$
            If Not (MainSet.NoMatch) Then
               Do While Trim$(MainSet!PartNumber) = Oldpart$
                  Main2Set.AddNew
                  For i = 0 To MainSet.Fields.Count - 1
                     If MainSet.Fields(i).name = "PartNo" Then
                        Main2Set.Fields(i) = Oldpart$
                     Else
                        Main2Set.Fields(i) = MainSet.Fields(i)
                     End If
                  Next i
                  Main2Set!PartNumber = PartN$
                  Main2Set.Update
                  MainSet.MoveNext
                  If MainSet.EOF Then Exit Do
               Loop
            End If
            GoSub XOPEN_Press
            MainSet.MoveFirst
            
            MainSet.Seek ">=", Oldpart$
            
            If Not (MainSet.NoMatch) Then
               Do While Trim$(MainSet!PartNumber) = Oldpart$
                  Main2Set.AddNew
                  For i = 0 To MainSet.Fields.Count - 1
                     If MainSet.Fields(i).name = "PartNo" Then
                        Main2Set.Fields(i) = Oldpart$
                     Else
                        Main2Set.Fields(i) = MainSet.Fields(i)
                     End If
                  Next i
                  Main2Set!PartNumber = PartN$
                  Main2Set.Update
                  MainSet.MoveNext
                  If MainSet.EOF Then Exit Do
               Loop
            End If
            
            GoSub XOpen_Mains
            
         End If
      End If
   End If
   ErrM$ = "Part " + PartN$ + " added"
Exit Sub

XOpen_Mains:
   Set MainSet = MainDB.OpenRecordset("Process", DB_OPEN_TABLE)   ' Create dynaset.
   Set Main2Set = Main2DB.OpenRecordset("Process", DB_OPEN_TABLE)   ' Create dynaset.
'   Set mainset = StMainSet
'   Set main2Set = StMainSet
   MainSet.Index = "PrimaryKey"
   Main2Set.Index = "PrimaryKey"
Return

XOPEN_Addnl:
   Set MainSet = MainDB.OpenRecordset("AddnlProc", DB_OPEN_TABLE)   ' Create dynaset.
   Set Main2Set = Main2DB.OpenRecordset("AddnlProc", DB_OPEN_TABLE)   ' Create dynaset.
'   Set mainset = StAddnlSet
'   Set main2Set = StAddnlSet
   MainSet.Index = "PartNumber"
   Main2Set.Index = "PartNumber"
Return

XOPEN_Machs:
   Set MainSet = MainDB.OpenRecordset("Machines", DB_OPEN_TABLE)   ' Create dynaset.
   Set Main2Set = Main2DB.OpenRecordset("Machines", DB_OPEN_TABLE)   ' Create dynaset.
'   Set mainset = StMachQSet
'   Set main2Set = StMachQSet
   MainSet.Index = "PartNumber"
   Main2Set.Index = "PartNumber"
'''   Refresh
Return

XOPEN_Press:
   Set MainSet = MainDB.OpenRecordset("PressBrakeOPs", DB_OPEN_TABLE)   ' Create dynaset.
   Set Main2Set = Main2DB.OpenRecordset("PressBrakeOPs", DB_OPEN_TABLE)   ' Create dynaset.
'   Set mainset = StPressOpsSet
'   Set main2Set = StPressOpsSet
   MainSet.Index = "PartNumber"
   Main2Set.Index = "PartNumber"
   ''''CurrForm.Refresh
Return

Purge_GeneratedRecords:
   AddnlQSet.FindFirst Criteria$                                       ' Find first occurrence.
   Do Until AddnlQSet.NoMatch                                          ' Loop until no matching records.
       Generated% = AddnlQSet!Generated                                ' Get Generation flag.
       s$ = AddnlQSet!PartNumber
       If Generated% = True Then                                       ' if this is a generated record the delete it
          AddnlQSet.Delete                                             ' Delete it.
       End If
       AddnlQSet.FindNext Criteria$                                    ' Find next occurrence.
   Loop                                                                ' End of loop.
Return
   



XDUPLICATE_rec:
   ErrM$ = "Duplicate record - " + PartN$
   ef = 1
Resume Next

   

End Sub

Sub renumber()
Dim AddnlQDB As Database, AddnlQSet As Recordset
Dim AddnlDB As Database, AddnlSet As Recordset
Dim MachQDB As Database, MachQSet As Recordset
Dim AddnlQDB2 As Database, AddnlQSet2 As Recordset, Hopc!
Static insertOp%(50)


'   Set AddnlDB = DBEngine.Workspaces(0).Databases(0)
'   Set AddnlSet = AddnlQDB.OpenRecordset("AddnlPROC", DB_OPEN_Table)   ' Create dynaset.




InsertOpNo% = 0
PartN$ = currform![PartNumber]
currform!txtCalcStat.Caption = "Renumbering process sheet"
DoEvents
Criteria$ = "PartNumber = '" + PartN$ + "'"                         ' Set search criteria.
Cr$ = Criteria$
currform!txtCalcStat.Caption = "RN - Opening AddnlQ1"
DoEvents
Set AddnlQDB = DBEngine.Workspaces(0).Databases(0)
Set AddnlQSet = AddnlQDB.OpenRecordset("AddnlQ1", DB_OPEN_DYNASET)  ' Create dynaset.
currform!txtCalcStat.Caption = "RN - Opening AddnlQ1 again"
DoEvents
Set AddnlQSet2 = AddnlQDB.OpenRecordset("AddnlQ1", DB_OPEN_DYNASET)  ' Create dynaset.
currform!txtCalcStat.Caption = "RN - Opening AddnlPROC"
DoEvents
Set AddnlDB = DBEngine.Workspaces(0).Databases(0)
Set AddnlSet = AddnlQDB.OpenRecordset("AddnlPROC", DB_OPEN_TABLE)

AddnlQSet.FindFirst Criteria$                                       ' Find first occurrence.
Hopc = 0
currform!txtCalcStat.Caption = "Renumbering process sheet"
DoEvents
Do Until AddnlQSet.NoMatch                                          ' Loop until no matching records.
    Generated% = AddnlQSet!Generated                                ' Get Generation flag.
    s$ = AddnlQSet!PartNumber
    If Generated% = True Then                                       ' if this is a generated record the delete it
       If Val(AddnlQSet!OpCode) > Hopc Then
          Hopc = AddnlQSet!OpCode
       End If
    End If
    AddnlQSet.FindNext Criteria$                                    ' Find next occurrence.
    DoEvents
Loop                                                                ' End of loop.
AddnlQSet.FindFirst Criteria$                                       ' Find first occurrence.
Hopc = (Hopc \ 10) * 10

Do Until AddnlQSet.NoMatch                                          ' Loop until no matching records.
    Generated% = AddnlQSet!Generated                                ' Get Generation flag.
    If Not (Generated%) Then
       tp$ = Left$(LTrim$(AddnlQSet!OpCode), 1)
       Select Case tp$
       Case "*", "$"
           
          t$ = Trim$(Mid$(AddnlQSet!OpCode, 2))
          dd$ = AddnlQSet!Description
          C$ = ""
          'Do
          '   If InStr(dd$, "~") <> 0 Then
          '      DIX = InStr(dd$, "~")
          '      e$ = Rpadd$(Left$(dd$, DIX - 1), Descrw)
          '      c$ = c$ + e$
          '      dd$ = Mid$(d$, DIX + 1)
          '   Else
          '      Exit Do
          '   End If
          'Loop
          'd$ = c$ + Rpad$(d$, Descrw)
          Call AddDescr(C$, dd$, DescrW)
          dd$ = C$

          If Not (IsNull(AddnlQSet!CycleTime)) Then
             Rstd! = AddnlQSet!CycleTime
             If Rstd! = 0 Then Rstd! = 1
          Else
             Rstd! = 1
          End If
          AddnlQSet2.FindFirst Criteria$
          Do Until AddnlQSet2.NoMatch                               ' Loop until no matching records.
             If Trim$(AddnlQSet2!OpCode) = t$ Then
                AddnlQSet2.Edit
                e$ = AddnlQSet2!Description
                If tp$ = "$" Then
                   dd$ = dd$ + e$
                Else
                   dd$ = e$ + dd$
                End If
                AddnlQSet2!Description = dd$
                Rstd! = Rstd! * AddnlQSet2!RunStd
                AddnlQSet2!RunStd = Rstd!
                AddnlQSet2.Update
             End If
             AddnlQSet2.FindNext Criteria$                           ' Find next occurrence.
          Loop                                                      ' End of loop.
       Case "!", "@"
          opc$ = lpad$(Mid$(AddnlQSet!OpCode, 2), 4)
          If tp$ = "@" Then
             InsertOpNo% = InsertOpNo% + 1
             insertOp%(InsertOpNo%) = Val(Trim$(opc$))
          End If
          opc$ = lpad$(Mid$(AddnlQSet!OpCode, 2) + tp$, 4)
          PartN$ = AddnlQSet!PartNumber
          DESCR$ = AddnlQSet!Description
          wc1$ = itsaNull$(AddnlQSet!wc1)
          wc2$ = itsaNull$(AddnlQSet!wc2)
          wc3$ = itsaNull$(AddnlQSet!wc3)
          wc4$ = itsaNull$(AddnlQSet!wc4)
          Machine$ = itsaNull$(AddnlQSet!Machine)
          ctime! = AddnlQSet!CycleTime
          Rstd! = AddnlQSet!RunStd
          
          AddnlQSet.AddNew
          AddnlQSet!PartNumber = PartN$
          AddnlQSet!OpCode = opc$
          AddnlQSet!Generated = True
          AddnlQSet!Description = DESCR$
          AddnlQSet!wc1 = lpad$(wc1$, 3)
          AddnlQSet!wc2 = lpad$(wc2$, 3)
          AddnlQSet!wc3 = lpad$(wc3$, 3)
          AddnlQSet!wc4 = lpad$(wc4$, 3)
          AddnlQSet!Machine = rpad$(Machine$, 30)
          AddnlQSet!CycleTime = ctime!
          AddnlQSet!RunStd = Rstd!
          AddnlQSet.Update
       Case Else
          Hopc = Hopc + 10
          AddnlQSet.Edit
          AddnlQSet!OpCode = lpad$(Str$(Hopc), 4)
          AddnlQSet.Update
       End Select
    End If
    AddnlQSet.FindNext Criteria$                                    ' Find next occurrence.
    DoEvents
Loop                                                                ' End of loop.
'Exit Sub

cnt = 0
If InsertOpNo% > 0 Then
   For imv = 1 To InsertOpNo%
      GreaterThan% = insertOp%(imv)
      AddnlQSet.FindFirst Criteria$                                       ' Find first occurrence.
      Do Until AddnlQSet.NoMatch                                          ' Loop until no matching records.
         Generated% = AddnlQSet!Generated                                ' Get Generation flag.
         s$ = AddnlQSet!PartNumber
         If Generated% = True Then                                       ' if this is a generated record the delete it
            HopS$ = AddnlQSet!OpCode
            HopS$ = Trim$(HopS$)
            lc$ = Right$(HopS$, 1)
            atsign$ = lc$
            vop% = Val(HopS$)
            If (vop% >= GreaterThan%) And ((lc$ <> "@") And (lc$ <> "!")) Then
               vop% = vop% + 10
               HopI$ = Trim$(Str$(vop%)) ' + lc$
               AddnlQSet.Edit
               AddnlQSet!OpCode = lpad$(HopI$, 4)
               AddnlQSet.Update
            End If
         End If
         AddnlQSet.FindNext Criteria$                                    ' Find next occurrence.
      Loop
   Next
End If

AddnlQSet.FindFirst Criteria$                                       ' Find first occurrence.
Hopc = 0
Do Until AddnlQSet.NoMatch                                          ' Loop until no matching records.
    Generated% = AddnlQSet!Generated                                ' Get Generation flag.
    s$ = AddnlQSet!PartNumber
    If Generated% = True Then                                       ' if this is a generated record the delete it
       HopS$ = Trim$(AddnlQSet!OpCode)
       lc$ = Right$(HopS$, 1)
       If lc$ = "!" Or lc$ = "@" Then
          HopI$ = Left$(HopS$, Len(HopS$) - 1)
          AddnlQSet.Edit
          AddnlQSet!OpCode = lpad$(HopI$, 4)
          AddnlQSet.Update
       End If
    End If
    AddnlQSet.FindNext Criteria$                                    ' Find next occurrence.
Loop                                                                ' End of loop.
currform!txtCalcStat.Caption = "Renumbering process sheet - done"
DoEvents
End Sub

Function revpart$(FL$)
'
'This routine converts the partnumber xxxxxxxR to
'   xxxxxxx.R use a "-" to make a " "
   fx = Len(FL$)
   Rev$ = Right$(FL$, 1)
   If (fx = 8) And (InStr("0123456789", Rev$) <> 0) Then
   Else
      If (Rev$ = "-") Or (InStr("0123456789", Rev$) <> 0) Then
         Rev$ = ""
      End If
   End If
   
   revpart$ = "\" + Left$(FL$, fx - 1) + "." + Rev$

End Function

Function rpad$(A$, l)
   rpad$ = Left$(A$ + Space$(l), l)
End Function

Sub Shear1FILE()
   TRIMSHEETLEN! = Sheet_Length! - Trim_Cut!
   If ExtraShear% Then
      Shear1OffAll = TRIMSHEETLEN! - SecondCut! * Blocks_Per_Sheet
   Else
      Shear1OffAll = TRIMSHEETLEN! - FirstCut! * Blocks_Per_Sheet
   End If
   Open ShearsName For Input As #1
      Line Input #1, Sheet1path$
      Line Input #1, Sheet2path$
   Close #1
   Sheet1path$ = Trim$(Sheet1path$)
   Sheet2path$ = Trim$(Sheet2path$)

   FL$ = Trim$(currform!PartNumber)
   FL$ = revpart$(FL$)

   Open Sheet1path$ + FL$ For Output As #1
                    
      Print #1, Format$(TRIMSHEETLEN!, "##0.000")
      Print #1, "A3"
      If ExtraShear% Then
         Print #1, Format$(SecondCut!, "##0.000")
      Else
         Print #1, Format$(FirstCut!, "##0.000")
      End If

      If Shear1OffAll >= 2 Then
         Print #1, Format$(currform!BlocksPerSheet, "###0")
      Else
         If currform!BlocksPerSheet > 1 Then
            NumBlocks = currform!BlocksPerSheet - 1
            Print #1, Format$(NumBlocks, "##0")
            If ExtraShear% Then
               Print #1, Format$(SecondCut!, "##0.000")
            Else
               Print #1, Format$(FirstCut!, "##0.000")
            End If
         End If
         Print #1, "A2"
      End If

      Print #1, "0"
      Print #1, "00"
      
      Print #1, "(NAME : "; currform![PartName]
      Print #1, "PARTS/SHEET  : ["; FormitS$(parts_per_sheet!, "###"); "]"
      If (Multi$ = "MULTIPLE") Or (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
         If ExtraShear% Then
            If InStr(Prime$, "LASER") = 0 Then
               Print #1, "CNC          : ["; FormitS$(Parts_Per_blank, "###"); "]   PARTS PER BLANK"
               Print #1, "#2 SHEAR CUT : ["; FormitS$(Blanks_Per_Block, "###"); "]  "; FormitS$(FirstCut, "###.000"); " X "; FormitS$(SecondCut, "###.000")
            Else
               Print #1, "LASER        : ["; FormitS$(Parts_Per_blank, "###"); "]   PARTS PER BLANK"
               Print #1, "LASER CUT    : ["; FormitS$(Blanks_Per_Block!, "###"); "]  "; FormitS$(FirstCut, "###.000"); " X "; FormitS$(SecondCut, "###.000")
            End If
         Else
            If InStr(Prime$, "LASER") = 0 Then
               Print #1, "#2 SHEAR CUT : ["; FormitS$(Parts_Per_blank!, "###"); "]  "; FormitS$(SecondCut, "###.000"); " X "; FormitS$(FirstCut, "###.000")
            Else
               Print #1, "LASER CUT    : ["; FormitS$(Parts_Per_blank!, "###"); "]  "; FormitS$(SecondCut, "###.000"); " X "; FormitS$(FirstCut, "###.000")
            End If
         End If
      Else
         Print #1, "#2 SHEAR CUT : ["; FormitS$(Blanks_Per_Block!, "###"); "]  "; FormitS$(SecondCut, "###.000"); " X "; FormitS$(FirstCut, "###.000")
      End If

      If ExtraShear% Then
         Print #1, "#1 SHEAR CUT : ["; FormitS$(Blocks_Per_Sheet!, "###"); "]  "; FormitS$(SecondCut, "###.000"); " X "; FormitS$(Sheet_Width!, "###.000")
      Else
         Print #1, "#1 SHEAR CUT : ["; FormitS$(Blocks_Per_Sheet!, "###"); "]  "; FormitS$(FirstCut, "###.000"); " X "; FormitS$(Sheet_Width!, "###.000")
      End If
      Print #1, "SHEET SIZE   : "; LTrim$(FormitS$(Sheet_Width, "###.00") + " X " + FormitS$(Sheet_Length, "###.00"))
      Print #1, "MATERIAL     : "; Left$(Gauge$, 2); " Ga. ";
   Select Case Left$(MetalName$, 3)
      Case "S/S"
         Print #1, "S/S ";
      Case "Col"
         Print #1, "C/R ";
      Case "Alu"
         Print #1, "ALZ ";
      Case "Gal"
         Print #1, "GAL ";
      Case Else

   End Select
   Print #1, MetalPart$
   Print #1, "REVISION     : "; Right$(currform![PartNumber], 1)
   Print #1, "PARTNUMBER   : "; currform![PartNumber]
   Print #1, "** 1st CUT SHEAR #1 FILE **)"
   Close #1


End Sub

Sub Shear2FILE()
   
   TRIMSHEETWdth! = Sheet_Width! - Trim_Cut!
   
   Open ShearsName For Input As #1
      Line Input #1, Sheet1path$
      Line Input #1, Sheet2path$
   Close #1
   Sheet1path$ = Trim$(Sheet1path$)
   Sheet2path$ = Trim$(Sheet2path$)
   FL$ = Trim$(currform!PartNumber)
   fx = Len(FL$)
   Rev$ = Right$(FL$, 1)
   If (Rev$ = "-") Or (InStr("0123456789", Rev$) <> 0) Then
      Rev$ = ""
   End If
   FL$ = "\" + Left$(FL$, fx - 1) + "." + Rev$

   Open Sheet2path$ + FL$ For Output As #1
                    

   If Multi$ <> "MULTIPLE" Or ExtraShear% Then
      Print #1, Format$(TRIMSHEETWdth!, "###0.000")
      Print #1, "A3"
      
      If ExtraShear% Then
         Shear2OffAll = TRIMSHEETWdth! - FirstCut! * currform!BlanksPerBlock
         Print #1, Format$(FirstCut, "###0.000")
      Else
         Shear2OffAll = TRIMSHEETWdth! - SecondCut! * currform!BlanksPerBlock
         Print #1, Format$(SecondCut, "###0.000")
      End If

      If Shear2OffAll >= 2 Then
         Print #1, Format$(currform!BlanksPerBlock, "###0.000")
      Else
         If currform!BlanksPerBlock > 1 Then
            NumBlanks = currform!BlanksPerBlock - 1
            Print #1, Format$(NumBlanks, "##0")
            If ExtraShear% Then
               Print #1, Format$(FirstCut!, "##0.000")
            Else
               Print #1, Format$(SecondCut!, "##0.000")
            End If
         End If
         Print #1, "A2"
      End If
      Print #1, "0"
      Print #1, "A0"
   Else
      If (Bottom_Trim_Cut! >= 2) Or (currform![ActualPartHeight] >= 2) Then
         FIRSTCUTLESSTOP = FirstCut - TOP_TRIM_CUT!
         FIRSTCUTLESSBOTTOM = FirstCut - Bottom_Trim_Cut!
         If TOP_TRIM_CUT <= 0 Then
            If Bottom_Trim_Cut >= 2 Then
               Print #1, Format$(Bottom_Trim_Cut, "##0.000")
            Else
               Print #1, Format$(FIRSTCUTLESSBOTTOM, "##0.000")
            End If
            Print #1, "A2"
            Print #1, "0"
            Print #1, "A0"
         Else
            Print #1, Format$(FIRSTCUTLESSTOP, "##0.000")
            Print #1, "A2"
            Print #1, Format$(currform![ActualPartHeight], "##0.000")
            If Bottom_Trim_Cut >= 2 Then
               Print #1, "1"
            Else
               Print #1, "A2"
            End If
            Print #1, "0"
            Print #1, "A0"
         End If
      End If
   End If

      Print #1, "(NAME : "; currform![PartName]
      Print #1, "PARTS/SHEET  : ["; FormitS$(parts_per_sheet!, "###"); "]"
      If (Multi$ = "MULTIPLE") Or (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
         If ExtraShear% Then
            If InStr(Prime$, "LASER") = 0 Then
               Print #1, "CNC          : ["; FormitS$(Parts_Per_blank, "###"); "]   PARTS PER BLANK"
               Print #1, "#2 SHEAR CUT : ["; FormitS$(Blanks_Per_Block, "###"); "]  "; FormitS$(FirstCut, "###.000"); " X "; FormitS$(SecondCut, "###.000")
            Else
               Print #1, "LASER        : ["; FormitS$(Parts_Per_blank, "###"); "]   PARTS PER BLANK"
               Print #1, "LASER CUT    : ["; FormitS$(Blanks_Per_Block!, "###"); "]  "; FormitS$(FirstCut, "###.000"); " X "; FormitS$(SecondCut, "###.000")
            End If
         Else
            If InStr(Prime$, "LASER") = 0 Then
               Print #1, "#2 SHEAR CUT : ["; FormitS$(Parts_Per_blank!, "###"); "]  "; FormitS$(SecondCut, "###.000"); " X "; FormitS$(FirstCut, "###.000")
            Else
               Print #1, "LASER CUT    : ["; FormitS$(Parts_Per_blank!, "###"); "]  "; FormitS$(SecondCut, "###.000"); " X "; FormitS$(FirstCut, "###.000")
            End If
         End If
      Else
         Print #1, "#2 SHEAR CUT : ["; FormitS$(Blanks_Per_Block!, "###"); "]  "; FormitS$(SecondCut, "###.000"); " X "; FormitS$(FirstCut, "###.000")
      End If

      If ExtraShear% Then
         Print #1, "#1 SHEAR CUT : ["; FormitS$(Blocks_Per_Sheet!, "###"); "]  "; FormitS$(SecondCut, "###.000"); " X "; FormitS$(Sheet_Width!, "###.000")
      Else
         Print #1, "#1 SHEAR CUT : ["; FormitS$(Blocks_Per_Sheet!, "###"); "]  "; FormitS$(FirstCut, "###.000"); " X "; FormitS$(Sheet_Width!, "###.000")
      End If
      Print #1, "SHEET SIZE   : "; LTrim$(FormitS$(Sheet_Width, "###.00") + " X " + FormitS$(Sheet_Length, "###.00"))
      Print #1, "MATERIAL     : "; Left$(Gauge$, 2); " Ga. ";
   Select Case Left$(MetalName$, 3)
      Case "S/S"
         Print #1, "S/S ";
      Case "Col"
         Print #1, "C/R ";
      Case "Alu"
         Print #1, "ALZ ";
      Case "Gal"
         Print #1, "GAL ";
      Case Else

   End Select
   Print #1, MetalPart$
   Print #1, "REVISION     : "; Right$(currform![PartNumber], 1)
   Print #1, "PARTNUMBER   : "; currform![PartNumber]
   Print #1, "** 2nd CUT SHEAR FILE **)"
   Close #1
Exit Sub
















   Print #1, "(NAME : "; currform![PartName]
   Print #1, "PARTS/SHEET  : ["; FormitS$(parts_per_sheet!, "###"); "]"
   If Multi$ = "MULTIPLE" Then
      If InStr(Prime$, "LASER") = 0 Then
         Print #1, "#2 SHEAR CUT : ["; FormitS$(Parts_Per_blank!, "###"); "]  "; FormitS$(SecondCut, "###.000"); " X "; FormitS$(FirstCut, "###.000"); ""
      Else
         Print #1, "LASER CUT    : ["; FormitS$(Parts_Per_blank!, "###"); "]  "; FormitS$(SecondCut, "###.000"); " X "; FormitS$(FirstCut, "###.000"); ""
      End If
   Else
      Print #1, "#2 SHEAR CUT : ["; FormitS$(Blanks_Per_Block!, "###"); "]  "; FormitS$(SecondCut, "###.000"); " X "; FormitS$(FirstCut, "###.000"); ""
   End If
   Print #1, "#1 SHEAR CUT : ["; FormitS$(Blocks_Per_Sheet!, "###"); "]  "; FormitS$(FirstCut, "###.000"); " X "; FormitS$(Sheet_Width!, "###.000")
   Print #1, "SHEET SIZE   : "; LTrim$(FormitS$(Sheet_Width, "###.00") + " X " + FormitS$(Sheet_Length, "###.00"))
   Print #1, "MATERIAL     : "; Left$(Gauge$, 2); " Ga. ";
   
   Select Case Left$(MetalName$, 3)
      Case "S/S"
         Print #1, "S/S ";
      Case "Col"
         Print #1, "C/R ";
      Case "Alu"
         Print #1, "ALZ ";
      Case "Gal"
         Print #1, "GAL ";
      Case Else

   End Select
   Print #1, MetalPart$
   Print #1, "REVISION     : "; Right$(currform![PartNumber], 1)
   Print #1, "PARTNUMBER   : "; currform![PartNumber]
   
   Print #1, "** 2nd CUT SHEAR FILE **)"
   Close #1


End Sub

Sub UtilGrossWt(Sheet_W!, Sheet_L!, lb_per_sq_ft!, Gw!, Aw!, MainSet As Recordset)
'
'answers
'
'   PartCost
'
'
Sheet_Length! = Sheet_L!
Sheet_Width! = Sheet_W!
  'Parting tool width = .2
   Pt_Width! = 0.2: Trim_Cut = 0.1
   acd$ = MainSet![PartNumber]
   If acd$ = "9108601L" Then
      acd$ = ""
   End If
   GrNone% = MainSet![GrainNone]
   Grain$ = Trim$(UCase$(MainSet![GrainDir]))

   
'   currform!lblCalcStat.Visible = True
'   currform!txtCalcStat.Caption = "Calculations underway"
'   currform!txtCalcStat.Visible = True
'   currform!txtCalcStat2.Visible = True

DoEvents
      OutPutData% = True
      Gw! = 0
 '     If MainSet![PartNumber] = "9100890F" Then
  '       Stop
  '    End If
   
      If GrNone% Then
         GrNone% = False
         Grain$ = "ALONG FIRST"
         OutPutData% = False
         
'         currform!txtCalcStat2.Caption = "Calculating along first dimension"
DoEvents
         GoSub UTCalcPart

         prc1 = Gw!
         
         GrNone% = False
         Grain$ = "ALONG SECOND"
         OutPutData% = True
         
'         currform!txtCalcStat2.Caption = "Calculating along Second dimension"
DoEvents
         GoSub UTCalcPart

         prc2 = Gw!
         Debug.Print prc1, prc2
         If prc1 < prc2 Then

            MainSet!GrainDir = "Along First Dimension"
         ElseIf prc1 > prc2 Then
            MainSet!GrainDir = "Along Second Dimension"
         Else
            If First_Dim! < Second_dim! Then
               MainSet!GrainDir = "Along First Dimension"
            Else
               MainSet!GrainDir = "Along Second Dimension"
            End If
         End If
'         Call GrainFromRec

         If MainSet!GrainDir <> "Along Second Dimension" Then
            Grain$ = MainSet!GrainDir
            GrNone% = False
            OutPutData% = True
         
'            Forms![Utilization]!lblStatus.Caption = "Calculating along chosen dimension"
            DoEvents
            GoSub UTCalcPart
            GrNone% = True
         End If

      Else
'         Forms![Utilization]!lblStatus.Caption = "Calculating along only dimension"
         HoldGrD$ = Trim$(MainSet![GrainDir])
         GoSub UTCalcPart
         MainSet![GrainDir] = HoldGrD$
      End If
      MainSet![GrossWt] = MainSet![GrossWt] * MainSet![USAGE] ' * 12
      MainSet![ActualWt] = MainSet![ActualWt] * MainSet![USAGE] ' * 12
      Gw! = MainSet![GrossWt]
      Aw! = MainSet![ActualWt]
      MainSet.Update
   Exit Sub

UTCalcPart:
   MainSet.Edit
   MainSet![GrossWt] = 0
   MainSet![ActualWt] = 0
   MainSet![Utilization] = 0
   MainSet![PartsPerSheet] = 0
   MainSet![BlocksPerSheet] = 0
   MainSet![BlanksPerBlock] = 0
   
   MainSet![ActualPartHeight] = 0
   MainSet![ActualPartWidth] = 0
   MainSet![SheetSize] = " "
   MainSet![BlankSize] = " "
   MainSet![PartSize] = " "
   NoDataSheets% = 0
   MainSet![CalculationStatus] = 0
   
   First_Dim! = ItsAZero!(MainSet![FirstDim])
   Second_dim! = ItsAZero!(MainSet![SecDim])
   Denting% = 0
   Parts_Per_blank! = ItsAZero!(MainSet![PartsPerBlank])
   Part_Height! = ItsAZero!(MainSet![PartHeight])
   Bottom_Trim_Cut! = ItsAZero!(MainSet![BotTrimCut])
   TOP_TRIM_CUT! = ItsAZero!(MainSet![TopTrimCut])
   Part_Width! = ItsAZero!(MainSet![PartWidth])
   Punch$ = itsaNull$(MainSet![PunchNumber])
   PunchDieDescr$ = itsaNull$(MainSet![PunchNumber])
   PunchCounter% = Val(itsaNull$(MainSet![PunchPartsPerStrip]))
   PunchPresserOptions% = Val(itsaNull$(MainSet![PunchOption]))
   OrigPartW! = ItsAZero(MainSet!OriginalPartW)

   If PurchaseBlank% Then
      First_Dim! = Sheet_Length!
      Second_dim! = Sheet_Width!
   End If
   

   Multi$ = Trim$(UCase$(MainSet![CutType]))
   TypeDeburr$ = Trim$(UCase$(MainSet![Deburr]))

  
'   If (Multi$ = "MULTIPLE") Or (Multi$ = "LASER")or(Multi$ = "SALVAGNINI") Then
'      If InStr(MN$, "S/S") <> 0 Then
'   If MainSet!GrainShearChk.Visible Then
         ExtraShear% = MainSet![GrainShear]
'   Else
'      ExtraShear% = False
'   End If

   PartN$ = MainSet![PartNumber]
   If (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
      ppb% = Int(Sheet_Width! / (Second_dim! / Parts_Per_blank!))
      Second_dim! = Sheet_Width!
      Parts_Per_blank! = ppb%
   End If
   
   If Multi$ = "MULTIPLE" Then
'      ppb% = Int((Second_dim! - Pt_Width!) / (Part_Width! + Pt_Width!))
      If ExtraShear% Then
         If Second_dim! <> Part_Width Then
            ppb% = Int((Second_dim!) / (Part_Width! + Pt_Width!))
         Else
            ppb% = 1
         End If
      Else
         Second_dim! = Sheet_Width!
         ppb% = Int((Second_dim!) / (Part_Width! + Pt_Width!))
      End If
      If (ppb% = 0) And (Parts_Per_blank! = 1) Then
         ppb% = 1
      End If
      Parts_Per_blank! = ppb%
   End If
   
   If (First_Dim! = 0) Or (Second_dim! = 0) Or (lb_per_sq_ft! = 0) Then
      RC% = 6: GoSub Setcalcstat
      MainSet.Update
      Exit Sub
   End If
   If ((Multi$ = "MULTIPLE") Or (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG")) And (Parts_Per_blank! = 0) Then
      RC% = 6: GoSub Setcalcstat
      MainSet.Update
      Exit Sub
   End If
   
   If (Multi$ = "MULTIPLE") And (Part_Width! = 0) Then
      RC% = 10: GoSub Setcalcstat
      MainSet.Update
      Exit Sub
   End If
   
   If (Multi$ = "BLANK") Then
      If (Second_dim! > Sheet_Width!) Then
      RC% = 10: GoSub Setcalcstat
      MainSet.Update
      Exit Sub
      End If
   End If
      
   If (Bottom_Trim_Cut! < 2) And (Multi$ = "MULTIPLE") Then
      RC% = 5: GoSub Setcalcstat
      MainSet.Update
      Exit Sub
   End If
   If (Multi$ = "NO CNC") And (Punch$ <> "!NONE!") Then
      If PunchPresserOptions% = 2 Then
         Second_dim! = Sheet_Width!
      End If
      Part_Width! = (OrigPartW! / PunchCounter%)
      ppb% = (Sheet_Width! / Part_Width!)
      Parts_Per_blank! = ppb%
      MainSet![PartsPerBlank] = Parts_Per_blank!
'      Blanks_Per_Block! = Int((Sheet_Width - TRIM_CUT) / Second_dim!)
'      MainSet![BlanksPerBlock] = Blanks_Per_Block!
'      asdc$ = MainSet![PartNumber]
   End If

   
   If (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
      Part_Width! = (Sheet_Width! / Parts_Per_blank) - Pt_Width!
      Bottom_Trim_Cut! = 0
      TOP_TRIM_CUT! = 0
   End If
   
   If Multi$ <> "BLANK" Then
      Calcerr0% = MainSet![CalculationStatus]
      GoSub UTCalcMaterialWt
      calcerr1% = MainSet![CalculationStatus]
      aw1! = Gw!
      aw2! = 0
   End If
   If MainSet![CalculationStatus] = 0 Then
 
      GoSub UTDoAnswers
      
      If ((Bottom_Trim_Cut! < 2) Or (Bottom_Trim_Cut! >= FirstCut) Or (TOP_TRIM_CUT! >= FirstCut)) And (Multi$ = "MULTIPLE") Then
         RC% = 5: GoSub Setcalcstat
         MainSet.Update
         Exit Sub
      End If

   End If
Return
MainSet.Update
Exit Sub

UTDoAnswers:
   If Multi$ = "BLANK" Then FirstCutDir% = 1
   Select Case FirstCutDir%
      Case 1
         If (Multi$ = "MULTIPLE") Or (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
            Call CalcMultGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!)
            If Multi$ = "LASER" Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
               MainSet![ActualPartHeight] = MainSet![PartHeight]
               MainSet![ActualPartWidth] = MainSet![PartWidth]
            Else
               MainSet![ActualPartHeight] = First_Dim! - TOP_TRIM_CUT! - Bottom_Trim_Cut!
               MainSet![ActualPartWidth] = MainSet![PartWidth]
            End If
         Else
            Call CalcGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!, RC%)
            If RC% <> 0 Then
               GoSub Setcalcstat
            End If
            MainSet![ActualPartHeight] = First_Dim!
            MainSet![ActualPartWidth] = Second_dim!
         End If
         If (Multi$ <> "LASER") And (Multi$ <> "SALVAGNINI") And (Multi$ <> "LASER/SHEAR") Then
            MainSet![PartHeight] = First_Dim!
         End If
         FirstCut! = First_Dim!
         SecondCut! = Second_dim!
         If ExtraShear% Then
            MainSet!GrainDir = "Along Second Dimension"
            fc$ = "Along Second Dimension"
         Else
            MainSet!GrainDir = "Along First Dimension"
            fc$ = "Along First Dimension"
         End If
      Case 2
         Call CalcGrossWeight(Second_dim!, First_Dim!, Gw!, Aw!, RC%)
         If RC% <> 0 Then
            GoSub Setcalcstat
         End If
         fc$ = "Along Second Dimension"
         MainSet!GrainDir = 2
         If (Multi$ <> "LASER") And (Multi$ <> "SALVAGNINI") And (Multi$ <> "LASER/SHEAR") Then
            MainSet![PartHeight] = Second_dim!
         End If
         MainSet![ActualPartHeight] = Second_dim!
         MainSet![ActualPartWidth] = First_Dim!
         FirstCut! = Second_dim!
         SecondCut! = First_Dim!
      Case Else
         fc$ = MainSet![GrainDir]
         MainSet![PartHeight] = First_Dim!
         MainSet![ActualPartHeight] = First_Dim!
         MainSet![ActualPartWidth] = Second_dim!
         FirstCut! = First_Dim!
         SecondCut! = Second_dim!
         If Multi$ = "BLANK" Then FirstCutDir% = 1
  End Select
  Actual_PartHeight = MainSet![ActualPartHeight]
  Actual_PartWidth = MainSet![ActualPartWidth]
  
   If FirstCutDir% = 0 Then
      RC% = 1: GoSub Setcalcstat
   Else
      MainSet![GrainDir] = fc$
      If Aw! > Gw! Then Aw! = Gw!
      MainSet![GrossWt] = Gw!
      MainSet![ActualWt] = Aw!
      MainSet![Utilization] = 0
      If Gw! <> 0 Then
         MainSet![Utilization] = Aw! / Gw!
      End If
      MainSet![PartsPerSheet] = parts_per_sheet!
      MainSet![BlocksPerSheet] = Blocks_Per_Sheet!
      MainSet![BlanksPerBlock] = Blanks_Per_Block!
         
      MainSet![SheetSize] = Format$(Sheet_Width!, "###0.000") + " X " + Format$(Sheet_Length!, "###0.000")
      If (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
         MainSet![PartSize] = Format$(MainSet![PartHeight], "###0.000") + " X " + Format$(MainSet![PartWidth], "###0.000")
      Else
         MainSet![PartSize] = Format$(MainSet![ActualPartHeight], "###0.000") + " X " + Format$(MainSet![ActualPartWidth], "###0.000")
      End If
      MainSet![BlankSize] = Format$(First_Dim!, "###0.000") + " X " + Format$(Second_dim!, "###0.000")
   End If
'   Call ErrorMessages
Return
UTCalcMaterialWt:
   If (Multi$ = "NO CNC") And (Punch$ <> "!NONE!") And (MainSet!PunchOption = 2) And (Sheet_Width <> Second_dim!) Then
      RC% = 2: GoSub Setcalcstat
      FirstCutDir% = 0
   End If
      
   If Multi$ = "MULTIPLE" Or Multi$ = "LASER" Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
      If (Sheet_Width <> Second_dim!) And (Not (ExtraShear%)) Then
         RC% = 2: GoSub Setcalcstat
         FirstCutDir% = 0
      ElseIf (((PartWidth + Pt_Width) * Parts_Per_blank) - Pt_Width > Sheet_Width) And (Multi$ <> "LASER") And (Multi$ <> "SALVAGNINI") And (Multi$ <> "LASER/SHEAR") Then
         RC% = 3: GoSub Setcalcstat
         FirstCutDir% = 0
      ElseIf (Bottom_Trim_Cut! < 2) And (Multi$ <> "LASER") And (Multi$ <> "SALVAGNINI") And (Multi$ <> "LASER/SHEAR") Then
         RC% = 5: GoSub Setcalcstat
         FirstCutDir% = 0
      Else
         Part_Width = MainSet![PartWidth]
         Call CalcMultGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!)
         FirstCutDir% = 1
      End If
   Else

      If Not (GrNone%) Then
         If Left$(Grain$, 11) = "ALONG FIRST" Then
            FirstCutDir% = 1
            Call CalcGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!, RC%)
            If RC% <> 0 Then
               GoSub Setcalcstat
            End If

         Else
            FirstCutDir% = 2
            Call CalcGrossWeight(Second_dim!, First_Dim!, Gw!, Aw!, RC%)
            If RC% <> 0 Then
               GoSub Setcalcstat
            End If

         End If
      Else
         Call CalcGrossWeight(First_Dim!, Second_dim!, Gw1!, Aw!, RC%)
         If RC% <> 0 Then
            GoSub Setcalcstat
         End If
         Call CalcGrossWeight(Second_dim!, First_Dim!, Gw2!, Aw!, RC%)
         If RC% <> 0 Then
            GoSub Setcalcstat
         End If
         If Gw1! < Gw2! Then
            FirstCutDir% = 1
            Call CalcGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!, RC%)
            If RC% <> 0 Then
            GoSub Setcalcstat
            End If
         Else
            FirstCutDir% = 2
            Call CalcGrossWeight(Second_dim!, First_Dim!, Gw!, Aw!, RC%)
            If RC% <> 0 Then
            GoSub Setcalcstat
            End If
         End If

         If Gw1! = Gw2! Then
            If First_Dim! < Second_dim! Then
               FirstCutDir% = 1
               Call CalcGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!, RC%)
               If RC% <> 0 Then
                  GoSub Setcalcstat
               End If
            Else
               FirstCutDir% = 2
               Call CalcGrossWeight(Second_dim!, First_Dim!, Gw!, Aw!, RC%)
               If RC% <> 0 Then
                  GoSub Setcalcstat
               End If
            End If
         End If
      End If
   End If
Return
Setcalcstat:
   MainSet![CalculationStatus] = RC%
Return
End Sub

Sub CrossRef()
currform!cmdDeleteFileFromTrumpfs.Visible = False
currform!lblCalcStat.Visible = True
currform!txtCalcStat.Visible = True
currform!txtCalcStat.Caption = "Searching Cross Reference File."



    currform!lblXrefMessage.Visible = False
   
   Set XrefQDB = DBEngine.Workspaces(0).Databases(0)
   Set XrefQSet = XrefQDB.OpenRecordset("RMSFILES#_EGSSP1A0", DB_OPEN_DYNASET)  ' Create dynaset.
   If XrefQSet.recordCount <> 0 Then
   
      XrefQSet.MoveFirst
      PartN$ = currform![PartNumber]
      xPN$ = Left(PartN$, 7)
      Do Until XrefQSet.EOF
         If (Trim(XrefQSet!CURPN) = xPN$) Or (Trim(XrefQSet!NEWPN) = xPN$) Then
            
            currform!lblXrefMessage.Visible = True
            currform!lblXrefMessage.Caption = "This part has an associated part - " + Trim(XrefQSet!CURPN) + Right$(PartN, 1) + "/" + Trim(XrefQSet!NEWPN) + Right$(PartN, 1)
            currform!cmd300Series.Visible = True
   
            Exit Do
         End If
         XrefQSet.MoveNext
      Loop
   End If
currform!cmdDeleteFileFromTrumpfs.Visible = True
currform!lblCalcStat.Visible = False
currform!txtCalcStat.Visible = False
currform!txtCalcStat.Caption = "Waiting for Calculate"
End Sub





What it does

Chunk 1

Detailed Description of VBA Code

Module and Variable Declarations

The provided VBA code defines a module named processvariables with various global variables. These variables are used to store values related to processing and manufacturing, such as part information, machine details, and production data.

Attribute VB_Name = "processvariables"

Global NewPartName_Parm$, PrimaryScreen$, Initforms$, Parts_per_strip!, blankUnits$
Global Sheet_Width!, Sheet_Length!, Actual_PartHeight!, Actual_PartWidth!

Global Trim_Cut!, lb_per_sq_ft!, Blocks_Per_Sheet!, src!, PricePerLB!
Global Blanks_Per_Block!, parts_per_sheet!, FirstCut!, SecondCut!, SecondShear
Global NoGrDirChange, Multi$, TypeDeburr$, MetalName$, MetalPart$, NoDataSheets%
Global Grain$, AddnlI%, Pt_Width!, Location%, Gauge$, PMachine$, DescrW, Denting%
Global Parts_Per_blank!, Part_Height!, Bottom_Trim_Cut!, FirstCutDir%, UnivREQName$, CalculatedGrossWeight!
Global TOP_TRIM_CUT!, Part_Width!, First_Dim!, Second_dim!, dbtype!(20, 2), warehousewc$
Global Elem!(53), Ds$(40), Internal_Labor!, Internal_Walk!, FontTypes%, ExtraShear%
Global YESORNO%, YesOrNoStr$, MachinesWithShears$, OutPutData%, PurchaseBlank%, usrID$

Subroutine: Add_Additional_Process()

The code defines a subroutine named Add_Additional_Process() that performs several operations related to processing and manufacturing data.

Sub Add_Additional_Process()
    Dim AddnlQDB      As Database, AddnlQSet As Recordset
    Dim AddnlDB           As Database, AddnlSet As Recordset
    Dim MachQDB    As Database, MachQSet As Recordset
    Dim Hopc!

    PartN$ = currform![PartNumber]
    If currform!SavedProcesses.ListIndex = -1 Then
        Exit Sub
    End If

    Criteria$ = "PartNumber = '" + PartN$ + "'"                         ' Set search criteria.
    Set AddnlQDB = DBEngine.Workspaces(0).Databases(0)
    Set AddnlQSet = AddnlQDB.OpenRecordset("AddnlQ1", DB_OPEN_DYNASET)  ' Create dynaset.
    Set AddnlDB = DBEngine.Workspaces(0).Databases(0)
    Set AddnlSet = AddnlQDB.OpenRecordset("AddnlPROC", DB_OPEN_TABLE)   ' Create dynaset.

    wc$ = currform!SavedProcesses.Column(0)
    Machine$ = currform!SavedProcesses.Column(1)
    wc1$ = Left$(currform!SavedProcesses.Column(2) + "   ", 3)
    wc2$ = Left$(currform!SavedProcesses.Column(3) + "   ", 3)
    wc3$ = Left$(currform!SavedProcesses.Column(4) + "   ", 3)
    wc4$ = Left$(currform!SavedProcesses.Column(5) + "   ", 3)

The subroutine performs the following operations:

  1. Retrieves the part number from the PartNumber field in the current form's data.
  2. Checks if there are any saved processes listed. If not, it exits the subroutine.
  3. Sets up the database and recordset connections for additional processing data.
  4. Extracts specific values from the saved processes column to determine various parameters.

However, the code snippet provided does not contain a complete implementation of the Add_Additional_Process() subroutine. The actual logic and operations are missing in this part of the code.

Chunk 2

Failed to generate documentation with Ollama

Chunk 3

Failed to generate documentation with Ollama

Chunk 4

Here is a detailed Markdown description of the VBA code:

AddnlHandDeburr Function

### Description

Calculates the deburred length for hand deburring.

### Parameters

* `currform!AddnlDeburrInches`: input value (in inches)
* Returns: calculated deburred length (`AddnlHandDeburr!`)

### Code

```vba
Function AddnlHandDeburr!
    Addnl = currform!AddnlDeburrInches
    AddnlHandDeburr! = Addnl * 0.002 * 60
End Function

This function takes an input value currform!AddnlDeburrInches and multiplies it by a factor of 0.002 * 60 to calculate the deburred length.

AddPartButton Sub

### Description

Opens a new form for adding parts.

### Parameters

None

### Code

```vba
Sub AddPartButton()
    On Error GoTo Err_addPr_Click
    
    Dim DocName As String
    Dim LinkCriteria As String
    
    DoCmd.Close
    DocName = "New Process Sheet"
    DoCmd.OpenForm DocName, , , LinkCriteria
    
Exit_addPr_Click:
Exit Sub

Err_addPr_Click:
    MsgBox Error$
    Resume Exit_addPr_Click
End Sub

This sub opens a new form for adding parts. If an error occurs, it displays an error message and continues executing.

CalcActualWt Sub

### Description

Calculates the actual weight of a part.

### Parameters

* `dim1!`, `dim2!`: input values (length and width)
* `Aw!`: output value (actual weight)

### Code

```vba
Sub CalcActualWt(dim1!, dim2!, Aw!)
    If (lb_per_sq_ft! = 0) Then Exit Sub
    
    Aw! = dim1! * dim2! / 144 * lb_per_sq_ft!
    Aw! = Val(Format$(Aw!, "######0.000"))
End Sub

This sub takes input values dim1! and dim2! and calculates the actual weight using the formula Aw! = (length \* width) / 144 \* lb_per_sq_ft!. The result is stored in output variable Aw!.

CalcGrossWeight Sub

### Description

Calculates the gross weight of a part.

### Parameters

* `dim1!`, `dim2!`: input values (length and width)
* `Gw!`: output value (gross weight)
* `RC%`: output variable (used for calculations)

### Code

```vba
Sub CalcGrossWeight(dim1!, dim2!, Gw!, Aw!, RC%)
    Dim A%, b%
    
    RC% = 0
    
    If (dim1! = 0) Or (dim2! = 0) Or (lb_per_sq_ft! = 0) Then RC% = 6
    Exit Sub
    
    ASheet_Width! = Sheet_Width!
    ASheet_Length! = Sheet_Length!
    
    If dim1! \u003c 2 Then ASheet_Length! = ASheet_Length! - 2
    If dim2! \u003c 2 Then ASheet_Width! = ASheet_Width! - 2
    
    If Multi$ = "BLANK" Then
        A% = 1
    Else
        A% = Int((ASheet_Width! - Trim_Cut) / dim2!)
    End If
    
    b% = Int((ASheet_Length! - Trim_Cut) / dim1!)
    
    C% = 1 'for punch press
    Parts_per_strip! = 1
    
    If (Multi$ = "NO CNC") Then
        ...
        
    If parts_per_sheet \u003c\u003e 0 Then
        Gw! = Sheet_Width! * Sheet_Length! / 144 * lb_per_sq_ft! / parts_per_sheet
        Call CalcActualWt(dim1!, dim2!, Aw!)
        Aw! = Aw! / Parts_per_strip!
    Else
    
        ...

This sub calculates the gross weight of a part using various input values and formulas. The result is stored in output variable Gw!.

Unclosed Code Snippet

### Description

Unfinished code snippet.

### Parameters

None

### Code

...

Note that this code snippet appears to be incomplete, as it does not contain a clear function or procedure definition. It may be a fragment of an existing codebase or a starting point for further development.

Chunk 5

Detailed Description of VBA Code

Sub Calculate GW

# Calculate Gross Weight (GW)

This sub calculates the gross weight of a part based on its dimensions and material properties.

  • It checks if the unit type is "LB" (pounds). If true, it calculates the gross weight using the formula: Gw! = Sheet_Width! * Sheet_Length! / 144 * lb_per_sq_ft!.
  • If the unit type is not "LB", it sets the gross weight to 1.
If blankUnits$ = "LB" Then
    Gw! = Sheet_Width! * Sheet_Length! / 144 * lb_per_sq_ft!
    ' ... (rest of the calculation remains the same)
Else
    Gw! = 1
End If

Sub CalcLaborCost

# Calculate Labor Cost

This sub calculates the total labor cost for a part based on its material properties.

  • It sets up a database and recordset connection to retrieve data from an AddnlQ database.
  • It loops through each occurrence in the recordset, calculating the labor rate and adding it to the total labor cost (LaborTot!).
  • The loop continues until no more matching records are found.
Sub CalcLaborCost(LaborTot!)
    Dim AddnlQDB As Database, AddnlQSet As Recordset
    
    ' ... (connection setup remains the same)
    
    Do Until AddnlQSet.NoMatch
        Hopc$ = AddnlQSet!OpCode
        If InStr(Hopc$, "*") = 0 Then
            rs! = AddnlQSet!RunStd
            Lr! = AddnlQSet!LaborRate
            LaborTot! = LaborTot! + (rs! * Lr!)
        End If
        AddnlQSet.FindNext Criteria$
    Loop
End Sub

Sub CalcMultGrossWeight

# Calculate Multigross Weight

This sub calculates the multigross weight of a part based on its dimensions and material properties.

  • It checks if any input values are zero. If true, it exits the subroutine.
  • It calls the CalcActualWt subroutine to calculate the actual weight (Aw!) using the given dimensions and material properties.
  • Based on the extra shear setting, it calculates the blocks per sheet, blanks per block, and parts per sheet.
  • If the first dimension is equal to the sheet length and the second dimension is equal to the sheet width, it checks a specific condition related to the multi-gross weight calculation.
Sub CalcMultGrossWeight(dim1!, dim2!, Gw!, Aw!)
    Dim A!, b!
    
    ' ... (input values setup remains the same)
    
    If parts_per_sheet! \u003c\u003e 0 Then
        Gw! = Sheet_Width * Sheet_Length / 144 * lb_per_sq_ft / parts_per_sheet
        '   Gw! = (Int(Gw! * 1000)) / 1000
        Gw! = Val(Format(Gw!, "0.000"))
    Else
        If (First_Dim! = Sheet_Length!) And (Second_dim! = Sheet_Width!)
            ' ... (specific condition related to multi-gross weight calculation remains the same)

Chunk 6

Detailed Description of VBA Code

Calculated Gross Weight (GW) Subroutine

This subroutine calculates the calculated gross weight (Gw!) of a part based on various input parameters.

' Calculated GW
'
Gw! = Sheet_Width! * Sheet_Length! / 144 * lb_per_sq_ft! / Parts_Per_blank
'
Gw! = (Int(Gw * 1000)) / 1000
Gw! = Val(Format(Gw!, "0.000"))
pw! = ItsAZero!(Part_Width!)
Aw! = Part_Height! * pw! / 144 * lb_per_sq_ft!
Blocks_Per_Sheet! = 1
parts_per_sheet = Parts_Per_blank

Here's what the code does:

  • Calculates Gw! by multiplying Sheet_Width, Sheet_Length, and converting to pounds using the given conversion factors.
  • Rounds Gw! to three decimal places using Val() function and formatting.
  • Calculates the width (pw!) of the part using a separate formula, likely related to trimming or cutting dimensions.
  • Calculates the area-weighted height (Aw!) of the part.
  • Sets default values for blocks per sheet and parts per sheet.

Main Subroutine (calcs)

This subroutine appears to handle various calculations and logic for a specific application.

Sub calcs()
Dim MachQDB As Database, MachQSet As Recordset
Dim MachNQDB As Database, MachNQSet As Recordset
'
' Parting tool width = .2
Pt_Width! = 0.2: Trim_Cut = 0.1
Grain$ = Trim$(UCase$(currform![GrainDir]))
MachinesWithShears$ = "C-3C-4C-5C-6C-7C-8C-9V-1V-2V-4C10"

'
' Xref database and recordset handling (commented out)
'
'   currform!lblXrefMessage.Visible = False
'
'

If wh$ = "90" Then
If whl$ = "2" Then
currform![CalculationStatus] = 11
Call ErrorMessages
Exit Sub
End If
warehousewc$ = "302"
Else
If whl$ = "1" Then
currform![CalculationStatus] = 11
Call ErrorMessages
Exit Sub
End If
warehousewc$ = "347"
End If

GrNone% = currform![GrainNone]
currform!cmdDeleteFileFromTrumpfs.Visible = False
currform!lblCalcStat.Visible = True
currform!txtCalcStat.Caption = "Calculations underway"
currform!txtCalcStat.Visible = True
currform!txtCalcStat2.Visible = True

DoEvents
OutPutData% = True

If GrNone% Then
Grain$ = "ALONG FIRST"
OutPutData% = False
currform!txtCalcStat2.Caption = "Calculating along first dimension"
DoEvents
GoSub CalcPart

prc1 = currform![PartCost]

Grain$ = "ALONG SECOND"
OutPutData% = True

currform!txtCalcStat2.Caption = "Calculating along Second dimension"
DoEvents
GoSub CalcPart

prc2 = currform![PartCost]
Debug.Print prc1, prc2
If prc1 \u003c prc2 Then
currform!GrainDir = "Along First Dimension"
ElseIf prc1 \u003e prc2 Then
currform!GrainDir = "Along Second Dimension"
Else
...

Here's what the code does:

  • Initializes various variables and sets default values.
  • Handles warehouse-related logic, including calculating warehousewc$ based on input values.
  • Sets visibility and captions for GUI elements (e.g., labels, buttons).
  • Calls other subroutines or macros based on conditional statements.

Note: This description is limited by the code's complexity and the need to infer underlying logic without direct access to the entire application context.

Chunk 7

Detailed Description of VBA Code

This VBA code appears to be part of a Microsoft Excel add-in or a custom form, and it performs various calculations and checks based on user input.

Conditional Logic

The code starts by checking if a specific condition (DSF$ = "NONE") is met. If true, it sets NoDataSheets% to 0. Otherwise, it checks the value of DSF$ against two other conditions ("REQ'D" and any other non-None value) and sets NoDataSheets% accordingly.

Calculation Part

The code then enters a new section labeled "CalcPart", which performs several calculations:

  1. Resets various form fields to zero.
  2. Sets the calculation status to 0.
  3. Checks if certain input fields are empty or have default values (e.g., ItsAZero!(currform![FirstDim])).
  4. Extracts values from specific columns of the current form field (Gp$ = currform!Field113.Column(1)).

Blank and Part Dimensions

The code then checks if a "Rotate Sheet for Blanks" condition is met (If RotateBlank \u003c\u003e 0 Then). If true, it updates Sheet_Width! and Sheet_Length! based on the rotated sheet's dimensions.

It also sets up various variables related to blank dimensions (e.g., Location%, PricePerLB!, PurchaseBlank%) using input values from columns of the current form field (itsaNull$(currform!Field113.Column(11))).

CNC Operations

The code checks if a specific CNC operation is selected (Multi$ \u003c\u003e "NO CNC"). If true, it sets RotateBlank to 0.

It also extracts various punch die and presser options from the form field (PunchCounter%, PunchPresserOptions%).

The code searches for a primary CNC machine matching the part number entered by the user. It:

  1. Creates a dynaset connection to the MachinesQ1 recordset.
  2. Sets search criteria using the part number.
  3. Loops through the results until it finds a match.

If a match is found, it sets MachQSet to that recordset and updates the form field caption (currform!txtCalcStat.Caption = "MP - look for primary machine").

Form Field Updates

The code updates various form fields based on user input, including:

  • Calculated values (e.g., lb_per_sq_ft!, PricePerLB!)
  • Conditional display or hiding of other form fields (e.g., currform!lblCalcStat.Visible = False)

Overall, this code appears to be part of a larger system that provides calculations and checks for CNC operations, including blank dimensions, punch die and presser options, and primary CNC machine searches.

Chunk 8

Code Overview

The provided VBA code appears to be a part of an application used for calculating material weights and related calculations. It checks various conditions, performs calculations, and updates form values based on user input.

Section 1: Machining Setup

If MachQSet!Prime = True Then
    If MachQSet!Tool \u003c\u003e "SHR" Then

        If PMachine$ \u003c\u003e "" Then
            currform![CalculationStatus] = 16
            Call ErrorMessages
            Exit Sub
        End If

        PMachine$ = MachQSet!MachineName
        PWC1$ = MachQSet!Tool
        PCTime! = MachQSet!CycleTime
    End If
End If

This section checks if the machining setup is valid. It verifies that:

  • The machine name is not empty (PMachine$ \u003c\u003e "").
  • The tool used is not "SHR" (MachQSet!Tool \u003c\u003e "SHR").

If these conditions are met, it updates the form values and proceeds with the next steps.

Section 2: Find Next Occurrence

MachQSet.FindNext Criteria$
DoEvents
Loop

This section finds the next occurrence in the MachQSet table based on the specified criteria. It repeatedly loops until no more occurrences are found, allowing for dynamic processing of subsequent records.

Section 3: Error Handling and Form Updates

If (PMachine$ = "") And (Multi$ \u003c\u003e "NO CNC") And (Multi$ \u003c\u003e "BLANK") Then
    currform![CalculationStatus] = 15
    Call ErrorMessages
    Exit Sub
End If

...

If Multi$ = "LASER" Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
    Part_Width! = (Sheet_Width! / Parts_Per_blank) - Pt_Width!
    Bottom_Trim_Cut! = 0
    TOP_TRIM_CUT! = 0

If (Multi$ = "LASER/SHEAR") Then

    Part_Width! = (Second_dim! / Parts_Per_blank) - Pt_Width!
End If

This section checks for various conditions, including:

  • Error handling: It ensures that the form fields are updated correctly and handles errors as needed.
  • Material type calculation: Based on the multi-value selection (Multi$), it calculates the part width, bottom trim cut, and top trim cut values.

Section 4: Cell Deburr Types and Metal Name

Celltype$ = UCase$(currform![CellDeburrTypes])
MetalName$ = UCase(currform!Field113.Column(0))

If Celltype = "TIME SAVER" Then
    If ((Not (InStr(MetalName$, "COLD ROLL") = 0) And (Not (InStr(MetalName$, "S/S") = 0)))) Then
        ' aluminized
        currform![CalculationStatus] = 19
        Call ErrorMessages
        Exit Sub
    End If
End If

...

Celltype$ = UCase$(currform![CellDeburrTypes])

This section updates the cell deburr types and metal name based on user input. It also includes a check for time-saving materials, which triggers an error message if certain keywords are present in the metal name.

Section 5: Material Weight Calculation

If Multi$ \u003c\u003e "BLANK" Then
    Calcerr0% = currform![CalculationStatus]
    GoSub CalcMaterialWt
    calcerr1% = currform![CalculationStatus]
    aw1! = Gw!
    aw2! = 0

If alt = 1 And Multi$ \u003c\u003e "MULTIPLE" Then
    currentMetal$ = currform![MetalType]
    currform![MetalType] = itsaNull$(currform!Field113.Column(7))

This section initiates the material weight calculation process for non-blank values of Multi$. It calls a subroutine (CalcMaterialWt`) and updates form fields accordingly.

Section 6: Final Calculations

If (First_Dim! = 0) Or (Second_dim! = 0) Or (lb_per_sq_ft! = 0) Then
    currform![CalculationStatus] = 6
    Call ErrorMessages
    Exit Sub
End If

...

lb_per_sq_ft! = ItsAZero!(currform!Field113.Column(5))

This section checks for potential errors in the calculations, such as missing dimensions (First_Dim and Second_dim) or zero weight per square foot (lb_per_sq_ft). If any of these values are incorrect, it triggers an error message.

Chunk 9

VBA Code Description

This VBA code appears to be part of a larger program for calculating the weight and cost of materials for metal parts. The code is organized into several sections, each handling specific calculations and validation checks.

Section 1: Calculation and Validation


The first section calculates various parameters based on user input. It:

  • Checks if certain fields are zero or blank (ItsAZero!(currform!Field113.Column(x))) and assigns default values if necessary.
  • Calculates the calculation status and sets it to Calcerr0% if required calculations need to be performed.
  • Calls the CalcMaterialWt subroutine to calculate material weights.

Section 2: Rotation and Blank Handling


The second section checks for blank rotation requirements:

  • Checks if the GrainShear field is zero or blank (ItsAZero!(currform![GrainShear])) and assigns a default value of 0 if necessary.
  • If not, it sets RotateBlank to 1, which affects subsequent calculations.

Section 3: Density Change


The third section calculates the density change:

  • Checks if certain fields are zero or blank (ItsAZero!(currform!Field113.Column(x))) and assigns default values if necessary.
  • Calculates lb_per_sq_ft! based on user input.

Section 4: Main Logic


The main logic of the code is executed when currform![CalculationStatus] = 0. It:

  • Calls the DoAnswers subroutine to perform additional calculations and validation checks.
  • Checks if the part size is suitable for a time saver (currform!ActualPartHeight \u003c 5 and currform!ActualPartWidth \u003c 5) and sets an error message if not.
  • Checks if the bottom trim cut or top trim cut exceeds certain values, setting an error message if necessary. Also checks if the multiple value is set to "MULTIPLE".
  • Calls the MakeProcesses subroutine and the CalcPrice subroutine (not shown in this code snippet).
  • Calculates the blank weight and sets a warning message if it exceeds 50 pounds.

Section 5: DoAnswers Subroutine


The DoAnswers subroutine performs additional calculations and validation checks:

  • Checks if the multiple value is set to "BLANK" and assigns a default direction value (FirstCutDir%) if necessary.
  • Selects a case based on the direction value:
    • For "MULTIPLE", "LASER", "SALVAGNINI", "LASER/SHEAR", or "SLUG" values, it calls CalcMultGrossWeight and calculates the gross weight.
    • Otherwise, it calls CalcGrossWeight, checks if the result is valid (RC% \u003c\u003e 0), and assigns an error message if necessary. It also sets the actual part height and width.

Key Functions and Subroutines

  • ItsAZero!(currform!Field113.Column(x)): Checks if a field value is zero or blank.
  • GoSub CalcMaterialWt: Calls the CalcMaterialWt subroutine to calculate material weights.
  • GoSub DoAnswers: Calls the DoAnswers subroutine for additional calculations and validation checks.
  • CalcMultGrossWeight, CalcGrossWeight, MakeProcesses, CalcPrice, and PurgeCNCs: These are assumed to be defined elsewhere in the codebase.

Notes

This VBA code appears to be part of a larger program for calculating metal part weights and costs. The code is organized into sections, each handling specific calculations and validation checks. The code uses various functions and subroutines to perform these tasks.

Chunk 10

Code Description

This VBA code appears to be part of a larger program used for calculating costs and properties of metal parts. The code is organized into several sections, each handling specific calculations and updates to the form data.

Section 1: Initial Checks and Updates

If (Multi$ \u003c\u003e "LASER") And (Multi$ \u003c\u003e "SALVAGNINI") And (Multi$ \u003c\u003e "LASER/SHEAR") Or (Multi$ = "SLUG") Then
    currform![PartHeight] = First_Dim!
End If

This section checks the value of Multi$ and updates the PartHeight field in the form data if it matches specific conditions.

FirstCut! = First_Dim!
SecondCut! = Second_dim!

These lines update two additional form fields, FirstCut and SecondCut, with values from previously defined variables.

Section 2: Shear Direction and Cut Length

If ExtraShear% Then
    fc$ = "Along Second Dimension"
    currform!GrDirOpt = 2
Else
    fc$ = "Along First Dimension"
    currform!GrDirOpt = 1
End If

This section determines the shear direction and updates corresponding form fields based on the value of ExtraShear.

Section 3: Case Logic

Case 2
    Call CalcGrossWeight(Second_dim!, First_Dim!, Gw!, Aw!, RC%)
    If RC% \u003c\u003e 0 Then
        currform![CalculationStatus] = RC%
        Call ErrorMessages
    End If

This section handles a specific case logic, calling the CalcGrossWeight function and updating form fields based on its return value.

Section 4: Grain Direction and Part Properties

fc$ = "Along Second Dimension"
currform!GrDirOpt = 2
If (Multi$ \u003c\u003e "LASER") And (Multi$ \u003c\u003e "SALVAGNINI") And (Multi$ \u003c\u003e "LASER/SHEAR") Or (Multi$ = "SLUG") Then
    currform![PartHeight] = Second_dim!
End If
currform![ActualPartHeight] = Second_dim!
currform![ActualPartWidth] = First_Dim!
FirstCut! = Second_dim!
SecondCut! = First_Dim!

This section updates form fields with values from the Second_dim variable and sets up part properties.

Section 5: Deburr Type and Celltype$

If (currform![ActualPartHeight] \u003e= 19) Or (currform![ActualPartWidth] \u003e= 19) Then
    currform![CellDeburrTypes] = "Hand Deburr"
    Celltype$ = UCase$(currform![CellDeburrTypes])
End If

This section checks for deburring conditions and updates the Celltype field accordingly.

Section 6: Calculation and Updating Form Fields

If FirstCutDir% = 0 Then
    currform![CalculationStatus] = 1
Else
    Call CalcActualWt(Actual_PartHeight!, Actual_PartWidth!, Aw!) 'per Rick Bergeson 10-Oct-2006

This section handles a specific calculation and updates form fields based on the result.

Section 7: Cost Calculations

CalcPrice:
'
'  Cost Calculations
'
Call CalcLaborCost(LaborTot!)
If PurchaseBlank% Then
    currform![MaterialCost] = Val(Format(PricePerLB!, "#####0.####"))
Else
    currform![MaterialCost] = Val(Format(Gw! * PricePerLB!, "#####0.####"))
End If

This section performs cost calculations using the CalcLaborCost and updates form fields with material costs.

currform![PartCost] = currform![MaterialCost] + currform![LaborCost]
Debug.Print currform![MaterialCost], currform![LaborCost], currform![PartCost]
Return

These lines update the part cost and print debug information to the console.

Chunk 11

Code Description

This is a VBA script written in Microsoft Access, which appears to be part of an application for calculating material weights and cutting directions for CNC parts. The code consists of three main sections: conditional logic, calculation functions, and error handling.

Conditional Logic


The first section checks the values of various variables and sets the CalculationStatus field in a form object (currform) to different values based on these conditions:

* If the part is not for CNC (Multi$ = "NO CNC") and the punch press option is set to 2, update the calculation status.
* If the part is for multiple parts (Multi$ = "MULTIPLE", etc.) or laser/shear operations, check additional conditions before updating the calculation status.

Calculation Functions


The script then calls various calculation functions to determine the material weight and cutting direction:

* Call CalcMultGrossWeight with first dimension, second dimension, gross weight, and other parameters.
* Call CalcGrossWeight with different combinations of dimensions, gross weights, and parameters.

These calculations appear to be used to determine the material weight and cutting direction based on various factors, such as part type, operation, and dimensions.

Error Handling


The script includes error handling mechanisms:

* Call ErrorMessages to display an error message if a calculation returns a non-zero value.
* GoTo Bad_Record if an error occurs while processing the data.

This section ensures that any errors encountered during calculations are handled and reported to the user.

Button Click Event


The Calculate_Button event appears to be triggered when a button is clicked. It:

* Displays a loading message using DoCmd.Hourglass True.
* Checks if the part number field is not empty.
* Retrieves the value of the Field113 column in the current recordset (Gp$).

This section likely handles the button click event and starts the calculation process.

Initialize Form Data


The Calculate_All function initializes the form data by:

* Refreshing the current form object.
* Retrieving the part number from the database.

This section sets up the initial conditions for calculating material weights and cutting directions.

Chunk 12

Here is a detailed Markdown description of the provided VBA code:

Main Procedure

The main procedure is an subroutine that contains various error handling and calculation methods for a CNC milling machine. It checks for different errors and handles them accordingly.

Error Handling

The code uses On Error GoTo statements to redirect the execution flow when an error occurs. There are several error handling cases:

  • NoMaterialSelected: Sets the CalculationStatus field of the form to 11.
  • NoFirstDim: Sets the CalculationStatus field of the form to 12.
  • NoCutType: Sets the CalculationStatus field of the form to 13.
  • NoDeburr: Sets the CalculationStatus field of the form to 14.
  • Bad_Record: Sets the CalculationStatus field of the form to 7 and resumes execution.

Calculation Methods

The code defines a Function CalculateRec() that calls the Calculate_All() method. This function is not shown in the provided code snippet but is likely responsible for performing various calculations based on the input parameters.

CNC Operations

The code contains several subroutines related to CNC operations:

  • CheckGrainShear(): Checks if a specific type of cut (e.g., Laser, Salvagnini) is being used and updates the visibility of certain form fields accordingly.
  • ckPrimaryScreen(): Updates the DocName$ variable based on whether the "Process Sheet" or "14 Process Sheet" template is being used.

CNC Database Selection

The code defines a subroutine called CNC_Verbage() that takes a database selection value (DbSel%) and performs various actions:

  • For DbSel% = 1, it checks if an additional hand deburr operation needs to be performed. If so, it updates the vb$ variable with the corresponding text and adds "HANDDEBURR" to the CNC database.
  • For DbSel% = 2, it performs a more complex set of actions based on the value of Multi$. This includes updating the prm$ variable and adding "TIMESAVER" to the CNC database.
  • For DbSel% = 3, it performs an additional check for hand deburr operations and updates the vb$ variable accordingly.

Note that some parts of the code, such as the ds_add() method, are not shown in the provided snippet and may require additional context or knowledge to fully understand.

Chunk 13

Detailed Markdown Description of VBA Code

This VBA code appears to be part of a larger program, likely used for generating text descriptions or instructions related to metalworking processes. The code is structured around different cases, each representing a specific process or set of processes.

Overview

The code initializes an empty string vb$ and appends various phrases and keywords to it based on the current case number. These phrases describe hand deburring operations performed on edges of a workpiece.

Detailed Breakdown

  1. Initial Case (Case 1)

    • The code appends the phrase "SHEAR \u0026 HAND DEBURR (1) EDGE" to vb$.
    • It then calls the ds_add subroutine, adding an entry with key "HANDDEBURR" and value "AEdg". This suggests that this case is related to deburring a single edge using hand deburr tools.
  2. Subsequent Cases (Cases 4-9)

    • These cases follow similar patterns:
      • Append phrases to vb$ describing the specific processes.
      • Call ds_add subroutine with relevant keys and values, adding entries for "HANDDEBURR", "PEDESTAL", and/or "MULTSHEAR".
    • The process description and deburring details change based on whether an additional hand deburr operation is performed (AddnlHandDeburr!() = 0).
  3. Timing-Saving Operations (Case 7)

    • In this case, the code appends a description mentioning the use of a timesaver device.
    • The key "TIMESAVER" and value "SHRD" are added to the ds_add subroutine.
  4. Multi-Tool Processes (Cases 8 and 9)

    • These cases describe processes involving multiple tools, including shears, deburrers, and pedestal grinders.
    • They append phrases to vb$, add entries for "HANDDEBURR", "PEDESTAL", and "MULTSHEAR" using ds_add subroutine.

Conclusion

This VBA code is used to generate descriptive text related to various metalworking processes, specifically hand deburring operations. It uses conditional logic based on case numbers to determine the exact process details, including additional tools or techniques.

Chunk 14

VBA Code Description

This VBA code appears to be part of a larger application that automates various machining operations. The code is organized around different cases, each corresponding to a specific operation or setup.

Case 10: TimeSaver with Multishear

  • Adds the "TIME-SAVER" and "MULTISHEAR" commands to the ds object array.
  • Appends additional text to the vb$ string variable indicating the use of TimeSaver for shearing.
  • Calls the Add_Shear_Verbage subroutine with the updated vb$ string.

Case 11: Slug Operation

  • Checks if the Multi$ variable is set to "LASER", "SALVAGNINI", or a combination thereof.
  • If true, sets the slugispart% variable to False and extracts the prm$ value from the PMachine string.
  • Selects a specific case based on the prm$ value:
    • If the selected case indicates a need for hand deburring, adds the "HANDDEBURR" command to the ds object array.
    • Updates the vb$ string variable accordingly.

Case 12: Hand Deburring with Pedestal Grinder

  • Checks if the AddnlHandDeburr! function returns a non-zero value.
  • If true, updates the vb$ string variable to indicate hand deburring using a pedestal grinder.
  • Adds the "HANDDEBURR" command to the ds object array.

Case 13: Hand Deburring with Shear

  • Checks if the AddnlHandDeburr! function returns a non-zero value.
  • If true, updates the vb$ string variable to indicate hand deburring with shear.
  • Adds the "HANDDEBURR" command to the ds object array.

Case 14: Multishear

  • Updates the vb$ string variable to indicate multishear operation.
  • Calls the Add_Shear_Verbage subroutine with the updated vb$ string.

Case 15: TimeSaver and Multishear

  • Updates the vb$ string variable to indicate use of TimeSaver for shearing.
  • Adds the "TIME-SAVER" command to the ds object array.

Case 16: TimeSaver, Multishear, and Shear

  • Updates the vb$ string variable to indicate use of TimeSaver for shearing.
  • Calls the Add_Shear_Verbage subroutine with the updated vb$ string.

Default Case

The code includes an "Else" clause that handles any cases not explicitly covered by the previous cases. However, the exact behavior in this default case is unclear without further context or code.

Chunk 15

CutTypeFormSettings Subroutine

The CutTypeFormSettings subroutine is a VBA function that dynamically sets the visibility of various form controls within a user interface based on the current value of the currform.CutType property.

Functionality

This subroutine is designed to display or hide different sections of a form depending on the type of cutting operation selected. The form contains various input fields, buttons, and labels that are used to configure settings for cutting operations such as single part cuts, multiple part cuts, laser cuts, and CNC tape calculations.

Conditional Logic

The subroutine uses a Select Case statement to evaluate the value of currform.CutType. Based on the value, it sets the visibility of different form controls using the Visible property. The conditions are as follows:

  • Single: Shows fields related to single part cuts, such as rotation blank settings and parts per blank.
  • Multiple: Displays fields for multiple part cuts, including rotation blank settings and blanks per block.
  • Laser, Laser/Shear, Slug, Salvagnini: Shows fields associated with laser cutting operations, including rotation blank settings and CNC tape calculations. Also displays blanks per block field when "Laser/Shear" is selected.
  • No CNC: Hides all fields related to CNC operations.

Control Visibility

The subroutine sets the visibility of various controls as follows:

  • chkRotateBlank and lblRotateBlank: Always visible or hidden based on the cut type.
  • PartsPerBlank, BotTrimCut, PartWidth, TopTrimCut, SubForm2, Button200, CalcCNCtape, Text232, and EntPartHeight: Visible or hidden depending on the selected cut type.
  • BlanksPerBlock: Visible or hidden based on the selected cut type, with special handling for "Laser/Shear" cuts.

Exit Sub

If no specific cut type is selected (i.e., an unknown value), the subroutine uses the default case to set all controls to their visible state.

By using this subroutine, the user interface can be dynamically configured based on the selected cutting operation, providing a more adaptive and user-friendly experience.

Chunk 16

Detailed Description of VBA Code

This VBA code is written in Access and appears to be a part of a larger application for managing machine parts. It consists of two main subroutines: UpdateForm and Delete_Part.

UpdateForm Subroutine

The UpdateForm subroutine is responsible for updating the visibility of various controls on a form (currform) based on different conditions.

**Visibility Control Logic**

The subroutine uses a `Select Case` statement to determine the visibility of several controls. The case values are "Blank" and "Else".

*   When the condition is "Blank", certain controls become visible, while others remain hidden or are set to invisible.
*   Conversely, when the condition is not "Blank", the opposite logic applies.

**Key Control Visibility Logic**

```markdown
' Blank conditions
currform!chkRotateBlank.Visible = True
currform!lblRotateBlank.Visible = True

currform!PartsPerBlank.Visible = False
currform!BotTrimCut.Visible = False
currform!TopTrimCut.Visible = False
currform!PartWidth.Visible = False
currform!SubForm2.Visible = False
currform!Button200.Visible = False
currform!CalcCNCtape.Visible = False
currform!Text232.Visible = False
currform!EntPartHeight.Visible = False

' Else conditions
currform!chkRotateBlank.Visible = False
currform!lblRotateBlank.Visible = False

currform!PartsPerBlank.Visible = False
currform!BotTrimCut.Visible = False
currform!TopTrimCut.Visible = False
currform!PartWidth.Visible = False
currform!SubForm2.Visible = False
currform!Button200.Visible = False
currform!CalcCNCtape.Visible = False
currform!Text232.Visible = False
currform!EntPartHeight.Visible = False

Delete_Part Subroutine

The Delete_Part subroutine performs the following tasks:

**Database and Form Management**

*   Establishes connections to various databases (`MainDB`, `Main2DB`, `MachNamesDB`, `MachQDB`) and sets up Recordsets (`MainSet`, `Main2Set`, `MachNamesSet`, `MachQSet`).
*   Refreshes the current form (`currform`) and retrieves the part number from the `PartNumber` control.

**Delete Part Logic**

The subroutine checks for the existence of a record with the specified part number in the main database. If a match is found, it moves to the previous or first occurrence and then deletes the record if necessary.

```markdown
GoSub OPEN_Machs
GoSub DeleteEm

MainSet.Seek "\u003e=", PN$
If Not (MainSet.NoMatch) Then
    MainSet.MovePrevious
    If Not (MainSet.BOF) Then
        px$ = MainSet!PartNumber
    End If
End If

Do While Trim$(MainSet!PartNumber) = PN$
    MainSet.Delete
    MainSet.MoveNext
    If (MainSet.EOF) Then Exit Do
Loop

Exit and Cleanup

The subroutine exits the Delete_Part procedure if no matches are found. It then cleans up by moving to the next part number in the main database (GoSub OPEN_Machs) and deleting any remaining records.

DeleteEm:
MainSet.Seek "\u003e=", PN$
If Not (MainSet.NoMatch) Then
    Do While Trim$(MainSet!PartNumber) = PN$
        MainSet.Delete
        MainSet.MoveNext
        If (MainSet.EOF) Then Exit Do
Loop

Additional Logic

The subroutine also performs additional logic, including updating the material information display and calling two subroutines (CheckGrainShear and PunchPressOptions) to handle grain shear and punch press options.

Chunk 17

VBA Code Description

This VBA code is used to open and interact with various databases in a Microsoft Access environment. The code consists of two main subroutines: Det_CNC_Highest_Runtime and the OPEN_* subroutines.

OPEN_* Subroutines

The OPEN_* subroutines are used to open multiple dynamic recordsets (dynaset) in separate databases (MainDB, Main2DB, etc.). The subroutines set the index for each recordset and then return, indicating that the dynaset is now available for use.

Each OPEN_* subroutine follows a similar pattern:

  1. Open a new dynaset using MainDB.OpenRecordset("Table Name", DB_OPEN_TABLE).
  2. Set the index for the recordset using MainSet.Index = "Index Field".
  3. Return, indicating that the dynaset is now available.

The subroutines are used to access different databases and tables, such as:

  • OPEN_Mains: opens the Process, Main2DB, and other records.
  • OPEN_Addnl: opens the AddnlProc recordset.
  • OPEN_Machs: opens the Machines recordset.
  • Open_Data: opens the DataSheet recordset.
  • OPEN_Press: opens the PressBrakeOps recordset.

Det_CNC_Highest_Runtime Subroutine

The Det_CNC_Highest_Runtime subroutine is used to find the CNC machine with the highest runtime for a given part number. The subroutine takes three parameters:

  • PartN$: the part number to search for.
  • CNC_Highest_RunTime!: the variable to store the highest runtime.
  • REPOSITION_FLAG$: an optional parameter (not used in this code snippet).

The subroutine follows these steps:

  1. Sets the criteria for the search using Criteria$ = "PartNumber = '" + PartN$ + "'".
  2. Opens a new dynaset using MachQDB.OpenRecordset("MachinesQ1", DB_OPEN_DYNASET).
  3. Finds the first occurrence of the criteria and extracts relevant data from the recordset.
  4. Loops through the remaining records in the dynaset, finding the next occurrence of the criteria and extracting relevant data.
  5. Stores the highest runtime in the CNC_Highest_RunTime! variable.

However, this code snippet is incomplete, as it contains an error handling block (On Error GoTo toolset) that is not properly implemented. The code also appears to be missing some necessary steps or variables (e.g., MAX_PERCENTAGE_OVER_LOWEST_RUNTIME, MachNQDB, and MachNQSet).

Chunk 18

Code Description

This VBA code is a combination of two separate subroutines: Det_CNC_Standard and an unnamed subroutine that appears to be responsible for finding CNC tooling information.

Unnamed Subroutine

Purpose

The unnamed subroutine's purpose is to find the highest runtime of a specific machine (CNC) tool. It iterates through a database of CNC tools, calculates their runtimes, and updates variables MAX_HIGHEST_RUNTIME and CNC_Highest_RunTime.

Steps:

  1. The code starts by setting up initial values for LOWEST_RUNTIME, REPOSITION_FLAG$, and the machine names MN$.
  2. It then loops through the database using MachQSet.FindNext Criteria$ until it finds a matching record.
  3. For each match, it extracts relevant information (cycle time, tool name, etc.) from the database and calculates the runtime.
  4. The code checks if the machine name matches certain criteria (C-1000 or C-2000) to determine whether to update the ck variable.
  5. If the ck variable is 1, it updates the CNC_Highest_RunTime variable and sets the REPOSITION_FLAG$.
  6. The code repeats steps 2-5 until all records are processed.

Variables Used:

  • MachQSet: an object that provides access to a database of CNC tools
  • Cy!: the cycle time of a machine
  • LOWEST_RUNTIME, CNC_Highest_RunTime: variables that store the lowest and highest runtime values, respectively
  • REPOSITION_FLAG$: a flag that indicates whether a tool needs repositioning
  • ck: a variable used to determine whether a tool is eligible for consideration

Error Handling:

The code includes an error handling mechanism (toolset) that catches any errors that occur during the execution of the loops. If an error occurs, it sets TL$ to an empty string and resumes processing.

Subroutine Det_CNC_Standard

Purpose

This subroutine is responsible for determining the CNC standard based on certain conditions.

Steps:

  1. The code starts by activating a form (currform) and setting up variables related to the CNC standard calculation.
  2. It then checks if the machine name PMachine$ matches specific criteria (e.g., "C-3000" or "V-1000").
  3. Depending on the match, it adjusts the CNC_Pfd value.
  4. The code calculates the blank weight and uses it to determine the load and unload times for a press operation.
  5. It then sets up variables related to the calculation of the CNC standard.

Variables Used:

  • CNC_Pfd: a variable that stores the CNC pressure feed rate
  • Blank_wt: the blank weight used in calculating the load and unload times
  • LOAD_TIME, UNLOAD_TIME: variables that store the load and unload times, respectively

Calculation of CNC Standard:

The code includes calculations for the CNC standard based on the machine name and blank weight. These calculations involve multiplying the lowest runtime value by a percentage over the lowest runtime (MAX_PERCENTAGE_OVER_LOWEST_RUNTIME).

Chunk 19

CNC Standard Time Calculation and Deburr Run Times

This VBA code calculates the standard time for a CNC operation, including deburr run times, based on various parameters. The calculation involves multiple steps and subroutines.

Section 1: Calculating Unload Time

The first section of the code determines the unload time based on the Blank Weight (Blank_wt). The unload time is calculated using a series of If statements:

  • If Blank_wt is between 4 and 8, the unload time is set to 0.04 seconds.
  • If Blank_wt is between 8 and 12, the unload time is set to 0.041 seconds.
  • If Blank_wt is between 12 and 20, the unload time is set to 0.042 seconds.
  • If Blank_wt is greater than 20, the unload time is set to 0.043 seconds.

Section 2: Calculating Standard Time

The second section of the code calculates the standard time for the CNC operation:

  1. Calculating Machine Cycle: The machine cycle is calculated by dividing the highest run time (CNC_Highest_RunTime) by 60.
  2. Assigning values to Elements: Values are assigned to specific elements in the spreadsheet:
    • Elem!(23) = CNC_Highest_RunTime
    • Elem!(24) = 60
    • Elem!(22) = Machine Cycle
  3. Checking Reposition Flag: If the Reposition Flag (Repostition_Flag$) is set to "R/S", the standard time is set to the repositioning time (REPOSITION_TIME).
  4. Adding Major Dimension Time: If either the first or second dimension is greater than the major dimension, an additional amount of time is added to the standard time (Major_Dim_Time).

Section 3: Calculating Standard Time Components

The third section of the code calculates various components that contribute to the standard time:

  1. Calculating Load Time: The load time is assigned to Elem!(6).
  2. Calculating Activate Press Time: The activate press time is assigned to Elem!(10).
  3. Calculating Unload Time: The unload time is assigned to Elem!(18).
  4. Calculating Paper Work: The paper work is assigned to CNC and then calculated based on the total select time (Elem!(1)), parts per blank (ppb), and an overhead factor (CNC_Pfd).

Section 4: Deburr Run Times

The fourth section of the code calculates deburr run times using various subroutines:

  • Det_Deburr_Run_Times: This subroutine performs multiple calculations, including:
    • Calculating RU_PER_PACE (paces per unit)
    • Determining deburr run times for different operations (SHEAR, TS, HDB1, HDB2, hdb4)
  • Calc_Mult_Hnd_DB to Calc_Shear: These subroutines perform calculations related to the deburr run times.

Section 5: Final Calculations and Assignments

The final section of the code assigns values to elements in the spreadsheet based on the calculated standard time:

  1. Assigning standard time: The standard time (CNC_STD) is assigned to CNC.
  2. Calculating Deburr Run Times: Various deburr run times are calculated and assigned to specific elements.

Overall, this VBA code calculates the standard time for a CNC operation, including deburr run times, based on various parameters and subroutines.

Chunk 20

Pedestal Grinder Simulation Subroutine

This VBA subroutine simulates the operation of a pedestal grinder, calculating the processing time for each process step and determining the quickest completion time.

Variables and Constants

  • ahdb!: Accumulated height of material
  • PDB1!, PDB2!, PDB4!: Processing times for different processes
  • RU_PER_PACE: Rate per pace value
  • CNCTime!: Connection time limit
  • Complete%: Completion percentage
  • Quickest: Index of the quickest process step
  • dbproc: Process index (from 1 to 16)
  • dbtype!(dbproc, 0), dbt!: Data type values for processes
  • SHEAR!, TShear!: Shear and timesaver values
  • HDB1!, HDB2!, hdb4!: HDB values
  • MultiNoParts: Multiplier value for parts count

Subroutine Flow

The subroutine starts by initializing variables and constants.

  1. Calculate processing times: The subroutine calls the Det_Pedestal_Grinder_Standard function to calculate the processing times for each process step (PDB1!, PDB2!, PDB4!). These values are then multiplied by 60 to convert them from seconds to minutes.
  2. Loop through process steps: The subroutine loops through the process steps (from 1 to 16) and checks if the current process is a pedestal grinder process (dbtype!(dbproc, 0) = 1).
  3. Update completion time: If the current process is a pedestal grinder process, the subroutine updates the completion time using the Quickest variable.
  4. Check connection time limit: The subroutine checks if the calculated completion time exceeds the connection time limit (CNCTime!). If it does, the completion time is set to 1 (i.e., complete).
  5. Exit loop early: If the completion time is complete, the subroutine exits the loop.
  6. Update Quickest process: The subroutine updates the Quickest variable with the index of the quickest process step.

Process Step Subroutines

The subroutine contains several process step subroutines (dbp1 to dbp9) that calculate the processing time for each process step. These subroutines update the Complete%, Paces!, and dbt! variables based on the calculated processing time.

Each process step subroutine follows a similar pattern:

  • Calculate the processing time using the Det_Pedestal_Grinder_Standard function.
  • Update the Complete% variable based on the processing time.
  • Update the Paces! variable based on the processing time.
  • Return to exit the sub routine.

Exit Subroutine

The subroutine exits by calling the Exit Sub statement, which ends the subroutine execution.

Chunk 21

Detailed Markdown Description of VBA Code

Overview

This VBA code is used to calculate labor time for hand deburring operations in a manufacturing process. It determines the required labor time based on various factors such as part dimensions, deburring method, and additional features.

Database Operations

The code operates on a database system, using variables such as dbp10, dbt!, Paces!, and % to store and retrieve data. The variables are used to calculate the labor time for different deburring operations (e.g., dbp11) and update the database accordingly.

Subroutine: Det_HandDeburr

This subroutine is the main entry point of the code, taking three parameters:

  • Labor!: Output variable to store the total labor time.
  • Rstd!: Output variable to store the standard hours.
  • HDB%: Input variable representing the deburring method (1-5).

The subroutine performs the following tasks:

  1. Deburring Method Determination: Based on the value of HDB%, it determines the required labor time and updates the variables accordingly.

  2. Part Dimension Calculation: It calculates the part dimensions, including the length, width, and height, based on the deburring method.

  3. Additional Features: For certain deburring methods (e.g., HDB = 4), it adds additional features to the part, such as top trim cut, and updates the part dimensions accordingly.

  4. Labor Time Calculation: It calculates the labor time using the updated part dimensions and additional features.

  5. Database Update: The subroutine calls another function (Elem_Add) to update the database with the calculated labor time.

  6. Variable Updates: It updates various variables, including dbt!, Paces!, %, and others, based on the deburring operation.

Calculation Logic

The code uses a combination of arithmetic operations, conditional statements, and loops to calculate the labor time for different deburring operations. The calculations are based on the part dimensions, deburring method, and additional features.

Here's a simplified explanation of the calculation logic:

  • For HDB = 1, it calculates the labor time as twice the actual part width.
  • For HDB = 2, it calculates the labor time as twice the actual part length.
  • For HDB = 3, it calculates the labor time based on the part height and width, considering additional features like top trim cut.
  • For HDB = 4 and HDB = 5, it uses a different calculation logic to determine the labor time.

The code also updates various variables, such as dbt! and Paces!, based on the deburring operation. The % variable is used to store the completion percentage of the deburring operation.

Overall, this VBA code provides a structured approach to calculating labor time for hand deburring operations in a manufacturing process.

Chunk 22

VBA Code Description

Sub Det_Shake

This subroutine calculates the shake and break time for a specific part.

Purpose

The purpose of this subroutine is to determine the shake and break time for a given part based on its type. The output values are stored in an array called Elem! which can be accessed later in the code.

Parameters

  • ForP$: A string indicating the type of part (e.g., "F" for Fab Shake n Break, "FM" for certain metals and difficulties in safety handling)
  • Rstd!: An output parameter to store the standard time for the part

Code Flow

  1. The subroutine sets up a caption on a form to indicate that it is running.
  2. It retrieves the Part Number from a form called currform.
  3. Based on the value of ForP$, it selects different values for Elem1! and Elem2!. These values are used to calculate the labor time.
  4. The labor time is calculated as the sum of Elem1! and Elem2!.
  5. Other values in the Elem! array are populated with default or calculated values.
  6. The standard time (Rstd!) is set to the value of Elem!(5).
  7. A message is added to a log for the part called "SHAKEBREAK".

Sub Det_LASER_Standard

This subroutine calculates the laser standard time for a specific part.

Purpose

The purpose of this subroutine is to determine the laser standard time for a given part based on its dimensions and machine settings.

Parameters

  • PN$: The Part Number of the part
  • Rstd!: An output parameter to store the standard time for the part
  • ctime!: An input parameter to store the cycle time

Code Flow

  1. The subroutine sets up database objects to interact with a database.
  2. It searches for the first occurrence in a recordset called "MachinesQ1" that matches the Part Number.
  3. Once found, it retrieves the machine name, tool, and cycle time from the recordset.
  4. It calculates the select time based on the dimensions of the part and machine settings.
  5. The standard time (Rstd!) is calculated as a percentage of the select time.
  6. Values in the Elem! array are populated with default or calculated values.
  7. A message is added to a log for the part called "LASER".

Sub Det_Salvagnini_Standard

This subroutine appears incomplete, as it only includes the declaration of variables and does not contain any code.

Purpose

The purpose of this subroutine is to determine the Salvagnini standard time for a specific part. However, due to its incomplete nature, it cannot be executed or provide meaningful results.

Chunk 23

Detailed Markdown Description of VBA Code

Module Overview

This VBA code module appears to be part of an Excel or Access application, utilizing database connections and recordsets to retrieve machine data. The code consists of two primary subroutines: Det_Mult_Shear and the main subroutine with no explicit name.

Main Subroutine Description

Purpose

The main subroutine's purpose is to calculate various statistics for a given part number (PN$) using data retrieved from a database.

Steps:

  1. Set Search Criteria: The code sets the search criteria by concatenating the PartNumber field with a specific string value.
  2. Connect to Database and Open Recordset: The code establishes a connection to a database and opens a dynamic recordset (MachQSet) from the "MachinesQ1" table.
  3. Find First Occurrence of Prime Machine: The code finds the first occurrence of a prime machine in the recordset, extracting relevant fields such as MachineName, Tool, and CycleTime.
  4. Calculate Cycle Time Statistics: The code calculates various statistics based on the retrieved data:
    • Paperwork: A constant value representing paperwork (0.06)
    • pfd: A constant value representing production factor demand (1.1)
    • ctime!: The cycle time
    • SelectTime: The select time calculated by adding Paperwork to the cycle time
    • Mstd!, Rstd!: Standard and rate statistics calculated based on SelectTime
  5. Populate Elements Array: The code populates an Elements array with various statistics, including ct, SelectTime, StandardParts, and more.
  6. Add Element to Database: The code calls a function Elem_Add to add the PartNumber (PN$) and labels "SALV" and "SALVAGNINI" to the database.

Det_Mult_Shear Subroutine Description

Purpose

The Det_Mult_Shear subroutine calculates various statistics for multiple shear runtime, given specific parameters (SHEAR!, TShear!).

Steps:

  1. Set Constants: The code sets constants for Paperwork, pfd, and other values.
  2. Clear Elements Array: The code calls a function Elem_ClearArray to clear the elements array.
  3. Determine Blanket Weight: The code calculates the blanket weight based on the actual part height and width.
  4. Calculate Shear Statistics: The code calculates various statistics for multiple shear runtime, including:
    • SHEAR!, TShear!: Total shear time
    • Elem1 to Elem6: Individual elements in the elements array
    • Blank_wt, Elems3 and 4, Elems5 and 6
  5. Return Statistics: The code returns the calculated statistics (SHEAR! and TShear!)

Chunk 24

Detailed Description of VBA Code

Section 1: Element Array Calculations

The code starts by calculating various values for an element array (Elem!) using the following formulas:

  • Elem!(1) = SHEAR + Paperwork: Calculates the total select time.
  • Elem!(2) = 1: Specifies the number of parts.
  • Elem!(3) = Elem!(1) / Elem!(2): Calculates the total minutes required.
  • Elem!(4) = Elem!(3) * pfd: Calculates the overhead (overhead factor).
  • Elem!(5) = Elem!(4) / 60: Calculates the standard hours.

These calculations are performed for two different contexts: "CONT" and "T/S". The "MULTSHEAR" key is added to the part number (PartN$) in both cases using the Elem_Add function.

Section 2: Sub Det_Pedestal_Grinder_Standard

This subroutine calculates various parameters for a pedestal grinder standard based on input values:

  • DIMENSION_1 and DIMENSION_2: Dimensions of the part
  • Side%: Side number (used to determine which machine to use)
  • RunStd!: Standard running flag
  • Labor!: Labor indicator

The subroutine performs the following tasks:

  • Clears an element array (Elem_ClearArray) to ensure previous calculations are cleared.
  • Sets the current form's part number (PartN$) and calculates the calculation status caption.
  • Sets various constants:
    • Paperwork (1% overhead)
    • PEDESTAL_GRINDER_MACHINE_TIME_PER_INCH (time per inch for the machine)
    • Pedestal_Grinder_Pfd (overhead factor for pedestal grinder)
  • Determines labor settings based on the input value (Labor!):
    • If labor is 1, noelem = 1; otherwise, noelem = 0
    • Calculates blank weight and body movements.
  • Determines single-edge and multiple-edge handling coefficients based on dimension values:
    • The code uses a series of if-else statements to determine the correct coefficients.

Notes

The code appears to be part of an industrial automation or manufacturing system, possibly using Autodesk's AutoCAD and/or other software. The calculations and parameters seem to be related to the calculation of time, labor, and overhead for various machine operations.

Chunk 25

Detailed Description of VBA Code

Subroutine: PEDESTAL_GRINDER_STANDARD

This subroutine calculates the labor hours, machine time, and standard time for a pedestal grinder operation. It takes into account various parameters such as edge deburring, part dimensions, and handling times.

Conditional Calculations

The subroutine uses a Select Case statement to determine the total inches deburred (TOTAL_INCHES_DEBURRED) based on the value of Side%. The corresponding values for Number_Of_Edges_Deburred, typ$, and other variables are then calculated accordingly.

Labor Hours Calculation

The labor hours (Pedestal_Grinder_Labor) are calculated by adding the handling time (Pedestal_Grinder_Handling_Time), machine time (PEDESTAL_GRINDER_MACHINE_TIME), and body movements (Body_Movements). The standard time (Pedestal_Grinder_STD) is then calculated as a percentage of the total labor hours.

Data Writeback

The subroutine writes back calculated values to various elements in an array (Elem!).

  • Labor!: Pedestal Grinder Labor
  • RunStd!: PEDESTAL_GRINDER_STD (Standard Time)
  • Number_Of_Edges_Deburred, typ$, TOTAL_INCHES_DEBURRED, and other variables are written back to their corresponding elements in the array.

Subroutine: DETECT_PRESSBRAKE_STANDARD

This subroutine retrieves data from a database table named "PressBrakes" based on user input. It takes into account various parameters such as warehouse codes, press brake types, and machine numbers.

Database Retrieval

The subroutine uses ADO (ActiveX Data Objects) to connect to the database and retrieve records from the "PressBrakes" table. The retrieved data includes:

  • wc2: Warehouse code
  • wc3, wc4: Machine numbers
  • wc5: Press brake type
  • pressBrake: Press brake number

Conditional Logic

The subroutine checks if a match is found in the database. If a match is found, it updates the user interface (currform!) with the retrieved values.

Other Constants and Variables

The code also defines several constants and variables, including:

  • MULTIPLE_EDGE_HANDLING and SINGLE_EDGE_HANDLING: handling times for multiple and single edges
  • PARTN$, typ$, PEDESTAL_GRINDER_MACHINE_TIME_PER_INCH, Body_Movements, Paperwork, Pedestal_Grinder_Pfd, lb_per_sq_ft!: various constants and variables used throughout the code.

Overall, this VBA code is designed to automate tasks related to pedestal grinder operations, including calculating labor hours, machine time, and standard time. It also retrieves data from a database table for press brake operations.

Chunk 26

VBA Code Description

This VBA code is used to calculate and record various metrics for a process, likely in an assembly line or manufacturing context. The code consists of several sections that handle different scenarios based on the input value Blank_wt.

Select Case Block

The first section of the code uses a Select Case statement to determine the values of elm5, elm7, and frq based on the input value Blank_wt. The case values are:

  • Blank_wt \u003c= 4: assigns elm5 = 0.048, elm7 = 0.032, and frq = 0
  • Blank_wt \u003c= 8: assigns elm5 = 0.071, elm7 = 0.036, and frq = 4
  • Blank_wt \u003c= 12: assigns elm5 = 0.085, elm7 = 0.041, and frq = 8
  • Blank_wt \u003c= 20: assigns elm5 = 0.095, elm7 = 0.045, and frq = 12
  • Else: assigns elm5 = 0.102, elm7 = 0.05, and frq = 16

These values are then used to calculate other metrics.

Calculating Metrics

The code calculates the following metrics:

  1. hits: This is calculated as hits - 1 based on the value of frq.
  2. Totaltime: This is calculated by summing up elm5, elm7, elm9, and elm11.

Recording Metrics to Workbook

The code records the calculated metrics in a workbook using the Elem! array. The recorded values include:

  • Paperwork
  • Totaltime
  • hits
  • PartN$

Creating Table Entries

The code creates table entries for each part using the Call Elem_Add and ds_add functions.

Variables and Constants

Some variables and constants are used in this code:

  • Blank_wt: This is the input value that determines the values of elm5, elm7, and frq.
  • hits: This variable represents a count or number.
  • Totaltime: This variable represents the total time spent on an activity.
  • pfd: This constant is used to calculate Totaltime.

Overall, this code appears to be part of a larger process that tracks and records various metrics for assembly line activities.

Chunk 27

Detailed Description of VBA Code: DET_PEM_Standard

Purpose and Parameters

The DET_PEM_Standard subroutine is designed to calculate the total runtime for a standard part in a production environment. It takes six parameters:

  • r!: The run standard value.
  • hits: The number of presses performed.
  • w2$, W3$, W4$: Work centers (warehouse, work center 3, and work center 4).
  • AM$: Auto or Manual.

Code Execution

Here is a step-by-step breakdown of what the code does:

  1. Initialization

    • It sets up variables for database connections (PemTab and PemTabSet) but does not execute any actions with these variables due to commented-out lines.
  2. Displaying Form Title and Clearing Arrays

    • The form title is changed to "Determine PEM runtime."
    • An array-clearing function called Elem_ClearArray is executed.
  3. Querying Press Tab Set

    • A query is made to retrieve data from a table named "PressTabSet" using the PressBrake value as a filter.
    • The results are assigned to variables w2$, W3$, and W4$, and M$.
    • If no matching records exist, the code sets these variables to their default values.
  4. Calculating Blank Weight

    • A blank weight calculation is performed based on the part type (AM$).
  5. Select Case Statement for Blank Weight

    • The blank_wt value is compared against different ranges, and corresponding values are assigned to variables elm5, elm6, and frq.
    • These values determine various elements in an array.
  6. Calculating Element Values

    • Based on the calculated blank_wt and hits values, the following elements are filled:
      • elem!(0) to elem!(5): Calculated based on blank_wt, hits, frq, and other variables.
  7. Calculating Total Time

    • The total time is calculated using the totaltime variable, which includes the blank weight (Paperwork) and other elements.
  8. Updating Run Standard Value

    • The updated run standard value (r!) is calculated as a percentage of the total time, multiplied by the paper factor (pfd) divided by 60.
  9. Adding Data to Database

    • Finally, data related to the part (part number and type) are added to the database using ds_add and Elem_Add.

Notes

  • The code makes extensive use of global variables and arrays, which may be a sign that it's intended for reuse or modification in a larger application.
  • Some parts of the code appear to be commented out or unused, indicating potential refactoring opportunities.

Overall, this VBA code is designed to perform complex calculations for standard part processing in a production environment. Its structure and variable usage suggest that it may be part of a larger application.

Chunk 28

Detailed Description of VBA Code: Det_Shear_Standard

This VBA code is a sub procedure named Det_Shear_Standard that calculates and determines various statistics for a shear standard. The code appears to be part of an industrial manufacturing process, specifically for cutting and processing metal sheets.

Initialization

The code begins by setting the caption of a control (currform!txtCalcStat) to "Determine shear runtimes." It then calls DoEvents to ensure that any pending events are processed.

Time Setup

The code defines a series of constants representing time values for different stages of the manufacturing process, including:

  • PROGRAM_SETUP_TIME: 0.166 seconds
  • OBTAIN_AND_STARTUP_VACCULIFT: 0.099 seconds
  • WALK_TO_AND_FROM_MATERIAL_Q1, Q2, Q3, and Q4: 0.167, 0.32, 0.5, and 0.667 seconds, respectively
  • OBTAIN_SHEET: 0.18 seconds
  • INSERT_TO_WRKHLDR_AND_STOP: 0.083 seconds
  • ACTIVATE_FOOT_PEDAL and ACTIVATE_START_BUTTON: 0.015 seconds each
  • RateR, PULLMAX_FIXED_FEEDRATE, NIAGRA_FIXED_FEEDRATE, PULLMAX_LAST_PART_EJECT, NIAGRA_LAST_PART_EJECT, PULLMAX_SQUARE_CUT, NIAGRA_SQUARE_CUT: 0.0024, 0.045, 0.028, 0.05, 0.024, 0.045, and 0.028 seconds, respectively
  • REMOVE_SCRAP_AND_ASIDE: 0.039 seconds
  • PICK_UP_AND_MOVE_TO_SHEAR: 0.028 seconds
  • MOVE_AND_POSITION_PEICE: 0.024 seconds
  • REMOVE_REPOSITION_AND_REASSEMBLE: 0.029 seconds
  • Paperwork: 0.4 seconds
  • Shear_Pfd: 1.15 seconds
  • LOT_SIZE_RED_OFFALL: 0.8 + 0.05 (80% Lot size reduction and 5% offall)

Part Number and Sheet Dimensions

The code retrieves the PartNumber from a form control (currform) and calculates the weight of a blank sheet based on the first cut dimensions.

  • PartN$: The retrieved part number.
  • Blank_wt: The calculated weight of a blank sheet (FirstCut * Sheet_Width / 144 * lb_per_sq_ft!).

Spin Blank Calculations

The code determines whether to perform spin blanks for the first and second cuts based on specific conditions.

  • SPIN_BLANK_ON_FIRSTCUT and SPIN_BLANK_ON_SECCUT: Initially set to 0.
  • If (SHEAR_1_OFFALL \u003c 2) And (Blocks_Per_Sheet \u003e 1), then SPIN_BLANK_ON_FIRSTCUT = REMOVE_REPOSITION_AND_REASSEMBLE.
  • If (SHEAR_2_OFFALL \u003c 2) And (Blanks_Per_Block \u003e 1), then SPIN_BLANK_ON_SECCUT = REMOVE_REPOSITION_AND_REASSEMBLE.

Standard Cut Calculations

The code calculates the standard cut times for the first and second cuts based on various constants and user input values, such as ExtraShear%, Multi$.

  • First_Cut_Std: The calculated standard time for the first cut.
  • If ExtraShear%, then First_Cut_Std = (RateR * SecondCut + PULLMAX_FIXED_FEEDRATE) * Blocks_Per_Sheet. Otherwise, First_Cut_Std = (RateR * FirstCut + PULLMAX_FIXED_FEEDRATE) * Blocks_Per_Sheet.

The calculated standard times are added up and adjusted based on various constants and process conditions.

Final Calculations

The code calculates the final standard time for each cut by applying the Shear_Pfd value and a 60-minute factor to the individual standard times.

These calculations are then used in the rest of the program.

The final result is likely used to determine the actual runtime or processing time for the shear standard.

Chunk 29

Calculation of Standard Cut Times for Shear Operations

This VBA code calculates the standard cut times for shear operations, taking into account various factors such as cut type, material feed rates, and labor costs.

Overview

The code consists of two main sections: one for calculating the standard cut time for single cuts (CalcFirstCutStuff) and another for multiple cuts (CalcMultipleCutStuff). The standard cut times are stored in variables Second_Cut_Std and Multiple_Cut_Std, respectively.

Single Cut Calculation

The code begins by initializing the Second_Cut_Std variable to 0. It then calls a series of subroutine references, which perform various tasks such as:

  • Picking up and moving to the shear
  • Positioning a piece on the shear
  • Spinning blank on cut
  • Paperwork handling

The GoSub CalcSecondCutStuff statement jumps to a subroutine that calculates the standard cut time for single cuts.

Second_Cut_Std = Second_Cut_Std + PICK_UP_AND_MOVE_TO_SHEAR
Second_Cut_Std = Second_Cut_Std + MOVE_AND_POSITION_PEICE
Second_Cut_Std = Second_Cut_Std + SPIN_BLANK_ON_SECCUT

The GoSub CalcSecondCutStuff statement executes the following code:

Second_Cut_Std = Second_Cut_Std / Blanks_Per_Block
Second_Cut_Std = Second_Cut_Std * Shear_Pfd
Second_Cut_Std = Second_Cut_Std / 60

These calculations adjust the standard cut time based on the blanks per block, shear pressure factor, and other factors.

Multiple Cut Calculation

The code then checks if ExtraShear% is True. If it is, it sets SPIN_BLANK_ON_SECCUT to 0 and adjusts other variables accordingly.

Case "MULTIPLE"
If ExtraShear% Then
    SPIN_BLANK_ON_SECCUT = 0
    ...

The code then calculates the standard cut time for multiple cuts (Multiple_Cut_Std). It executes a similar series of subroutine references as in the single cut calculation.

Multiple_Cut_Labor = RateR * Bottom_Trim_Cut + NIAGRA_FIXED_FEEDRATE
...
Multiple_Cut_Std = Multiple_Cut_Labor

The code then adjusts Multiple_Cut_Std based on parts per blank and shear pressure factor.

Labor Cost Calculation

The code calculates labor costs for multiple cuts (Multiple_Cut_Labor). It considers factors such as:

  • Top trim cut time
  • Bottom trim cut time
  • Material feed rates
  • Labor cost multipliers (e.g., RateR, NIAGRA_FIXED_FEEDRATE)
Number_Of_Top_Cuts = 0
If TOP_TRIM_CUT \u003e 0 Then Number_Of_Top_Cuts = 1

Multiple_Cut_Labor = RateR * Bottom_Trim_Cut + NIAGRA_FIXED_FEEDRATE
...

The code calculates the standard cut time for multiple cuts (Multiple_Cut_Std) by adjusting Multiple_Cut_Labor based on parts per blank and shear pressure factor.

Conclusion

This VBA code provides a structured approach to calculating standard cut times for shear operations, taking into account various factors such as material feed rates, labor costs, and other operational considerations.

Chunk 30

VBA Code Description

This VBA code is designed to populate an array of elements with various settings and values related to a cutting process. The code is divided into three main sections: CalcFirstCutStuff, CalcSecondCutStuff, and CalcMultipleCutStuff.

CalcFirstCutStuff

This section calculates the settings for the first cut in a cutting process.

  • It clears any existing data in an array.
  • Sets various element values, including:
    • Paperwork (element 0)
    • Total select time (elements 1 and 2)
    • Parts per sheet (element 2)
    • Total minutes for first cut (element 3)
    • Overhead for first cut (element 4)
    • Standard hours for first cut (element 5)
    • Lot size reduction and offall percentage (element 46)
  • Calls the Elem_Add function to add a new element to the array with the specified values.
  • Returns from the subroutine.

CalcSecondCutStuff

This section calculates the settings for the second cut in a cutting process, which is only executed if the ExtraShear% variable is true.

  • Clears any existing data in an array.
  • Sets various element values, including:
    • Paperwork (element 0)
    • Total select time (elements 1 and 2)
    • Parts per block (elements 23 and 25)
    • Blanks per block (element 24)
  • If ExtraShear% is true, sets the part value to FirstCut and the blanks value to (RateR * FirstCut + NIAGRA_FIXED_FEEDRATE) * Blanks_Per_Block.
  • Otherwise, sets the part value to SecondCut! (a variable that needs to be defined elsewhere in the code).
  • Calls the Elem_Add function to add a new element to the array with the specified values.
  • Returns from the subroutine.

CalcMultipleCutStuff

This section calculates the settings for multiple cuts in a cutting process, which includes top trim cuts and bottom trim cuts.

  • Clears any existing data in an array.
  • Sets various element values, including:
    • Paperwork (element 0)
    • Total select time (elements 1 and 2)
    • Parts per block (elements 23 to 28)
  • Calls the Elem_Add function to add a new element to the array with the specified values.
  • Returns from the subroutine.

Overall, this code appears to be part of a larger system for managing cutting processes and calculating settings based on various inputs and variables.

Chunk 31

Failed to generate documentation with Ollama

Chunk 32

Failed to generate documentation with Ollama

Chunk 33

Failed to generate documentation with Ollama

Chunk 34

Detailed Description of VBA Code

Module Overview

This VBA code module appears to be part of a larger application that interacts with an Access database. It defines three subroutines: ELEM_ClearAllRecs, ELEM_ClearArray is incomplete and seems out of context, and the main subroutine which clears and populates data records in a specified sheet.

Main Subroutine

Sub Main()
    ' Set database connection and recordset object
    Set DataShDB = DBEngine.Workspaces(0).Databases(0)
    Set DataShSet = DataShDB.OpenRecordset("DataSheetQ1", DB_OPEN_DYNASET)

    ' Check if there are no data sheets to process
    If NoDataSheets% = 0 Then
        Exit Sub
    End If

    ' Add a new record to the database
    DataShSet.AddNew

    ' Populate recordset fields with provided values
    DataShSet!PartNumber = PartN$
    DataShSet!Operation = Oper$
    DataShSet!SheetType = ShType$
    DataShSet!Generated = True

    ' Populate various field groups (Elem1 to Elem12) with data from an 'Elem' array
    For i = 0 To 11
        DataShSet!"Elem" \u0026 (i + 1) \u0026 "A" = Elem!(i * 2)
        DataShSet!"Elem" \u0026 (i + 1) \u0026 "V" \u0026 Chr(65 + i) = Elem!(i * 2 + 1)
    Next i

    ' Update the recordset to ensure all fields are set
    DataShSet.Update
End Sub

This subroutine:

  • Checks if there are no data sheets (NoDataSheets) and exits early if so.
  • Opens a new database connection and sets up a recordset for "DataSheetQ1" using dynamic access mode.
  • Adds a new record to the recordset.
  • Sets various fields from PartN$, Oper$, ShType$, and Elem arrays, which are assumed to be defined elsewhere in the application.

Subroutine: ELEM_ClearAllRecs(PartN$)

Sub Elem_ClearAllRecs(PartN$)
    ' Check if output data is enabled before processing
    If Not (OutPutData%) Then
        Exit Sub
    End If

    ' Define search criteria for the recordset
    Criteria$ = "PartNumber = '" + PartN$ + "'"

    ' Set up database connection and recordset object
    Set DataShDB = DBEngine.Workspaces(0).Databases(0)
    Set DataShSet = DataShDB.OpenRecordset("DataSheetQ1", DB_OPEN_DYNASET)

    ' Find the first occurrence of the search criteria
    DataShSet.FindFirst Criteria$

    ' Loop until no matching records are found, deleting each record as it's found
    Do Until DataShSet.NoMatch
        s$ = DataShSet!PartNumber
        If DataShSet!Generated = True Then
            ' Delete the record if it has a generated flag set to true
            DataShSet.Delete
        End If
        DataShSet.FindNext Criteria$
    Loop

    ' Update the recordset after clearing records
    DataShSet.Update
End Sub

This subroutine:

  • Checks if output data is enabled before processing and exits early if not.
  • Defines a search criteria for finding records in "DataSheetQ1" based on PartN$.
  • Sets up a database connection and recordset object.
  • Finds the first occurrence of the search criteria using FindFirst, then enters a loop where it finds subsequent occurrences (FindNext) and deletes each matching record if its generated flag is set to true.

Subroutine: ELEM_ClearArray

' If Not (NoDataSheets%) Then

This subroutine appears incomplete as it does not include the code necessary for clearing data from an array. The If statement seems out of context, as there's no indication that this subroutine is intended to be used without first determining if data sheets exist.

Notes and Recommendations

  • Error handling: Consider adding try-catch blocks or checks for potential errors in accessing the database connection, opening recordsets, and performing operations.
  • Code organization: Some subroutines can be reorganized for better readability, such as extracting common logic into reusable functions or procedures.
  • Code security: Be cautious when concatenating strings using + operator to prevent potential SQL injection attacks. Consider using parameterized queries instead.
  • Performance optimization: For large datasets, consider implementing pagination, caching, or more efficient data retrieval strategies to improve performance.

Chunk 35

Here is a detailed Markdown description of the provided VBA code:

Elem Initialization and Cleanup

For i = 0 To 53
    Elem!(i) = 0
    DoEvents
Next
'   endif
End Sub

This code initializes an array Elem by setting all its elements to 0. The loop iterates from 0 to 53, and after each iteration, it calls the DoEvents method to update the user interface. This ensures that any pending events are processed before moving on to the next element.

Elems_Del Sub

Sub Elem_Del()
    ' ...

End Sub

This sub appears to be responsible for deleting records from a database based on certain criteria. However, without more context or information about the DataShSet and DBEngine, it is difficult to provide further details.

ErrorMessages Sub

Sub ErrorMessages()
    If currform![CalculationStatus] = 0 Then
        currform!TextCalcErr.Visible = False
    Else
        currform!TextCalcErr.Visible = True

        Select Case currform![CalculationStatus]
            ' ...
        End Select
    End If
End Sub

This sub checks the CalculationStatus value of a form and displays an error message in a text control (TextCalcErr) if it is not 0. The error message is set based on the value of CalculationStatus, which appears to be a combination of numerical values representing different types of errors.

Find_By_MakeNumber Sub

Sub Find_By_MakeNumber()
    PN$ = currform!PartNumber
    DocName = PrimaryScreen$
    DoCmd.OpenForm DocName, , , LinkCriteria
    DoCmd.GoToControl "PartName"
    DoCmd.GoToControl "PhantomNumber"
    DoCmd.FindRecord PN$, A_ANYWHERE, False, A_DOWN, , , True
End Sub

This sub searches for a record in a database based on the PartNumber value from a form. It opens a specified form (PrimaryScreen$) and navigates to two specific controls ("PartName" and "PhantomNumber") before searching for the record using the FindRecord method with the ANYWHERE criteria.

In summary, these three subroutines appear to be responsible for:

  1. Initializing an array and updating the user interface.
  2. Deleting records from a database based on certain criteria (though this is not fully implemented).
  3. Displaying error messages in response to calculation errors or other conditions.
  4. Searching for records in a database based on a specific value from a form.

Without more context or information about the application, it is difficult to provide further details or insights into these subroutines.

Chunk 36

Here is a detailed Markdown description of the VBA code:

Main Menu Navigation

The first line of code navigates to the A_FORMBAR menu, which opens the form bar menu.

Sub Find_By_PartNumber()

  • This subroutine finds a record in the database by searching for a specific part number.
  • It sets the current form's PartNumber field (PN$) and then opens the specified form using DoCmd.OpenForm.
  • The cursor is positioned at the "PartName" control, and then the search criteria are set to find all records with the specified part number (A_ANYWHERE).
  • After finding a match, it sets the current form's controls to point to the correct record.
  • It also navigates to the A_EDITMENU menu and selects option 9 (presumably "Edit").

Sub GOTOPARTNUMBER(PN$, PScreen$)

  • This subroutine opens a specified form and navigates to the part number field.
  • It sets the current form's name (PScreen$) and then opens the specified form using DoCmd.OpenForm.
  • The cursor is positioned at the "PartNumber" control, and then it searches for a record with the specified part number (A_ANYWHERE).

Function FormitI$(A%, x$)

  • This function formats the specified value as an integer.
  • It takes two parameters: A% (the value to format) and x$ (the format specifier).
  • The formatted value is returned.

Function FormitS$(A!, x$)

  • This function formats the specified value as a string.
  • It takes two parameters: A! (the value to format) and x$ (the format specifier).
  • The formatted value is returned.

Grain Direction

Sub GrainFromRec()

  • This subroutine sets the grain direction based on the selected option in the form.
  • It gets the current grain direction from the form (currform!GrainDir) and then checks if it's not null or an empty string.
  • If it is, it sets the grain direction to "No Grain Direction" and sets GrDirOpt to 3.

History

Sub HistoryR()

  • This subroutine updates the issue number, date, reason, and history fields in the form.
  • It checks if any of these fields are null or empty and then updates them accordingly.
  • The issue number is incremented by 1, and the current date is set as the new issue date.
  • The reason field is updated with a formatted string containing the reason and date.

String Manipulation

Function instrl(A$, b$)

  • This function finds the last occurrence of a substring (b$) in a string (A$).
  • It returns the starting position of the found substring.

Function itsaNull$(variableField)

  • This function checks if a variable field is null or empty and returns an empty string if so.
  • Otherwise, it returns the original value.

Function ItsAZero!(variableField)

  • This function checks if a variable field is null or zero and returns zero if so.
  • Otherwise, it returns the original value.

Function lpad$(A$, l)

  • This function pads a string with spaces to a specified length (l).

Make Processes

Sub MakeProcesses()

  • This subroutine prepares for making processes by setting up various database objects and recordsets.
  • It sets the caption of a text box control to "Entering Make Process" and then waits for events using DoEvents.
  • The part number and warehouse are retrieved from the form, and search criteria are set.

Chunk 37

VBA Code: Opening and Processing Machine Data

This VBA code is used to open and process data from various databases in an Access application. The code appears to be part of a larger program that calculates machine performance metrics.

Section 1: Opening Databases and Recordsets

The code begins by opening several databases and recordsets using the DBEngine object:

- **AddnlQDB**: Opens the "AddnlQ1" database and creates a dynamic dataset.
- **AddnlSet**: Creates a dynamic dataset from the "AddnlPROC" table in the same database.
- **PressBrkDB**, **PemPressDB**, and **PunchPressDB**: Open other databases and create dynamic datasets.

The `DoEvents` statement is used to process any pending events before proceeding with the code.

Section 2: Processing AddnlQ Data

The code then processes data from the "AddnlQ1" database:

- Sets up a loop to find all records in the database.
- For each record, it checks if the `Generated` flag is set. If so, it deletes the record.
- If not, it checks specific conditions based on the `wc2` field value:
  - If `wc2` equals "345" or "347", sets `CalculationStatus` to 18 and calls an error message function.
  - Otherwise, performs further checks for specific warehouse codes.

After processing each record, the code loops back to find the next record using the `FindNext` method.

Finally, it clears a data sheet requirements array and sets up variables for machine data processing.

Section 3: Processing Machine Data

The code then processes data from two databases related to machines:

- **MachQDB**: Opens the "MachinesQ1" database and creates a dynamic dataset.
- **MachNQDB**: Opens the "MachineNames" table in another database and creates a dynamic dataset with an index set on the `PrimaryKey` field.

The code loops through the records in both datasets, checking for specific conditions:
  - If a record has a `Prime` flag set to `True`, it checks if the machine tool is not equal to "SHR". If so, it sets up an error message function.
- After processing all records, it clears another data sheet requirements array and sets variables for further processing.

Note that the code appears to be incomplete, as it does not provide details on how the `ErrorMessages` function is used or what additional logic is required.

In summary, this VBA code opens and processes data from various databases in an Access application, performing calculations and error checks along the way. However, the code is incomplete, and further development is needed to fully understand its functionality and purpose.

Chunk 38

VBA Code Description

This VBA code is a part of an Excel spreadsheet and appears to be controlling the operation of a CNC machine. It processes user input, performs calculations, and generates data for various operations such as shearing, punching, and deburring.

Variable Initialization and Setup

The code initializes several variables:

  • PMachine$, PWC1$, and PCTime! store the machine name, tool name, and cycle time, respectively.
  • MachQSet.FindNext Criteria$ is used to find the next occurrence of a value in a list or table.
  • DoEvents pauses the execution of the code to allow other Excel events to occur.

Validation and Error Handling

The code performs several checks:

  • If the machine name is empty, it sets the calculation status to 15 and calls the ErrorMessages subroutine.
  • If the punch press option is enabled but not set to 7, it sets the calculation status to 17 and calls the ErrorMessages subroutine.
  • If the "NO CNC" or "BLANK" options are selected, it calls the Det_CNC_Highest_Runtime function.

Process Selection

The code uses a Select Case statement to determine which process to execute based on the user input (Multi$):

  • For single-process options (e.g., SHEAR1), it calls the corresponding subroutine.
  • For multiple-process options (e.g., SHEAR2), it checks if there are extra shear operations and calls the corresponding subroutine accordingly.

Additional Process Selection

The code also includes additional process selection logic for specific machine types:

  • LASER, LASER/SHEAR, SLUG: If the sheet dimensions are not correct, it calls the Shear1 subroutine.
  • SALVAGNINI: It simply calls the CNCOp subroutine.

Output and Refresh

The code generates output data based on user input:

  • If the OutPutData% variable is true, it refreshes the current form, renames numbers, and calls the ErrorMessages subroutine.
  • If there are no data sheets, it deletes elements using the Elem_Del function.

AddAP Subroutine

The code includes an AddAP subroutine that adds new records to a table using user input parameters:

  • It takes five parameters: OpCode%, PartN$, Descr$, and four other variables (wc1$-wc4$).

CNCOp Subroutine

The code includes a CNCOp subroutine that handles multi-process options:

  • It uses another Select Case statement to determine which process to execute based on the user input.

Note: The code is not fully readable due to the absence of comments and variable descriptions. A more detailed explanation would require additional context or documentation about the specific Excel spreadsheet, CNC machine, and operations being performed.

Chunk 39

Failed to generate documentation with Ollama

Chunk 40

Failed to generate documentation with Ollama

Chunk 41

Failed to generate documentation with Ollama

Chunk 42

VBA Code Description

This VBA code appears to be part of a deburring process in a manufacturing or production environment. It determines the type of deburr method to use based on various factors, such as machine type, cell type, and labor requirements.

Variable Initialization

The code initializes several variables:

  • completedeburr%: an integer variable that stores the completion status of the deburring process (set to 2 if outside deburring is required).
  • Celltype$: a string variable that stores the type of cell being deburred, converted to uppercase.
  • ctime! and Rstd!: integer variables used as counters.
  • PMachine$, Multi$, Mt$, BadTs%, Actual_PartHeight, and Actual_PartWidth`: string variables that store machine-specific information.

Machine Type Detection

The code checks the first three characters of the PMachine$ variable to determine the machine type. If it matches "L-2", specific values are assigned to other variables:

  • wc2$: a string variable set to either "330" or "312", depending on the machine type.
  • wc1$, wc3$, and wc4$: string variables initialized with default values.

Deburring Method Selection

The code uses an If-Else statement to determine the deburring method based on the Celltype$ variable:

  • For "HAND DEBURR", it calls a subroutine Det_HandDeburr and assigns specific descriptions.
  • For "TIME SAVER", if the machine is specified as "TIMESAVER" or has a certain ID, it calls a different subroutine Det_TimeSaver_Labor. Otherwise, it calls another subroutine Det_Pedestal_Grinder_Standard.

Additional Logic

The code includes additional logic to handle specific cases:

  • If completedeburr% is 1, it uses the top trim cut value.
  • For certain machine types, it assigns specific values to wc2$.
  • It also calls ds_add subroutines to add data to a database or log.

Overall, this VBA code appears to be part of a complex deburring process that requires careful consideration of various factors to determine the most efficient and effective method for deburring.

Chunk 43

Failed to generate documentation with Ollama

Chunk 44

Failed to generate documentation with Ollama

Chunk 45

Failed to generate documentation with Ollama

Chunk 46

VBA Code Description

This VBA code appears to be a part of a larger program for managing and deburring parts. It uses various variables and constants to determine the type of operation required based on machine type, deburbing method, and other factors.

Section 1: Primary Machine Name Extraction

' Obtain the Primary Machine name.
PrimeType$ = Left$(PMachine$, 3)

This section extracts the first three characters of the PMachine variable to obtain the primary machine name.

Section 2: Single Part Deciphering

If (Multi$ = "SINGLE") Or (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
    ...
End If

This section checks if the Multi variable is set to a specific value, indicating that it's a single part operation. Based on this value, it sets various deburring flags and options.

Section 3: Multiple and Laser Part Deciphering

Else
    ...
End If

If the Multi variable is not set to a single part operation, this section checks if the primary machine name contains specific values. Based on this value, it sets additional deburring flags and options.

Section 4: Exclude All Parts Timesaver Deburrrs

If Mt$ = "NO TIMESAVER" Then
    dbtype!(2, 0) = 0
    ...
End If

This section checks if the Mt variable is set to "NO TIMESAVER". If so, it sets various deburring flags to zero.

Section 5: Exclude Invalid Trim Cuts for Shear Operations

If (InStr(MachinesWithShears$, PrimeType$) \u003c\u003e 0) And (Multi$ = "MULTIPLE") Then
    ...
End If

This section checks if the primary machine name contains specific values and if the Multi variable is set to "MULTIPLE". If so, it sets flags related to invalid trim cuts for shear operations.

Section 6: Exclude Operations that Manual Selection has Indicated

Select Case Celltype$
    ...
End Select

This section uses a SELECT CASE statement to check the value of the Celltype$ variable. Based on this value, it sets various deburring flags and options.

Variables and Constants Used

  • Multi: a string variable indicating the type of operation (single part or multiple parts).
  • PMachine: a string variable containing the primary machine name.
  • MachinesWithShears$:, TypeDeburr$, TopTrimCut$: constants or variables used to determine specific deburring options.
  • Bottom_Trim_Cut!: a constant or variable indicating the bottom trim cut value.
  • Celltype$: a string variable containing the cell type (hand deburr, pedestal, etc.).
  • `dbtype!(...)$: an array of constants or variables used to store deburring flags and options.

Note that some of the code is commented out, which may indicate areas where the code has not been fully implemented or tested.

Chunk 47

Detailed Description of the Provided VBA Code

The provided VBA code is composed of multiple subroutines, each with its own specific purpose. Here's a detailed explanation of what each section does:

Setting Default Database Types

dbtype!(1, 0) = 0
dbtype!(3, 0) = 0
dbtype!(4, 0) = 0
...
dbtype!(13, 0) = 0

This section sets default values for database types. dbtype! appears to be a global variable or array that stores the database type for each dimension (1, 3, 4, etc.). The dbtype! value is set to 0, indicating that these dimensions are not being used.

Conditional Statements and Function Calls

Case Else
End Select
Call Det_Deburr_Run_Times(CNCTime!, DbSel%, completedeburr%)
'   SecondShear = True
'   If (TOP_TRIM_CUT! = 0 Or TOP_TRIM_CUT! = 2 Or TOP_TRIM_CUT! = 2.25) And (Bottom_TRIM_CUT! = 2 Or Bottom_TRIM_CUT! = 2.25) Then
'      SecondShear = False
'   End If

'If ((DbSel% \u003e 2) And (DbSel% \u003c 11)) Or (DbSel% = 13) Or (DbSel% = 14) Or (DbSel% = 16) Then

Call CNC_Verbage(DbSel%, vb$)

Return

This section contains a conditional statement that appears to be part of a larger program. The code calls the Det_Deburr_Run_Times function, passing in three parameters: CNCTime!, DbSel%, and completedeburr%. The function seems to be related to deburring processing.

The commented-out section suggests that there is additional logic for handling top and bottom trim cuts. If these conditions are met, the SecondShear variable would be set to False.

CNC Verbage Function Call

Call CNC_Verbage(DbSel%, vb$)

This line calls a function named CNC_Verbage, passing in two parameters: DbSel% and an unnamed string literal vb$. The purpose of this function is unclear without more context.

NewGrain Subroutine

Sub NewGrain()
If currform!GrDirOpt = 1 Then
currform!GrainDir = "Along First Dimension"
End If
...

This subroutine appears to be related to grain direction. It checks the value of currform!GrDirOpt and sets the currform!GrainDir property accordingly.

The values of 1, 2, and 3 are assigned to specific string literals, which may represent different grain directions (e.g., "Along First Dimension", "Along Second Dimension", or "No Grain Direction").

OpenMainFiles Subroutine

Sub OpenMainFiles()
'AddnlQ1
...

This subroutine is responsible for opening various databases and recordsets. The code appears to be a series of comments, each starting with Addnl followed by the name of the database or recordset being opened (e.g., "AddnlQ1", "StAddnlQDB", etc.).

The actual code that opens these databases is commented out, suggesting that this subroutine may not be currently in use.

Data Sheet Opening

DataSheet
'   currform!txtCalcStat.caption = "Open - Opening StDataShDB": DoEvents
'   Set StDataShDB = DBEngine.Workspaces(0).Databases(0)
'   Set StDataShSet = StDataShDB.OpenRecordset("DataSheetQ1", DB_OPEN_DynaSet)

This section appears to be related to opening a data sheet database and recordset. The code sets the caption of currform!txtCalcStat and then opens the "DataSheetQ1" recordset from the StDataShDB database using the DB_OPEN_DynaSet option.

Process Opening

Process
'   currform!txtCalcStat.caption = "Open - Opening StPressTab": DoEvents
'   Set StPressTab = DBEngine.Workspaces(0).Databases(0)
'   Set StPressTabSet = StPressTab.OpenRecordset("PressBrakes", DB_OPEN_TABLE)

This section appears to be related to opening a process database and recordset. The code sets the caption of currform!txtCalcStat and then opens the "PressBrakes" recordset from the StPressTab database using the DB_OPEN_TABLE option.

Data Sheet Opening (Alternative)

DataSheet
'   currform!txtCalcStat.caption = "Open - Opening StDataShDB": DoEvents
'   Set StDataShDB = DBEngine.Workspaces(0).Databases(0)
'   Set StDataShSet = StDataShDB.OpenRecordset("DataSheetQ1", DB_OPEN_DynaSet)

This section is similar to the previous one, but with a different database and recordset being opened.

Data Sheet Opening (Final)

DataSheet
'   currform!txtCalcStat.caption = "Open - Opening StDataShDB": DoEvents
'   Set StDataShDB = DBEngine.Workspaces(0).Databases(0)
'   Set StDataShSet = StDataShDB.OpenRecordset("DataSheetQ1", DB_OPEN_DynaSet)

This section is identical to the previous one, suggesting that it may be a duplicate or alternative implementation.

Note: The code provided appears to be incomplete and may require additional context to fully understand its purpose and functionality.

Chunk 48

VBA Code Description

PressBrake Functionality

This VBA code appears to be part of an Access database application. It provides functionality for opening and interacting with three different recordsets: PressBrakeQ1, PunchPress, and PressBrakeOps.

Section 1: Opening Recordsets

The code begins by defining a sub routine that opens the recordsets:

''PressBrake
'   currform!txtCalcStat.caption = "Open - Opening StPressBrk": DoEvents
'   Set StPressBrk = DBEngine.Workspaces(0).Databases(0)
'   Set StPressBrkSet = StPressBrk.OpenRecordset("PressBrakeQ1", DB_OPEN_DynaSet)

''PunchPress
'   currform!txtCalcStat.caption = "Open - Opening StPunchPress": DoEvents
'   Set StPunchPress = DBEngine.Workspaces(0).Databases(0)
'   Set StPunchPressSet = StPunchPress.OpenRecordset("PunchPress", DB_OPEN_Table)

'''PressBrakeOps
'  currform!txtCalcStat.caption = "Open - Opening StPressOps": DoEvents
' Set StPressOps = DBEngine.Workspaces(0).Databases(0)
' Set StPressOpsSet = StPressOps.OpenRecordset("PressBrakeOps", DB_OPEN_Table)

Each section opens a recordset using the DBEngine object, which is an interface to a database engine. The specific recordsets opened are:

  • PressBrakeQ1
  • PunchPress
  • PressBrakeOps

The recordsets are opened in two different modes:

  • DB_OPEN_DynaSet: Opens the recordset as a dynamic set, which allows for dynamic data manipulation.
  • DB_OPEN_Table: Opens the recordset as a table, which is used by the Punch Press functionality.

Section 2: PBFormView Sub Routine

This sub routine appears to be responsible for displaying the part number and associated machine information on the form.

Sub PBFormView()
PartN$ = currform![PartNumber]
Set MachQDB = DBEngine.Workspaces(0).Databases(0)
Set MachQSet = MachQDB.OpenRecordset("MachinesQ1", DB_OPEN_DYNASET)  ' Create dynaset.
Criteria$ = "PartNumber = '" + PartN$ + "'"                         ' Set search criteria.

PMachine$ = ""
MachQSet.FindFirst Criteria$                                       ' Find first occurrence.
FL$ = Trim$(UCase$(itsaNull(currform!PressBrake)))
currform!txtPrime = ""
PMachine$ = ""
Do Until MachQSet.NoMatch                                          ' Loop until no matching records.
If MachQSet!Prime = True Then
    PMachine$ = MachQSet!MachineName
    Exit Do
End If
MachQSet.FindNext Criteria$                                    ' Find next occurrence.
DoEvents
Loop
currform!txtPrime = PMachine$
currform!PressBrake.Requery
Select Case FL$
Case "1"
    currform!PressBrakeSubForm.Visible = False
Case Else
    currform!PressBrakeSubForm.Visible = True


End Select

Here's a step-by-step explanation of the code:

  • Retrieves the part number from the form.
  • Opens the MachinesQ1 recordset as a dynamic set using DB_OPEN_DYNASET.
  • Sets the search criteria to find records with the specified part number.
  • Finds the first occurrence in the recordset that matches the part number and stores its machine name in PMachine$.
  • Loops through the remaining records until no more matching records are found.
  • Updates the form fields with the machine information.
  • Requeries the PressBrake recordset using the updated filter.

Section 3: Opps Function

This function takes an opcode as input and returns a string slice of length 4 from the right end of the opcode:

Function Opps$(OpCode%)
Opps$ = Right$("      " + Str$(OpCode%), 4)
End Function

This function appears to be used in other parts of the codebase, but its purpose is not immediately clear without more context.

Conclusion

In summary, this VBA code provides functionality for opening and interacting with three recordsets: PressBrakeQ1, PunchPress, and PressBrakeOps. It also contains a sub routine for displaying part number and machine information on the form.

Chunk 49

VBA Code Documentation

PemPressView Subroutine

Purpose:

This subroutine controls the visibility of form elements based on a value stored in FL$.

Description:

  • Checks the value of FL$ and sets the corresponding values for:
    • PemPress Ops subform: Sets its visibility to True if FL$ is -1, otherwise sets it to False.
    • lblPemBefore and PemBefore: Also toggles their visibility accordingly.

Code Snippet:

Sub PemPressView()
    FL$ = Trim$(UCase$(currform!Pems))
    Select Case FL$
        Case "-1"
            currform![PemPress Ops subform].Visible = True
            currform![lblPemBefore].Visible = True
            currform![PemBefore].Visible = True
        Case Else
            currform![PemPress Ops subform].Visible = False
            currform![lblPemBefore].Visible = False
            currform![PemBefore].Visible = False
    End Select
End Sub

PunchPressOptions Subroutine

Purpose:

This subroutine manages the visibility and settings of form elements related to punch press operations.

Description:

  • Checks the current values of various form fields and updates their visibility accordingly.
  • Updates labels, input boxes, and checkboxes based on the selected cutting type and punch die options.
  • Ensures that the PunchDie field is set to a valid value (!NONE!) if it's empty or null.

Code Snippet:

Sub PunchPressOptions()
    If IsNull(currform!PunchDie) Then currform!PunchDie = "!NONE!"
    If Trim$(currform!PunchDie) = "" Then currform!PunchDie = "!NONE!"

    If (currform!CutType = "Multiple") Or (currform!CutType = "Laser") Or (currform!CutType = "Salvagnini") Or (currform!CutType = "Laser/Shear") Or (currform!CutType = "Slug") Then
        currform!PunchPressOption.Visible = False
        currform!PunchDie.Visible = False
        currform!PunchCount.Visible = False
        currform!PunchStd.Visible = False
    Else
        ...

PurgeCNCs Subroutine

Purpose:

This subroutine removes duplicate CNC records from a database.

Description:

  • Retrieves machine names and machines datasets from the database.
  • Opens the "Process" recordset in the main database.
  • Iterates through the PartNumber index in the "Machines" dataset to find matching parts.
  • Deletes duplicates by moving them to the end of the index.

Code Snippet:

Sub PurgeCNCs()
    If Not OutPutData% Then Exit Sub

    Dim MainDB As Database, MainSet As Recordset
    Dim MachNamesDB As Database, MachNamesSet As Recordset
    Dim MachQDB As Database, MachQSet As Recordset

    Set MainDB = DBEngine.Workspaces(0).Databases(0)
    Set MachNamesDB = DBEngine.Workspaces(0).Databases(0)
    Set MachQDB = DBEngine.Workspaces(0).Databases(0)

    Set MachNamesSet = MachNamesDB.OpenRecordset("MachineNames", DB_OPEN_TABLE)
    Set MachQSet = MachQDB.OpenRecordset("Machines", DB_OPEN_TABLE)
    Set MainSet = MainDB.OpenRecordset("Process", DB_OPEN_TABLE)

    PartN$ = currform![PartNumber]
    MainSet.Index = "PrimaryKey"
    MachQSet.MoveFirst
    MachQSet.Index = "PartNumber"
    MachQSet.Seek "\u003e=", PartN$

    If Not (MachQSet.NoMatch) Then
        Do While Trim$(MachQSet!PartNumber) = PartN$
            A$ = MachQSet!Tool
            If (A$ = "***") Then
                MachQSet.Delete
            End If
            MachQSet.MoveNext
            If (MachQSet.EOF) Then Exit Do
        Loop
    End If
    currform.Refresh
End Sub

Chunk 50

Failed to generate documentation with Ollama

Chunk 51

VBA Code Description

This VBA code is used to add records from a main database (MainDB) to two secondary databases (Main2DB and Main2DB) in an Excel application, specifically for tracking part information related to machines.

Main Logic

The code consists of several sections that perform the following actions:

  1. Loop through records: The code loops through records in the main database, checking if a specific part number (PartN$) is present.
  2. Delete or update records: Based on whether the generated flag is True for the current record, it either deletes the record from the main database and adds a new record to one of the secondary databases or updates an existing record in both databases.

Functions

The code calls several functions to manage the connection to the databases:

  • XOPEN_Mains: Opens the main database and creates a dynamic dataset (MainSet) for the "Process" table.
  • XOPEN_Addnl: Opens the additional process database and creates a dynamic dataset (Main2Set) for the "AddnlProc" table.
  • XOPEN_Machs: Opens the machine database and creates a dynamic dataset (MainSet) for the "Machines" table.
  • XOPEN_Press: Opens the press brake operations database and creates a dynamic dataset (MainSet) for the "PressBrakeOPs" table.

Database Connections

The code establishes connections to two databases:

  1. Main database (MainDB): Used for storing main records.
  2. Secondary databases (Main2DB and Main2DB): Used for adding or updating records related to machines.

Error Handling

If the part number is added successfully, an error message ("Part " + PartN$ + " added") is displayed and the subroutine exits.

Dynamic Datasets

The code uses dynamic datasets (MainSet and Main2Set) to interact with the databases. The datasets are used to perform operations such as moving to the first record, seeking records based on a condition, and updating fields.

Example Usage

To use this code, follow these steps:

  1. Open the Excel application.
  2. Access the Visual Basic Editor by pressing Alt + F11 or navigating to Developer \u003e Visual Basic.
  3. Insert a new module by clicking Insert \u003e Module and paste the provided VBA code into the new module.
  4. Connect to your databases using the relevant database connection settings (e.g., file path, username, password).
  5. Run the subroutine by clicking Run \u003e Run Sub/User Form, selecting the main subroutine ("AddPartInfo"), or calling it programmatically.

Notes

  • The code assumes that the database tables and fields are already set up in the Excel application.
  • You should adjust the database connection settings, table names, and field names according to your specific requirements.
  • This code provides a basic structure for adding records from one database to another; you may need to modify it to fit your specific use case.

Chunk 52

Re-numbering Process for Press Brake Operations

This VBA code is designed to re-number process sheets for Press Brake Operations (PBOs) in a database. The script performs the following tasks:

Initialization and Database Connection

The code starts by setting up variables and establishing connections to the database.

  • Main2Set and AddnlQSet are created as dynamic datasets, allowing for easier manipulation of data.
  • MainDB and MachDB are referenced but not used in this script. It is assumed they are defined elsewhere.

Recordset Management

The code manages two main recordsets:

  • Main2Set: Used to iterate over the Press Brake OPs dataset, with the index set to "PartNumber".
  • AddnlQSet: Used to find and process generated records within the AddnlQ1 dataset.

Re-numbering Process

The re-numbering process involves the following steps:

  1. Find First Occurrence: The code starts by finding the first occurrence of a record in AddnlQSet that matches the current part number.
  2. Delete Generated Records: If the found record is generated (i.e., Generated% = True), it is deleted from the dataset.
  3. Find Next Occurrence: The process then continues by finding the next occurrence of a record in AddnlQSet.

Error Handling

  • An error handler (ErrM$) is defined to handle duplicate records, which are skipped using Resume Next.
  • A static variable insertOp% is used to store an insert operation count.

User Interface Updates

Throughout the re-numbering process, the code updates a user form's controls:

  • The caption of txtCalcStat is updated to reflect the progress of the script.

Database Operations

The script performs various database operations:

  • It opens and closes recordsets using DB_OPEN_TABLE and DB_OPEN_DYNASET.
  • It uses DoEvents to update the user interface while performing long-running tasks.

Conclusion

This VBA code is designed to re-number process sheets for Press Brake Operations in a database. The script iterates through generated records, deletes them if necessary, and updates the user interface to reflect its progress.

Chunk 53

Failed to generate documentation with Ollama

Chunk 54

Failed to generate documentation with Ollama

Chunk 55

Failed to generate documentation with Ollama

Chunk 56

VBA Code Description

This VBA code appears to be generating a report or output based on various input parameters from a form (currform) and other variables. Here's a detailed breakdown of the code:

Branching Logic

The code uses an Else-If statement structure, which branches the execution flow based on conditions.

Case 1: Multiple Blanks Per Block

  • If BlanksPerBlock is greater than 1 (currform!BlanksPerBlock \u003e 1), calculate NumBlanks as BlanksPerBlock - 1.
  • Print the calculated value of NumBlanks, formatted as "##0".
  • Check if there's an "Extra Shear" feature enabled. If yes, print the first cut value (FirstCut!) in "##0.000" format; otherwise, print the second cut value (SecondCut!).
  • Print additional values ("A2", "0", and "A0").

Case 2: Specific Trim Cuts

  • Check if either Bottom_Trim_Cut is greater than or equal to 2 or ActualPartHeight is greater than or equal to 2.
  • If true, calculate two variables (FIRSTCUTLESSTOP and FIRSTCUTLESSBOTTOM) based on the values of FirstCut, TopTrim_Cut, and other parameters.
  • Print formatted values for these variables in "##0.000" format.

Output Formatting

The code uses various formatting functions to create a human-readable output, including:

  • Format$(Value, FormatString): formats a value as specified by the FormatString.
  • FormitS$(Field, FormatString): formats a field as specified by the FormatString.

Final Output

The final output includes various fields, such as:

  • Part name and sheet information
  • Material and revision numbers
  • Additional metadata (e.g., "CNC" or "LASER" processing)
  • A unique identifier (PartNumber)

Overall, this VBA code appears to be designed to generate a detailed report or output based on various input parameters and formatting rules.

Chunk 57

Detailed Description of VBA Code

Sub 2nd Cut Shear File Generation

This sub generates a 2nd cut shear file, which includes various parameters such as part details, material information, and calculations.

Parameters Printed to File

The following parameters are printed to the specified file (#1):

  • Cut Type: The type of cut (e.g., Laser or Shear)
  • Part Name: The name of the part
  • Sheet Number: The sheet number where the part is located
  • Material Information:
    • Material type (Gauge, etc.)
    • Part weight
    • Metal name (S/S, Col, Alu, Gal)
  • Part Dimensions:
    • Sheet width and length
    • Total sheet size
  • Revision Number: The current revision number of the part
  • Part Number: The unique identifier for the part

Conditional Logic

The code uses conditional logic to determine the type of cut based on various factors, such as:

  • Multi-cut or single-cut configuration
  • Laser cutting capability (e.g., LASER is not available)
  • Grain direction and orientation

Sub UtilGrossWt

Sub Calculating Gross Weight for a Part

This sub calculates the gross weight of a part based on various input parameters.

Parameters Passed to Sub

The following parameters are passed to the sub:

  • Sheet_W! (sheet width)
  • Sheet_L! (sheet length)
  • lb_per_sq_ft! (material weight per square foot)
  • Gw! (gross weight variable, initialized to 0)
  • Aw! (weight calculation variable)
  • MainSet As Recordset (a recordset containing part information)

Calculations and Logic

The sub performs the following calculations:

  1. Initializes variables for sheet length, width, and material weight
  2. Checks for specific part numbers and updates grain direction accordingly
  3. Calculates gross weight using various algorithms (e.g., calculating along first or second dimension)
  4. Updates output data flags (OutPutData%) based on calculations

Sub Exit

Sub Exiting the Program

This sub exits the program by closing the specified file (#1).

Action Taken

The sub simply closes the specified file and then exits the program.

Note that this code appears to be part of a larger program, and additional context is required to fully understand its purpose and functionality.

Chunk 58

Detailed Markdown Description of VBA Code

Overview

This VBA code appears to be part of a user interface for calculating utilization rates and other properties of metal sheets in a manufacturing process. It uses various variables and constants defined within the MainSet object to perform calculations and updates.

Main Logic

The code consists of two main logic branches:

  1. Calculating along only one dimension: This branch is taken when the user selects "Calculated along only dimension" from the status dropdown menu. In this case, the code retrieves the grain direction (GrNone%) and updates it with the selected value before performing calculations.
  2. Calculating along multiple dimensions: If the user selects a different option, the code performs calculations based on various assumptions and checks.

Calculation Assumptions

The code makes several assumptions about the input data:

  • The metal sheet is rectangular in shape.
  • There are two main dimensions: first dimension (First_Dim!) and second dimension (Second_dim!).
  • The sheet has a specific usage rate (USAGE) applied to its gross weight.
  • Various material properties, such as part height, width, and blank size, are specified.

Calculation Logic

The code performs various calculations based on the input data:

  • Calculates actual weight by multiplying gross weight with the usage rate.
  • Updates main set values: GrossWt, ActualWt, etc.
  • Calculates parts per sheet and blocks per sheet based on part blank size.

Material Property Calculations

The code performs calculations for material properties, including:

  • Part dimensions (PartHeight!, PartWidth!).
  • Blank size (BlankSize!).
  • Punching die description (PunchDieDescr$) and counter (PunchCounter%).

Error Handling

The code includes error handling mechanisms:

  • Checks for invalid input data, such as zero or negative values.
  • Uses constants to define error codes (e.g., RC% = 6: GoSub Setcalcstat).

External Subroutines

The code calls two external subroutines:

  • UTCalcPart: updates the main set with new values and performs calculations.
  • Setcalcstat: handles errors and updates the calculation status.

Overall, this VBA code is designed to perform complex calculations for metal sheet utilization rates and other properties. It uses various assumptions and checks to ensure accurate results and includes error handling mechanisms to prevent errors.

Chunk 59

Code Description

This VBA code is part of a larger program that appears to be used for calculating material weights and dimensions for metal parts in various manufacturing processes, including CNC machining. The code contains several conditional statements and subroutines that handle different scenarios based on the input values and user selections.

Overview


The code starts by checking if Multi$ is equal to "BLANK". If it is, the program exits or calls other subroutines depending on further conditions. If Multi$ is not "BLANK", the program calculates material weights and dimensions based on various rules and user selections.

Conditional Statements


The code contains several conditional statements that handle different scenarios:

  1. First Cut Direction

    • If Multi$ is equal to "BLANK", the first cut direction is set to 1.
    • The program then checks the case of the first cut direction and performs calculations accordingly.
  2. Material Type

    • Based on the value of Multi$, different material types are handled:
      • "LASER" or "SALVAGNINI": Part width is calculated as (Sheet_Width! / Parts_Per_blank) - Pt_Width!, and trim cuts are set to 0.
      • "SLUG": Part width is calculated similarly, but with a different formula.
  3. Material Weight Calculation

    • The program calls the UTDoAnswers subroutine if CalculationStatus is equal to 0.
    • If Multi$ is not equal to "BLANK", it calculates material weights using either CalcMultGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!) or CalcGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!, RC%), depending on the case.
  4. Material Dimensions

    • The program sets material dimensions based on the value of Multi$.
    • For "LASER" or "SALVAGNINI", part height and width are set as (First_Dim! - TOP_TRIM_CUT! - Bottom_Trim_Cut!) and (PartWidth!), respectively.
    • For other material types, part height is set to First_Dim! or Second_dim!, and part width is set to either PartWidth! or Second_dim!.

Subroutines


The code contains several subroutines that perform specific calculations:

  • UTDoAnswers: Handles material weight calculations based on user selections.
  • CalcMultGrossWeight (and its variants): Calculates material weights for various material types.

Constants and Variables


The code uses several constants and variables, including:

  • Multi$: A string variable representing the type of material being processed.
  • RC%: An integer variable used to store calculation results.
  • Gw! and Aw!: Integer variables used as input values for calculations.
  • OrigPartW!, PunchCounter%, Pt_Width!, First_Dim!, Second_dim!, Sheet Widt!, TOP_TRIM_CUT!, Bottom_Trim_Cut!, and other variables related to material dimensions and processing conditions.

Notes


  • The code appears to be part of a larger program that handles various manufacturing processes.
  • Some parts of the code seem to be commented out or not fully implemented, indicating potential future modifications or additions.

Chunk 60

Detailed Description of VBA Code

This VBA code appears to be part of a larger program that calculates various parameters for metal cutting operations. The code is written in a conditional-based structure, with multiple Select Case statements and nested logic to handle different scenarios.

Variables and Settings

The code assumes the existence of several variables, including:

  • $ symbols denoting strings (e.g., fc$)
  • Percent signs indicating percentage values (e.g., FirstCutDir%)
  • % symbols for boolean flags (e.g., ExtraShear%)
  • MainSet! referencing a data table or settings object
  • $ symbols for formatting numerical values

Code Structure

The code is organized into several sections, each handling different scenarios:

1. Setting Defaults and Calculating Parameters

' Set defaults and calculate parameters
Select Case Else
    fc$ = MainSet![GrainDir]
    MainSet![PartHeight] = First_Dim!
    MainSet![ActualPartHeight] = First_Dim!
    MainSet![ActualPartWidth] = Second_dim!
    FirstCut! = First_Dim!
    SecondCut! = Second_dim!

    If Multi$ = "BLANK" Then FirstCutDir% = 1
End Select

' Calculate Actual_PartHeight and Actual_PartWidth
Actual_PartHeight = MainSet![ActualPartHeight]
Actual_PartWidth = MainSet![ActualPartWidth]

If FirstCutDir% = 0 Then
    RC% = 1: GoSub Setcalcstat
Else
    ' Update GrainDir, GrossWeight, etc.
End If

' Calculate parts per sheet and blocks per sheet
MainSet![PartsPerSheet] = parts_per_sheet!
MainSet![BlocksPerSheet] = Blocks_Per_Sheet!
MainSet![BlanksPerBlock] = Blanks_Per_Block!

' Format SheetSize and PartSize strings
MainSet![SheetSize] = Format$(Sheet_Width!, "###0.000") + " X " + Format$(Sheet_Length!, "###0.000")
If (Multi$ = "LASER") Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
    MainSet![PartSize] = Format$(MainSet![PartHeight], "###0.000") + " X " + Format$(MainSet![PartWidth], "###0.000")
Else
    MainSet![PartSize] = Format$(MainSet![ActualPartHeight], "###0.000") + " X " + Format$(MainSet![ActualPartWidth], "###0.000")
End If

' Format BlankSize string
MainSet![BlankSize] = Format$(First_Dim!, "###0.000") + " X " + Format$(Second_dim!, "###0.000")

Return

This section sets default values, calculates Actual_PartHeight and Actual_PartWidth, and updates various settings and calculations based on the value of Multi$.

2. Material Weight Calculations

UTCalcMaterialWt:
If (Multi$ = "NO CNC") And (Punch$ \u003c\u003e "!NONE!") And (MainSet!PunchOption = 2) And (Sheet_Width \u003c\u003e Second_dim!) Then
    RC% = 2: GoSub Setcalcstat
    FirstCutDir% = 0
End If

If Multi$ = "MULTIPLE" Or Multi$ = "LASER" Or (Multi$ = "SALVAGNINI") Or (Multi$ = "LASER/SHEAR") Or (Multi$ = "SLUG") Then
    ' Calculate part width and call CalcMultGrossWeight
    Part_Width = MainSet![PartWidth]
    Call CalcMultGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!)
    FirstCutDir% = 1

Else
    ' Check grain direction and calculate gross weight using CalcGrossWeight or other methods
End If

This section handles material weight calculations for different scenarios, including multiple cuts, laser/salvagnini operations, and other conditions.

3. Checking Grain Direction and Calculating Gross Weight

If Not (Grain$, 11) = "ALONG FIRST" Then
    ' Calculate gross weight using CalcGrossWeight with grain direction as second argument
End If

This section checks the grain direction and calculates the gross weight using CalcGrossWeight or other methods.

4. Error Handling

GoSub Setcalcstat
' Handle errors or exceptions by invoking Setcalcstat subroutine

This section invokes an error handling subroutine, Setcalcstat, to handle any errors or exceptions that may occur during execution.

Note that the code is not fully commented and appears to be part of a larger program. The above description provides a general overview of the structure and logic of the code.

Chunk 61

VBA Code Description

Main Calculation Logic

The code consists of two main sections: the calculation logic and the cross-reference check.

Calculation Logic

If Gw1! = Gw2! Then
    If First_Dim! \u003c Second_dim! Then
        FirstCutDir% = 1
        Call CalcGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!, RC%)
    Else
        FirstCutDir% = 2
        Call CalcGrossWeight(Second_dim!, First_Dim!, Gw!, Aw!, RC%)
    End If
Else
    If First_Dim! \u003c Second_dim! Then
        FirstCutDir% = 2
        Call CalcGrossWeight(First_Dim!, Second_dim!, Gw!, Aw!, RC%)
    Else
        FirstCutDir% = 1
        Call CalcGrossWeight(Second_dim!, First_Dim!, Gw!, Aw!, RC%)
    End If
End If

This logic is used to determine the correct calculation order for two sets of dimensions, First_Dim! and Second_dim!. The code checks if the Gross Weights (Gw1! and Gw2!) are equal. If they are:

  • If First_Dim! is less than Second_dim!, it sets FirstCutDir% to 1 and calls CalcGrossWeight with these dimensions, Gross Weight, Air Volume (Aw), and Resultant Cutting Direction (RC).
  • Otherwise, it sets FirstCutDir% to 2 and calls CalcGrossWeight with the opposite set of dimensions.

If the Gross Weights are not equal:

  • If First_Dim! is less than Second_dim!, it sets FirstCutDir% to 2 and calls CalcGrossWeight with these dimensions, Gross Weight, Air Volume, and Resultant Cutting Direction.
  • Otherwise, it sets FirstCutDir% to 1 and calls CalcGrossWeight with the opposite set of dimensions.

The code also includes a return statement at the end of this logic block.

Calculation Status Update

Setcalcstat:
MainSet![CalculationStatus] = RC%
Return

This subroutine updates the calculation status in the MainSet! object with the result of the previous calculation (RC%) and returns.

Cross-Reference Check

The following code is a separate subroutine that checks for cross-references between parts:

Sub CrossRef()
    ' ...
End Sub

Main Logic

This subroutine:

  1. Hides certain controls on the form.
  2. Shows a message indicating it's searching for a cross-reference file.
  3. Sets up a dynamic recordset to query the RMSFILES#_EGSSP1A0 table in the database.
  4. Checks if there are any records in the recordset.
  5. If yes, it loops through each record and checks if the part number or new part number match the PartN$ variable.
  6. If a match is found, it shows a message indicating that the part has an associated part and sets up the 300 series command to be visible.

Control Visibility and Caption

After finding any cross-references, the subroutine:

  1. Hides the calculation status controls.
  2. Sets the calculation status text to "Waiting for Calculate".
  3. Shows the control for deleting files from Trumpfs.
  4. Hides other controls on the form.

This code seems to be part of a larger system that involves calculating weights and dimensions for parts, as well as checking for cross-references between parts in a database.