PSLine2000Documentation/Modules/processvariables.md

9450 lines
334 KiB
Markdown

# processvariables
Analysis generated on: 4/1/2025 5:03:02 PM
---
## VBA Code
```vba
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.
```markdown
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.
```markdown
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**
```markdown
### 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**
```markdown
### 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**
```markdown
### 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**
```markdown
### 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**
```markdown
### 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
```markdown
# 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.
```markdown
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
```markdown
# 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.
```markdown
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
```markdown
# 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.
```markdown
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.
```markdown
' 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.
```markdown
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%`).
### Primary CNC Machine Search
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**
---------------------------
```markdown
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**
-------------------------------
```markdown
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**
---------------------------------------------
```markdown
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**
---------------------------------------------
```markdown
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**
--------------------------------------
```markdown
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**
------------------------------
```markdown
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
```markdown
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.
```markdown
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
```markdown
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
```markdown
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
```markdown
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$
```markdown
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
```markdown
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
```markdown
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.
```markdown
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:
```markdown
* 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:
```markdown
* 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:
```markdown
* 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:
```markdown
* 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:
```markdown
* 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.
```markdown
**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:
```markdown
**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.
```markdown
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.
```markdown
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:
```markdown
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.
```markdown
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.
```markdown
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`)
```markdown
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
```markdown
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$)
```markdown
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
```markdown
' 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**
```markdown
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**
```markdown
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**
```markdown
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**
```markdown
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:
```markdown
- **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:
```markdown
- 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:
```markdown
- **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**
```markdown
' 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**
```markdown
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**
```markdown
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**
```markdown
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**
```markdown
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**
```markdown
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
```markdown
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
```markdown
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
```markdown
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
```markdown
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
```markdown
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
```markdown
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
```markdown
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)
```markdown
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)
```markdown
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:
```markdown
''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.
```markdown
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:
```markdown
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:
```markdown
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:
```markdown
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:
```markdown
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
```markdown
' 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
```markdown
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
```markdown
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
```markdown
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
```markdown
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
```markdown
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:
```markdown
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.