Merged PR 28374: Auto-Populate Kit Demand
Updated GenerateMaterialTrackRows service in Report_Services to auto-populate the kit demand based on rules defined by the business. Related work items: #294433
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,422 +0,0 @@
|
||||
Compile function NDW_MATERIAL_TRACK_PRO_REPORT_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
Name : NDW_MATERIAL_TRACK_PRO_REPORT_EVENTS
|
||||
|
||||
Description : Commuter module for the NDW_MATERIAL_TRACK_PRO_REPORT_EVENTS form.
|
||||
|
||||
Notes : Application errors should be logged using the Error Services module. There are a few methodological
|
||||
assumptions built into way errors are managed which are important to understand in order to properly
|
||||
work with Error Services:
|
||||
|
||||
- The term 'top' refers to the originating procedure of a call stack and the term 'bottom' refers to
|
||||
the last routine (or the current routine) within a call stack. Within the OpenInsight Debugger
|
||||
this will appear backwards since the originating procedure always appears at the bottom of the
|
||||
list and the current routine appears at the top of the list. We are using this orientation because
|
||||
it is common to refer to the process of calling other procedures as 'drilling down'.
|
||||
|
||||
- The reason for defining the orientation of the call stack is because Error_Services allows for
|
||||
multiple error conditions to be appended to an original error. In most cases this will happen when
|
||||
a procedure at the bottom of the stack generates an error condition and then returns to its
|
||||
calling procedure. This higher level procedure can optionally add more information relevant to
|
||||
itself. This continues as the call stack 'bubbles' its way back to the top to where the
|
||||
originating procedure is waiting.
|
||||
|
||||
- Native OpenInsight commands that handle errors (e.g., Set_Status, Set_FSError, Set_EventStatus)
|
||||
preserve their error state until explicitly cleared. This can hinder the normal execution of code
|
||||
since subsequent procedures (usually SSPs) will fail if a pre-existing error condition exists.
|
||||
Our philosophy is that error conditions should automatically be cleared before a new procedure
|
||||
is executed to avoid this problem. However, the nature of Basic+ does not make this easy to
|
||||
automate for any given stored procedure. Therefore, if a stored procedure wants to conform to our
|
||||
philosophy then it should include a call into the 'Clear' service request at the top of the
|
||||
program. Alternatively this can be done through a common insert (see SERVICE_SETUP for example.)
|
||||
|
||||
- Service modules will use the SERVICE_SETUP insert and therefore automatically clear out any
|
||||
error conditions that were set before.
|
||||
|
||||
Parameters :
|
||||
Service [in] -- Name of the service being requested
|
||||
Param1-10 [in/out] -- Additional request parameter holders
|
||||
Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
|
||||
|
||||
Metadata :
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
10/29/20 djs Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#window NDW_MATERIAL_TRACK_PRO_REPORT
|
||||
|
||||
Declare function Form_Services, Database_Services, RTI_Task_Submit, RTI_Task_Status, MemberOf
|
||||
Declare subroutine SRP_Show_Window, Send_Message, Set_Property, Database_Services, Material_Track, Report_Services
|
||||
Declare subroutine PlaceDialog
|
||||
|
||||
$Insert EVENT_SETUP
|
||||
$Insert LOGICAL
|
||||
$Insert REPORT_CONFIG_EQUATES
|
||||
|
||||
SubclassInfo = Form_Services('FindSubclassControl')
|
||||
Subclass = SubclassInfo<1>
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
Transfer Event to OIEvent
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
Transfer Param4 to Param3
|
||||
Transfer Param5 to Param4
|
||||
Transfer Param6 to Param5
|
||||
Transfer Param7 to Param6
|
||||
Transfer Param8 to Param7
|
||||
end
|
||||
|
||||
GoToEvent Event for CtrlEntId else
|
||||
// Event not implemented
|
||||
end
|
||||
|
||||
Return EventFlow or 1
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// EVENT HANDLERS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
RptConfigKey = 'MATERIAL_TRACK*':@User4
|
||||
If RowExists('REPORT_CONFIG', RptConfigKey) then
|
||||
UserSettings = Database_Services('ReadDataRow', 'REPORT_CONFIG', RptConfigKey)
|
||||
Set_Property(@Window:'.PUB_SAVE_SETTINGS', 'ENABLED', False$)
|
||||
end else
|
||||
UserSettings = ''
|
||||
Set_Property(@Window:'.PUB_SAVE_SETTINGS', 'ENABLED', True$)
|
||||
end
|
||||
|
||||
If MemberOf(@User4, 'OI_ADMIN') then Set_Property(@Window:'.CHK_OLD_REPORT', 'VISIBLE', True$)
|
||||
|
||||
GoSub Setup_OLE_Controls
|
||||
GoSub EnableGenerateReportButton
|
||||
|
||||
PlaceDialog(-2, -2)
|
||||
|
||||
End Event
|
||||
|
||||
|
||||
Event PUB_GEN_REPORT.CLICK()
|
||||
|
||||
// Gather settings from form
|
||||
ColFltrArray = Get_Property(@Window:'.OLE_EDT_COL_FILTER', 'OLE.ARRAY')
|
||||
LocFltrArray = Get_Property(@Window:'.OLE_EDT_LOC_FILTER', 'OLE.ARRAY')
|
||||
NoMatFlag = Get_Property(@Window:'.CHK_NO_MAT_FOUND', 'CHECK')
|
||||
OldReport = Get_Property(@Window:'.CHK_OLD_REPORT', 'CHECK')
|
||||
|
||||
RptColumns = ''
|
||||
RptLocations = ''
|
||||
|
||||
Columns = ColFltrArray<1>
|
||||
Flags = ColFltrArray<2>
|
||||
For each Column in Columns using @VM setting vPos
|
||||
ColumnEnabled = Flags<0, vPos>
|
||||
If ColumnEnabled then RptColumns<0, -1> = Column
|
||||
Next Column
|
||||
|
||||
Locations = LocFltrArray<1>
|
||||
Flags = LocFltrArray<3>
|
||||
For each Location in Locations using @VM setting vPos
|
||||
LocationEnabled = Flags<0, vPos>
|
||||
If LocationEnabled then RptLocations<0, -1> = Location
|
||||
Next Location
|
||||
|
||||
Report_Services('PrintMaterialTrackReport', RptColumns, RptLocations, NoMatFlag, OldReport)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_SAVE_SETTINGS.CLICK()
|
||||
|
||||
RptConfigKey = 'MATERIAL_TRACK*':@User4
|
||||
If RowExists('REPORT_CONFIG', RptConfigKey) then
|
||||
UserSettings = Database_Services('ReadDataRow', 'REPORT_CONFIG', RptConfigKey)
|
||||
end else
|
||||
UserSettings = ''
|
||||
end
|
||||
|
||||
// Gather settings from form
|
||||
ColFltrArray = Get_Property(@Window:'.OLE_EDT_COL_FILTER', 'OLE.ARRAY')
|
||||
LocFltrArray = Get_Property(@Window:'.OLE_EDT_LOC_FILTER', 'OLE.ARRAY')
|
||||
NoMatFoundFlag = Get_Property(@Window:'.CHK_NO_MAT_FOUND', 'CHECK')
|
||||
RptColumns = ''
|
||||
RptLocations = ''
|
||||
|
||||
Columns = ColFltrArray<1>
|
||||
Flags = ColFltrArray<2>
|
||||
For each Column in Columns using @VM setting vPos
|
||||
ColumnEnabled = Flags<0, vPos>
|
||||
If ColumnEnabled then RptColumns<0, -1> = Column
|
||||
Next Column
|
||||
UserSettings<REPORT_CONFIG.REPORT_COLUMNS$> = Flags
|
||||
|
||||
Locations = LocFltrArray<1>
|
||||
Flags = LocFltrArray<3>
|
||||
For each Location in Locations using @VM setting vPos
|
||||
LocationEnabled = Flags<0, vPos>
|
||||
If LocationEnabled then RptLocations<0, -1> = Location
|
||||
Next Location
|
||||
UserSettings<REPORT_CONFIG.LOCATION_FILTER$> = Flags
|
||||
UserSettings<REPORT_CONFIG.NO_MAT_FOUND$> = NoMatFoundFlag
|
||||
Database_Services('WriteDataRow', 'REPORT_CONFIG', RptConfigKey, UserSettings, True$, False$, True$)
|
||||
Set_Property(CtrlEntID, 'ENABLED', False$)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event OLE_EDT_COL_FILTER.OnCheckChanged(Cell, OldValue, NewValue)
|
||||
|
||||
GoSub EnableSaveButton
|
||||
GoSub EnableGenerateReportButton
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event OLE_EDT_LOC_FILTER.OnCheckChanged(Cell, OldValue, NewValue)
|
||||
|
||||
GoSub EnableReportColumns
|
||||
GoSub EnableSaveButton
|
||||
GoSub EnableGenerateReportButton
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event CHK_NO_MAT_FOUND.CLICK()
|
||||
|
||||
GoSub EnableSaveButton
|
||||
GoSub EnableGenerateReportButton
|
||||
|
||||
end event
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Setup_OLE_Controls:
|
||||
|
||||
// Report Columns
|
||||
RptCols = ''
|
||||
RptCols<1, 1> = 'React No'
|
||||
RptCols<1, 2> = 'React Type'
|
||||
RptCols<1, 3> = 'WO No'
|
||||
RptCols<1, 4> = 'SAP Prod No'
|
||||
RptCols<1, 5> = 'Sub Part No'
|
||||
RptCols<1, 6> = 'Epi Part No'
|
||||
RptCols<1, 7> = 'WO Qty'
|
||||
RptCols<1, 8> = 'RX Qty'
|
||||
RptCols<1, 9> = 'UnRel Qty'
|
||||
RptCols<1, 10> = 'Kit Location'
|
||||
RptCols<1, 11> = 'Kit Qty'
|
||||
RptCols<1, 12> = '+/-'
|
||||
RptCols<1, 13> = 'Kit RO'
|
||||
RptCols<1, 14> = 'PTI RO'
|
||||
RptCols<1, 15> = 'Load'
|
||||
RptCols<1, 16> = 'Comments'
|
||||
|
||||
RptColsEnabled = ''
|
||||
If UserSettings NE '' then
|
||||
RptColsEnabled = UserSettings<REPORT_CONFIG.REPORT_COLUMNS$>
|
||||
end else
|
||||
For each Col in RptCols using @VM setting vPos
|
||||
RptColsEnabled<0, -1> = True$
|
||||
Next Col
|
||||
end
|
||||
|
||||
NoMatFoundFlag = UserSettings<REPORT_CONFIG.NO_MAT_FOUND$>
|
||||
Set_Property(@Window:'.CHK_NO_MAT_FOUND', 'CHECK', NoMatFoundFlag)
|
||||
|
||||
RptColsArray = RptCols:@FM:RptColsEnabled
|
||||
|
||||
// Location Filters
|
||||
LocFilters = ''
|
||||
LocFilters<1, 1> = 'SR*KTR]'
|
||||
LocFilters<1, 2> = '1K*PTI'
|
||||
LocFilters<1, 3> = 'CR*BE'
|
||||
LocFilters<1, 4> = 'CR*BO'
|
||||
LocFilters<1, 5> = 'CR*TUN'
|
||||
LocFilters<1, 6> = 'CR*EPR'
|
||||
LocFilters<1, 7> = 'CR*FE'
|
||||
LocFilters<1, 8> = 'CR*FEH'
|
||||
LocFilters<1, 9> = 'CR*FO'
|
||||
LocFilters<1, 10> = 'CR*FOH'
|
||||
|
||||
LocDescriptions = ''
|
||||
LocsEnabled = ''
|
||||
If UserSettings NE '' then
|
||||
LocsEnabled = UserSettings<REPORT_CONFIG.LOCATION_FILTER$>
|
||||
For each Loc in LocFilters using @VM setting vPos
|
||||
If vPos GT 1 then
|
||||
LocDescriptions<0, -1> = Xlate('LOCATION', Loc, 'DESC', 'X')
|
||||
end else
|
||||
LocDescriptions<0, -1> = 'All Kit Racks'
|
||||
end
|
||||
Next Loc
|
||||
end else
|
||||
For each Loc in LocFilters using @VM setting vPos
|
||||
LocsEnabled<0, -1> = True$
|
||||
If vPos GT 1 then
|
||||
LocDescriptions<0, -1> = Xlate('LOCATION', Loc, 'DESC', 'X')
|
||||
end else
|
||||
LocDescriptions<0, -1> = 'All Kit Racks'
|
||||
end
|
||||
Next Loc
|
||||
end
|
||||
|
||||
LocFltrArray = LocFilters:@FM:LocDescriptions:@FM:LocsEnabled
|
||||
|
||||
ColFltrCtrl = @Window:'.OLE_EDT_COL_FILTER'
|
||||
LocFltrCtrl = @Window:'.OLE_EDT_LOC_FILTER'
|
||||
|
||||
// Qualify OLE events that we want to intercept
|
||||
Qualifier = ''
|
||||
Qualifier<1> = 1
|
||||
Qualifier<4> = 0 ; * process synchronously (i.e. immediately)
|
||||
Send_Message(ColFltrCtrl, 'QUALIFY_EVENT', 'OLE.OnCheckChanged', Qualifier)
|
||||
Send_Message(LocFltrCtrl, 'QUALIFY_EVENT', 'OLE.OnCheckChanged', Qualifier)
|
||||
|
||||
NumColFltrCols = 2
|
||||
NumColFltrRows = DCount(RptCols, @VM)
|
||||
NumLocFltrCols = 3
|
||||
NumLocFltrRows = DCount(LocFilters, @VM)
|
||||
|
||||
HeaderFontArray = 'Segoe UI':@SVM:8:@SVM:700
|
||||
ColFltrDimArray = NumColFltrCols : @FM : NumColFltrRows
|
||||
LocFltrDimArray = NumLocFltrCols : @FM : NumLocFltrRows
|
||||
DataColArray = ''
|
||||
DataColArray<4> = True$ ; // Autosize column
|
||||
|
||||
HeaderTitles = 'Column':@VM:'Enabled'
|
||||
Set_Property(ColFltrCtrl, "OLE.TitleList", HeaderTitles)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellFont[All; All]", 'Segoe UI':@SVM:8)
|
||||
Set_Property(ColFltrCtrl, "OLE.Dimension", ColFltrDimArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.HeaderFont[All; 1]", HeaderFontArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.HeaderColumn[1]", '':@FM:False$:@FM)
|
||||
Set_Property(ColFltrCtrl, "OLE.HeaderAlignment[All; 1]", "Top":@FM:"Center":@FM:"Center")
|
||||
Set_Property(ColFltrCtrl, "OLE.HeaderColors[All; 1]", @FM:"{200, 200, 200}")
|
||||
Set_Property(ColFltrCtrl, "OLE.CellType[2; All]", "Check Box")
|
||||
Set_Property(ColFltrCtrl, "OLE.CellAlignment[2; All]", "Top":@FM:"Center":@FM:"Center")
|
||||
Set_Property(ColFltrCtrl, "OLE.DataColumn[1]", DataColArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.ARRAY", RptColsArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 1-3]", False)
|
||||
CellColorArray = 'None':@FM:"{240, 240, 240}"
|
||||
Set_Property(ColFltrCtrl, "OLE.CellColors[All; 1-3]", CellColorArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 1-3]", 'FUL')
|
||||
|
||||
|
||||
HeaderTitles = 'Location':@VM:'Description':@VM:'Enabled'
|
||||
Set_Property(LocFltrCtrl, "OLE.TitleList", HeaderTitles)
|
||||
Set_Property(LocFltrCtrl, "OLE.CellFont[All; All]", 'Segoe UI':@SVM:8)
|
||||
Set_Property(LocFltrCtrl, "OLE.Dimension", LocFltrDimArray)
|
||||
Set_Property(LocFltrCtrl, "OLE.LIST", '')
|
||||
Set_Property(LocFltrCtrl, "OLE.HeaderFont[All; 1]", HeaderFontArray)
|
||||
Set_Property(LocFltrCtrl, "OLE.HeaderColumn[1]", '':@FM:False$:@FM)
|
||||
Set_Property(LocFltrCtrl, "OLE.HeaderAlignment[All; 1]", "Top":@FM:"Center":@FM:"Center")
|
||||
Set_Property(LocFltrCtrl, "OLE.HeaderColors[All; 1]", @FM:"{200, 200, 200}")
|
||||
Set_Property(LocFltrCtrl, "OLE.CellType[3; All]", "Check Box")
|
||||
Set_Property(LocFltrCtrl, "OLE.DataColumn[2]", DataColArray)
|
||||
Set_Property(LocFltrCtrl, "OLE.CellAlignment[3; All]", "Top":@FM:"Center":@FM:"Center")
|
||||
Set_Property(LocFltrCtrl, "OLE.ARRAY", LocFltrArray)
|
||||
|
||||
return
|
||||
|
||||
|
||||
EnableSaveButton:
|
||||
|
||||
// Enable save settings button if necessary
|
||||
RptConfigKey = 'MATERIAL_TRACK*':@User4
|
||||
If RowExists('REPORT_CONFIG', RptConfigKey) then
|
||||
UserSettings = Database_Services('ReadDataRow', 'REPORT_CONFIG', RptConfigKey)
|
||||
end else
|
||||
UserSettings = ''
|
||||
end
|
||||
|
||||
// Gather settings from form
|
||||
ColFltrArray = Get_Property(@Window:'.OLE_EDT_COL_FILTER', 'OLE.ARRAY')
|
||||
LocFltrArray = Get_Property(@Window:'.OLE_EDT_LOC_FILTER', 'OLE.ARRAY')
|
||||
|
||||
NewColFlags = ColFltrArray<2>
|
||||
CurrColFlags = UserSettings<REPORT_CONFIG.REPORT_COLUMNS$>
|
||||
|
||||
NewLocFlags = LocFltrArray<3>
|
||||
CurrLocFlags = UserSettings<REPORT_CONFIG.LOCATION_FILTER$>
|
||||
|
||||
NewNoMatFoundFlag = Get_Property(@Window:'.CHK_NO_MAT_FOUND', 'CHECK')
|
||||
CurrNoMatFoundFlag = UserSettings<REPORT_CONFIG.NO_MAT_FOUND$>
|
||||
|
||||
ChangeDetected = ( (NewColFlags NE CurrColFlags) or (NewLocFlags NE CurrLocFlags) or (NewNoMatFoundFlag NE CurrNoMatFoundFlag) )
|
||||
Set_Property(@Window:'.PUB_SAVE_SETTINGS', 'ENABLED', ChangeDetected)
|
||||
|
||||
return
|
||||
|
||||
|
||||
EnableGenerateReportButton:
|
||||
|
||||
// Gather settings from form
|
||||
LocFltrArray = Get_Property(@Window:'.OLE_EDT_LOC_FILTER', 'OLE.ARRAY')
|
||||
NoMaterialFlag = Get_Property(@Window:'.CHK_NO_MAT_FOUND', 'CHECK')
|
||||
LocFlags = LocFltrArray<3>
|
||||
ButtonEnabled = ( (Sum(LocFlags) GT 0) or (NoMaterialFlag EQ True$) )
|
||||
Set_Property(@Window:'.PUB_GEN_REPORT', 'ENABLED', ButtonEnabled)
|
||||
|
||||
return
|
||||
|
||||
|
||||
EnableReportColumns:
|
||||
|
||||
ColFltrCtrl = @Window:'.OLE_EDT_COL_FILTER'
|
||||
LocFltrCtrl = @Window:'.OLE_EDT_LOC_FILTER'
|
||||
|
||||
// Gather settings from form
|
||||
LocFltrArray = Get_Property(LocFltrCtrl, 'OLE.ARRAY')
|
||||
|
||||
LocFlags = LocFltrArray<3>
|
||||
KitRackFlag = LocFlags<0, 1>
|
||||
PTIRackFlag = LocFlags<0, 2>
|
||||
LoadedFlags = Field(LocFlags, @VM , 3, 8)
|
||||
LoadedColEnabled = (Sum(LoadedFlags) GT 0)
|
||||
EnabledCellColorArray = 'None':@FM:'None'
|
||||
DisabledCellColorArray = 'None':@FM:"{240, 240, 240}"
|
||||
If KitRackFlag EQ True$ then
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 10-13]", True$)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellColors[All; 10-13]", EnabledCellColorArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 10-13]", 'SEL')
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 10-13]", True$)
|
||||
end else
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 10-13]", False$)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellColors[All; 10-13]", DisabledCellColorArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 10-13]", 'FUL')
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 10-13]", False$)
|
||||
end
|
||||
If PTIRackFlag EQ True$ then
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 14]", True$)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellColors[All; 14]", EnabledCellColorArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 14]", 'SEL')
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 14]", True$)
|
||||
end else
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 14]", False$)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellColors[All; 14]", DisabledCellColorArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 14]", 'FUL')
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 14]", False$)
|
||||
end
|
||||
If LoadedColEnabled EQ True$ then
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 15]", True$)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellColors[All; 15]", EnabledCellColorArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 15]", 'SEL')
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 15]", True$)
|
||||
end else
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheck[2; 15]", False$)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellColors[All; 15]", DisabledCellColorArray)
|
||||
Set_Property(ColFltrCtrl, "OLE.CellProtection[All; 15]", 'FUL')
|
||||
Set_Property(ColFltrCtrl, "OLE.CellCheckEnabled[2; 15]", False$)
|
||||
end
|
||||
|
||||
return
|
||||
|
@ -1,481 +0,0 @@
|
||||
COMPILE SUBROUTINE Print_Demand(ReportParm)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
/*
|
||||
Print Material Demand Report
|
||||
10/27/2016 - John C Henry, J.C. Henry & Co., Inc. - Initial Coding
|
||||
10/05/2017 - Donald Bakke - No longer select SCHED_DET rows with an end date specified.
|
||||
10/24/2018 - Daniel Stieber - Patch added to resolve scheduling conflicts on the same day
|
||||
*/
|
||||
|
||||
DECLARE SUBROUTINE Utility, ErrMsg, Set_Status, Set_Printer, RList, SRP_Stopwatch
|
||||
DECLARE FUNCTION Set_Printer, Get_Printer, Msg, Get_Status, Printer_Select, obj_Install, Dialog_Box, obj_Location
|
||||
DECLARE FUNCTION Schedule_Services
|
||||
|
||||
$INSERT OIPRINT_EQUATES
|
||||
$INSERT SCHED_DET_EQUATES
|
||||
$INSERT WO_LOG_EQUATES
|
||||
$INSERT APPCOLORS
|
||||
$INSERT MSG_EQUATES
|
||||
$INSERT LOGICAL
|
||||
$INSERT SCHEDULE_EQU
|
||||
|
||||
EQU TAB$ TO \09\
|
||||
EQU TARGET_ACTIVELIST$ TO 5
|
||||
|
||||
Main:
|
||||
ErrorTitle = 'Error in stored procedure Print_Demand'
|
||||
ErrCode = ''
|
||||
ErrorMsg = ''
|
||||
SRP_Stopwatch('Reset')
|
||||
SRP_Stopwatch('Start', 'Initializing')
|
||||
OPEN 'SCHED_DET' TO SchedDetTable ELSE
|
||||
ErrorMsg = 'Unable to open "SCHED_DET" table.'
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
RETURN
|
||||
END
|
||||
|
||||
OPEN 'DICT.SCHED_DET' TO @DICT ELSE
|
||||
ErrorMsg = 'Unable to open "SCHED_DET" table.'
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
RETURN
|
||||
END
|
||||
|
||||
|
||||
Today = OCONV(Date(),'D4/')
|
||||
|
||||
EndDate = OCONV(Date()+13,'D4/')
|
||||
|
||||
|
||||
ReactList = ''
|
||||
WOList = ''
|
||||
SchedDetKeys = ''
|
||||
PrevReactNo = ''
|
||||
PrevWO = ''
|
||||
|
||||
SelectSent = 'SELECT SCHED_DET WITH SCHED_DT GE ':QUOTE(Today):' BY REACT_NO'
|
||||
|
||||
SRP_Stopwatch('Stop', 'Initializing')
|
||||
SRP_Stopwatch('Start', 'Data Select')
|
||||
|
||||
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
RETURN
|
||||
END
|
||||
SRP_Stopwatch('Stop', 'Data Select')
|
||||
SRP_Stopwatch('Start', 'Build Key List')
|
||||
Done = 0
|
||||
@ID = ''
|
||||
LOOP
|
||||
PrevSchedDetKey = @ID
|
||||
READNEXT @ID ELSE Done = 1
|
||||
UNTIL Done
|
||||
ReactNo = @ID[1,'*']
|
||||
SchedDt = @ID[COL2()+1,'*']
|
||||
SeqNo = @ID[COL2()+1,'*']
|
||||
|
||||
READ SchedDetRec FROM SchedDetTable,@ID THEN
|
||||
|
||||
WONo = SchedDetRec<SCHED_DET_WO_NO$>
|
||||
|
||||
LOCATE ReactNo IN ReactList BY 'AR' USING @FM SETTING Pos ELSE
|
||||
ReactList = INSERT(ReactList,Pos,0,0,ReactNo)
|
||||
END
|
||||
|
||||
PrevReactNo = Field(PrevSchedDetKey, '*', 1)
|
||||
PrevSchedDt = Field(PrevSchedDetKey, '*', 2)
|
||||
|
||||
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
|
||||
WOList = INSERT(WOList,Pos,-1,0,WONo)
|
||||
// Patch added on 10/24/18 to resolve scheduling conflicts on the same day for
|
||||
// the material track report. - djs
|
||||
If (PrevReactNo EQ ReactNo) and (PrevSchedDt EQ SchedDt) then
|
||||
PrevSeqNo = Field(PrevSchedDetKey, '*', 3)
|
||||
NumWO = DCount(WOList<Pos>, @VM)
|
||||
PrevWONo = WOList<Pos, NumWO - 1>
|
||||
SchedEvents = Schedule_Services('GetScheduleEventSummary', ReactNo, WONo, SchedDt, SeqNo, True$)
|
||||
StartDt = IConv(SchedEvents<SCHEDULE_ENTRY_DATE$>, 'D')
|
||||
PrevSchedEvents = Schedule_Services('GetScheduleEventSummary', ReactNo, PrevWONo, PrevSchedDt, PrevSeqNo, True$)
|
||||
PrevStartDt = IConv(PrevSchedEvents<SCHEDULE_ENTRY_DATE$>, 'D')
|
||||
If StartDt GT PrevStartDt then
|
||||
// This is the common case
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
||||
end else
|
||||
// Scheduling irregularity - Insert this key in the second to last position.
|
||||
NumKeys = DCount(SchedDetKeys, @FM)
|
||||
InsertPos = NumKeys
|
||||
SchedDetKeys = INSERT(SchedDetKeys,InsertPos,0,0,@ID)
|
||||
end
|
||||
end else
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
||||
end
|
||||
END
|
||||
END
|
||||
|
||||
REPEAT
|
||||
|
||||
CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT)
|
||||
SRP_Stopwatch('Stop', 'Build Key List')
|
||||
SRP_Stopwatch('Start', 'Build Report')
|
||||
IF ReportParm = 'T' THEN
|
||||
|
||||
* Tracking Report
|
||||
|
||||
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'"
|
||||
MinDemand = 0
|
||||
|
||||
END
|
||||
|
||||
IF ReportParm = 'D' THEN
|
||||
|
||||
* Demand Report
|
||||
|
||||
MinDemand = Msg(@WINDOW,'','MIN_DEMAND_QTY')
|
||||
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Demand with Reactor Queue < ':MinDemand:' Cassettes':@VM:"Page 'P'"
|
||||
|
||||
END
|
||||
|
||||
Set_Status(0)
|
||||
|
||||
* Start of printing process
|
||||
|
||||
FileName = 'Print Material Demand'
|
||||
Title = 'Printing Material Demand'
|
||||
|
||||
TopMargin = 1.0
|
||||
BottomMargin = 0.75
|
||||
LeftMargin = 0.25
|
||||
RightMargin = 0.25
|
||||
|
||||
Margins = LeftMargin:@FM:TopMargin:@FM:RightMargin:@FM:BottomMargin
|
||||
|
||||
PageSetup = '1' ;* LandScape
|
||||
PrintSetup = '2' ;* Preview Normal
|
||||
PrintSetup<1,2> = '0' ;* All buttons
|
||||
PrintSetup<1,5> = '1' ;* Page Range
|
||||
PrintSetup<1,6> = 7 ;* full mouse and keyboard support
|
||||
|
||||
PrintPath = ''
|
||||
stat = Set_Printer('INIT',FileName,Title,Margins,PageSetup,PrintSetup,PrintPath)
|
||||
|
||||
IF stat < 0 THEN
|
||||
ErrorMsg = 'Stat = ' : Stat : ', PrintPath = ' : PrintPath
|
||||
GOTO OIPrintErr
|
||||
end
|
||||
DateRange = 'Effective ':OCONV(Date(),'D4')
|
||||
|
||||
Header<-1> = "'T'"
|
||||
Header<-1> = '' ;* Blank line following heading
|
||||
|
||||
font = 'Arial'
|
||||
font<2> = '10'
|
||||
font<4> = '0' ;* Bold
|
||||
|
||||
stat = Set_Printer('FONTHEADFOOT',font) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
stat = Set_Printer('HEADER',Header) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
|
||||
Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'"
|
||||
stat = Set_Printer('FOOTER',Footer) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
|
||||
*
|
||||
@RECCOUNT = 0
|
||||
FirstPass = 1
|
||||
LastRecord = 0
|
||||
FirstLine = 1
|
||||
fontSpacing = 100
|
||||
|
||||
* Make Column Heading
|
||||
|
||||
ColHead = '' ; ColFmt = ''
|
||||
ColHead<1,1> = 'React No' ; ColFmt<1,1> = '+^720'
|
||||
ColHead<1,2> = 'React Type' ; ColFmt<1,2> = '+<^720'
|
||||
ColHead<1,4> = 'WO No' ; ColFmt<1,4> = '+^1000'
|
||||
ColHead<1,5> = 'SAP Prod No' ; ColFmt<1,5> = '+^1000'
|
||||
ColHead<1,6> = 'Sub Part No' ; ColFmt<1,6> = '+<1200'
|
||||
ColHead<1,7> = 'Epi Part No' ; ColFmt<1,7> = '+<1200'
|
||||
ColHead<1,8> = 'WO Qty' ; ColFmt<1,8> = '+>720'
|
||||
ColHead<1,9> = 'RX Qty' ; ColFmt<1,9> = '+>720'
|
||||
ColHead<1,10> = 'UnRel Qty' ; ColFmt<1,10> = '+>720'
|
||||
ColHead<1,11> = 'Kit Location' ; ColFmt<1,11> = '+^1260'
|
||||
ColHead<1,12> = 'Kit Qty' ; ColFmt<1,12> = '+^720'
|
||||
IF ReportParm = 'T' THEN
|
||||
ColHead<1,3> = 'Wafer Size' ; ColFmt<1,3> = '+^1400'
|
||||
ColHead<1,13> = 'PTI Location' ; ColFmt<1,13> = '+^1260'
|
||||
ColHead<1,14> = 'PTI RO' ; ColFmt<1,14> = '+^3380'
|
||||
END ELSE
|
||||
ColHead<1,3> = 'Wafer Size' ; ColFmt<1,3> = '+^1000'
|
||||
ColHead<1,13> = '1K Stage Location' ; ColFmt<1,13> = '+^1260'
|
||||
ColHead<1,14> = 'Stage Qty' ; ColFmt<1,14> = '+^1260'
|
||||
ColHead<1,15> = 'PTI Location' ; ColFmt<1,15> = '+^1260'
|
||||
ColHead<1,16> = 'PTI RO' ; ColFmt<1,16> = '+^1260'
|
||||
END
|
||||
|
||||
|
||||
* Zero Accumulators For Each Break
|
||||
|
||||
Prev.ReactNo = ''
|
||||
Last.ReactNo.Break = 1
|
||||
|
||||
* * * * * * *
|
||||
ReadRecord:
|
||||
* * * * * * *
|
||||
|
||||
* Zero Break Flags To False
|
||||
|
||||
ReactNo.Break=0
|
||||
|
||||
READNEXT @ID, Which.Value ELSE
|
||||
LastRecord = 1
|
||||
ReactNo.Break = 1
|
||||
ReactNo = Prev.ReactNo
|
||||
END
|
||||
|
||||
S.ATID = @ID
|
||||
|
||||
IF FirstPass AND LastRecord THEN
|
||||
GOTO Bail
|
||||
END
|
||||
|
||||
IF LastRecord THEN GOTO BREAKS
|
||||
|
||||
READO @RECORD FROM SchedDetTable,@ID ELSE
|
||||
GOTO ReadRecord
|
||||
END
|
||||
|
||||
@RECCOUNT += 1
|
||||
|
||||
* Calculate Value(s) For Column(s)
|
||||
|
||||
S.ATID = {@ID}
|
||||
I.ATID = S.ATID
|
||||
S.ReactNo = {REACT_NO}
|
||||
I.ReactNo = S.ReactNo
|
||||
S.WoNo = {WO_NO}
|
||||
I.WoNo = S.WoNo
|
||||
S.SubPartNo = XLATE('WO_LOG',S.WoNo,'ORD_SUB_PART_NO','X')
|
||||
I.SubPartNo = S.SubPartNo
|
||||
S.EpiPartNo = XLATE('WO_LOG',S.WoNo,WO_LOG_EPI_PART_NO$,'X')
|
||||
I.EpiPartNo = S.EpiPartNo
|
||||
S.WO_Qty = {WO_QTY}
|
||||
I.WO_Qty = S.WO_Qty
|
||||
S.WO_RX_Qty = {WO_RX_QTY}
|
||||
I.WO_RX_Qty = S.WO_RX_Qty
|
||||
S.WO_UnRel_QTY = {WO_UNREL_QTY}
|
||||
I.WO_UnRel_QTY = S.WO_UnRel_QTY
|
||||
S.Sched_DT = {SCHED_DT}
|
||||
I.Sched_DT = S.Sched_DT
|
||||
*Changed Here JRO
|
||||
S.REACT_TYPE = {REACTOR_TYPE}
|
||||
S.WAFER_SIZE = {WAFER_SIZE}
|
||||
S.ProdOrdNo = {PROD_ORD_NO}
|
||||
|
||||
KitData = obj_Location('KitLocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN KitData
|
||||
|
||||
S.KitLocation = KitData<1>
|
||||
I.KitLocation = S.KitLocation
|
||||
|
||||
S.KitQty = OCONV(SUM(KitData<2>) * 25,'MD0,Z')
|
||||
I.KitQty = S.KitQty
|
||||
|
||||
S.KitCassCnt = COUNT(KitData<3>,',') + (KitData<3> NE '')
|
||||
I.KitCassCnt = S.KitCassCnt
|
||||
|
||||
StageData = obj_Location('StageLocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN StageData
|
||||
|
||||
S.StageLocation = StageData<1>
|
||||
I.StageLocation = S.StageLocation
|
||||
|
||||
S.StageQty = StageData<3>
|
||||
I.StageQty = S.StageQty
|
||||
|
||||
S.StageCassCnt = COUNT(S.StageQty,',') + (S.StageQty NE '')
|
||||
I.StageCassCnt = S.StageCassCnt
|
||||
|
||||
PTIData = obj_Location('PTILocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN PTIData
|
||||
|
||||
S.PTILocation = PTIData<1>
|
||||
I.PTILocation = S.PTILocation
|
||||
|
||||
S.PTIQty = PTIData<3>
|
||||
I.PTIQty = S.PTIQty
|
||||
|
||||
S.PTICassCnt = COUNT(S.PTIQty,',') + (S.PTIQty NE '')
|
||||
I.PTICassCnt = S.PTICassCnt
|
||||
|
||||
CassQueueCnt = I.KitCassCnt + I.StageCassCnt + I.PTICassCnt
|
||||
|
||||
* TEST FOR CONTROL BREAK(S)
|
||||
|
||||
IF (S.ReactNo NE Prev.ReactNo) OR ReactNo.Break THEN
|
||||
ReactNo = Prev.ReactNo
|
||||
Prev.ReactNo = S.ReactNo
|
||||
ReactNo.Break += 1
|
||||
END
|
||||
|
||||
IF FirstPass THEN
|
||||
FirstPass=0
|
||||
GOTO DETAIL
|
||||
END
|
||||
|
||||
* * * * * * *
|
||||
BREAKS:
|
||||
* * * * * * *
|
||||
|
||||
* Print Break Total(s) And Accumulate Total(s)
|
||||
|
||||
IF ReactNo.Break THEN
|
||||
|
||||
IF ReportParm = 'D' ELSE
|
||||
stat = Set_Printer('TEXT')
|
||||
END
|
||||
|
||||
END
|
||||
|
||||
|
||||
* Perform Last Record Output If Done
|
||||
|
||||
IF LastRecord THEN
|
||||
|
||||
colData = ''
|
||||
|
||||
|
||||
GOTO Bail
|
||||
|
||||
END
|
||||
|
||||
|
||||
* * * * * * *
|
||||
DETAIL:
|
||||
* * * * * * *
|
||||
|
||||
* Do Conversion If Any
|
||||
|
||||
IF ReportParm = 'T' OR CassQueueCnt < MinDemand THEN
|
||||
|
||||
IF S.REACTNO NE "" THEN S.REACTNO = OCONV(S.REACTNO,"MD0,")
|
||||
IF S.WONO NE "" THEN S.WONO = OCONV(S.WONO,"MD0")
|
||||
IF S.WO_QTY NE "" THEN S.WO_QTY = OCONV(S.WO_QTY,"MD0,")
|
||||
IF S.WO_RX_QTY NE "" THEN S.WO_RX_QTY = OCONV(S.WO_RX_QTY,"MD0,")
|
||||
IF S.WO_UNREL_QTY NE "" THEN S.WO_UNREL_QTY = OCONV(S.WO_UNREL_QTY,"MD0,")
|
||||
IF S.SCHED_DT NE "" THEN S.SCHED_DT = OCONV(S.SCHED_DT,"D4/")
|
||||
|
||||
* PRINT DETAIL LINE
|
||||
|
||||
COLDATA = ''
|
||||
RowNumber = 0
|
||||
CassList = ''
|
||||
|
||||
For each Location in S.PTILocation using @VM setting fPos
|
||||
LocationCassNos = S.PTIQty<0, fPos>
|
||||
If S.React_Type NE 'EPP' then
|
||||
For each CassNo in LocationCassNos using ','
|
||||
WOMatKey = S.WONO:'*':CassNo
|
||||
CurrStatus = Xlate('WO_MAT', WOMatKey, 'CURR_STATUS', 'X')
|
||||
If ( (CurrStatus EQ 'VER') OR (CurrStatus EQ 'LOAD') OR (CurrStatus EQ 'REL') ) then
|
||||
* If ( (CurrStatus EQ 'VER') ) then
|
||||
CassList = Insert(CassList, 0, -1, 0, CassNo)
|
||||
end
|
||||
Next CassNo
|
||||
end else
|
||||
CassList = Insert(CassList, 0, -1, 0, LocationCassNos)
|
||||
end
|
||||
Next Location
|
||||
|
||||
If CassList NE '' then
|
||||
RowNumber += 1
|
||||
Convert @VM to ',' in CassList
|
||||
COLDATA<RowNumber,1> = S.ReactNo
|
||||
COLDATA<RowNumber,2> = S.React_Type
|
||||
COLDATA<RowNumber,3> = S.Wafer_Size
|
||||
COLDATA<RowNumber,4> = S.WoNo
|
||||
SWAP '.1' WITH '' IN S.ProdOrdNo
|
||||
COLDATA<RowNumber,5> = S.ProdOrdNo
|
||||
COLDATA<RowNumber,6> = S.SubPartNo
|
||||
ColData<RowNumber,7> = S.EpiPartNo
|
||||
COLDATA<RowNumber,8> = S.WO_Qty
|
||||
COLDATA<RowNumber,9> = S.WO_RX_Qty
|
||||
COLDATA<RowNumber,10> = S.WO_UnRel_Qty
|
||||
COLDATA<RowNumber,11> = S.KitLocation
|
||||
COLDATA<RowNumber,12> = S.KitQty
|
||||
COLDATA<RowNumber,13> = S.PTILocation<0, fPos>
|
||||
COLDATA<RowNumber,14> = CassList
|
||||
|
||||
If COLDATA NE '' then GoSub PrintTable
|
||||
END
|
||||
END
|
||||
|
||||
GOTO ReadRecord
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Bail:
|
||||
* * * * * * *
|
||||
|
||||
stat = Set_Printer('TERM',1)
|
||||
SRP_Stopwatch('Stop', 'Build Report')
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
OIPrintErr:
|
||||
* * * * * * *
|
||||
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
ErrMsg(ErrorTitle:@SVM:'Set_Printer returned errorcode ':stat)
|
||||
stat = Set_Printer('TERM',1)
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * *
|
||||
PrintTable:
|
||||
* * * * * *
|
||||
|
||||
PageHeight = Get_Printer('PAGESIZE')<2>
|
||||
PrintableHeight = PageHeight - TopMargin - BottomMargin
|
||||
PrinterHeight = Get_Printer('POS')<2>
|
||||
|
||||
stat = Set_Printer('CALCTABLE',ColFmt:@FM:ColData)
|
||||
TableSize = Get_Printer('CALCTABLE')
|
||||
|
||||
|
||||
TableHeight = TableSize<2>
|
||||
|
||||
fontSpacing = 120
|
||||
|
||||
IF ( TableHeight + PrinterHeight >= PrintableHeight ) OR FirstLine THEN
|
||||
IF NOT(FirstLine) THEN
|
||||
stat = Set_Printer('PAGEBREAK')
|
||||
END
|
||||
FirstLine = 0
|
||||
font<2> = 10
|
||||
font<4> = 1 ;* Bold
|
||||
stat = Set_Printer('FONT',font,'100')
|
||||
|
||||
stat = Set_Printer('ADDTABLE',colFmt,colHead,'',LTGREY$,'',0,TB_ALL)
|
||||
|
||||
|
||||
font<4> = 0
|
||||
stat = Set_Printer('FONT',font,fontSpacing)
|
||||
|
||||
stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',0,7)
|
||||
|
||||
END ELSE
|
||||
font<2> = 10
|
||||
font<4> = 0
|
||||
stat = Set_Printer('FONT',font,fontSpacing)
|
||||
stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',1,TB_ALL)
|
||||
|
||||
END
|
||||
|
||||
|
||||
RETURN
|
||||
|
@ -1,534 +0,0 @@
|
||||
COMPILE SUBROUTINE Print_Demand(ReportParm)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
/*
|
||||
Print Material Demand Report
|
||||
10/27/2016 - John C Henry, J.C. Henry & Co., Inc. - Initial Coding
|
||||
10/05/2017 - Donald Bakke - No longer select SCHED_DET rows with an end date specified.
|
||||
10/24/2018 - Daniel Stieber - Patch added to resolve scheduling conflicts on the same day
|
||||
*/
|
||||
|
||||
DECLARE SUBROUTINE Utility, ErrMsg, Set_Status, Set_Printer, RList, SRP_Stopwatch
|
||||
DECLARE FUNCTION Set_Printer, Get_Printer, Msg, Get_Status, Printer_Select, obj_Install, Dialog_Box, obj_Location
|
||||
DECLARE FUNCTION Schedule_Services
|
||||
|
||||
$INSERT OIPRINT_EQUATES
|
||||
$INSERT SCHED_DET_EQUATES
|
||||
$INSERT WO_LOG_EQUATES
|
||||
$INSERT APPCOLORS
|
||||
$INSERT MSG_EQUATES
|
||||
$INSERT LOGICAL
|
||||
$INSERT SCHEDULE_EQU
|
||||
|
||||
EQU TAB$ TO \09\
|
||||
EQU TARGET_ACTIVELIST$ TO 5
|
||||
|
||||
ErrorTitle = 'Error in stored procedure Print_Demand'
|
||||
ErrCode = ''
|
||||
ErrorMsg = ''
|
||||
SRP_Stopwatch('Reset')
|
||||
SRP_Stopwatch('Start', 'Initializing')
|
||||
OPEN 'SCHED_DET' TO SchedDetTable ELSE
|
||||
ErrorMsg = 'Unable to open "SCHED_DET" table.'
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
RETURN
|
||||
END
|
||||
|
||||
OPEN 'DICT.SCHED_DET' TO @DICT ELSE
|
||||
ErrorMsg = 'Unable to open "SCHED_DET" table.'
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
RETURN
|
||||
END
|
||||
|
||||
// Two full week
|
||||
Today = OCONV(Date(),'D4/')
|
||||
EndDate = OCONV(Date()+13,'D4/')
|
||||
|
||||
ReactList = ''
|
||||
WOList = ''
|
||||
SchedDetKeys = ''
|
||||
|
||||
* SelectSent = 'SELECT SCHED_DET WITH SCHED_DT GE ':QUOTE(Today):' AND WITH SCHED_DT LE ':QUOTE(EndDate):' BY REACT_NO'
|
||||
SelectSent = 'SELECT SCHED_DET WITH SCHED_DT GE ':QUOTE(Today):' BY REACT_NO'
|
||||
|
||||
SRP_Stopwatch('Stop', 'Initializing')
|
||||
SRP_Stopwatch('Start', 'Data Select')
|
||||
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
RETURN
|
||||
END
|
||||
SRP_Stopwatch('Stop', 'Data Select')
|
||||
SRP_Stopwatch('Start', 'Build Key List')
|
||||
Done = 0
|
||||
|
||||
LOOP
|
||||
READNEXT @ID ELSE Done = 1
|
||||
UNTIL Done
|
||||
ReactNo = @ID[1,'*']
|
||||
SchedDt = @ID[COL2()+1,'*']
|
||||
SeqNo = @ID[COL2()+1,'*']
|
||||
* If @User4 EQ 'FRANCOIS_R' and ReactNo EQ '77' then debug
|
||||
READ SchedDetRec FROM SchedDetTable,@ID THEN
|
||||
|
||||
WONo = SchedDetRec<SCHED_DET_WO_NO$>
|
||||
|
||||
LOCATE ReactNo IN ReactList BY 'AR' USING @FM SETTING Pos ELSE
|
||||
ReactList = INSERT(ReactList,Pos,0,0,ReactNo)
|
||||
END
|
||||
|
||||
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
|
||||
WOList = INSERT(WOList,Pos,-1,0,WONo)
|
||||
// Patch added on 10/24/18 to resolve scheduling conflicts on the same day for
|
||||
// the material track report. - djs
|
||||
PrevSchedDetKey = SchedDetKeys[-1, 'B':@FM]
|
||||
PrevReactNo = Field(PrevSchedDetKey, '*', 1)
|
||||
PrevSchedDt = Field(PrevSchedDetKey, '*', 2)
|
||||
If (PrevReactNo EQ ReactNo) and (PrevSchedDt EQ SchedDt) then
|
||||
PrevSeqNo = Field(PrevSchedDetKey, '*', 3)
|
||||
NumWO = DCount(WOList<Pos>, @VM)
|
||||
PrevWONo = WOList<Pos, NumWO - 1>
|
||||
SchedEvents = Schedule_Services('GetScheduleEventSummary', ReactNo, WONo, SchedDt, SeqNo, True$)
|
||||
StartDt = IConv(SchedEvents<SCHEDULE_ENTRY_DATE$>, 'D')
|
||||
PrevSchedEvents = Schedule_Services('GetScheduleEventSummary', ReactNo, PrevWONo, PrevSchedDt, PrevSeqNo, True$)
|
||||
PrevStartDt = IConv(PrevSchedEvents<SCHEDULE_ENTRY_DATE$>, 'D')
|
||||
If StartDt GT PrevStartDt then
|
||||
// This is the common case
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
||||
end else
|
||||
// Scheduling irregularity - Insert this key in the second to last position.
|
||||
NumKeys = DCount(SchedDetKeys, @FM)
|
||||
InsertPos = NumKeys
|
||||
SchedDetKeys = INSERT(SchedDetKeys,InsertPos,0,0,@ID)
|
||||
end
|
||||
end else
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
||||
end
|
||||
END
|
||||
END
|
||||
|
||||
REPEAT
|
||||
|
||||
CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT)
|
||||
SRP_Stopwatch('Stop', 'Build Key List')
|
||||
SRP_Stopwatch('Start', 'Build Report')
|
||||
IF ReportParm = 'T' THEN
|
||||
|
||||
* Tracking Report
|
||||
|
||||
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'"
|
||||
MinDemand = 0
|
||||
|
||||
END
|
||||
|
||||
IF ReportParm = 'D' THEN
|
||||
|
||||
* Demand Report
|
||||
|
||||
MinDemand = Msg(@WINDOW,'','MIN_DEMAND_QTY')
|
||||
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Demand with Reactor Queue < ':MinDemand:' Cassettes':@VM:"Page 'P'"
|
||||
|
||||
END
|
||||
|
||||
Set_Status(0)
|
||||
|
||||
/*
|
||||
Today = OCONV(Date(),'D4/')
|
||||
Tomorrow = OCONV(Date()+1,'D4/')
|
||||
|
||||
SelectSent = 'SELECT SCHED_DET WITH SCHED_DT = ':QUOTE(Today):' BY REACT_NO'
|
||||
|
||||
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
RETURN
|
||||
END
|
||||
*/
|
||||
|
||||
* Start of printing process
|
||||
|
||||
FileName = 'Print Material Demand'
|
||||
Title = 'Printing Material Demand'
|
||||
|
||||
TopMargin = 1.0
|
||||
BottomMargin = 0.75
|
||||
LeftMargin = 0.25
|
||||
RightMargin = 0.25
|
||||
|
||||
Margins = LeftMargin:@FM:TopMargin:@FM:RightMargin:@FM:BottomMargin
|
||||
|
||||
PageSetup = '1' ;* LandScape
|
||||
PrintSetup = '2' ;* Preview Normal
|
||||
PrintSetup<1,2> = '0' ;* All buttons
|
||||
PrintSetup<1,5> = '1' ;* Page Range
|
||||
PrintSetup<1,6> = 7 ;* full mouse and keyboard support
|
||||
|
||||
If @UserName EQ 'MESCATXMUSER' then
|
||||
PageSetup = '1' ;* Landscape
|
||||
PrintSetup = '0' ;* Print to specific location
|
||||
PrintPath = Printer_Select(PrinterID) ;* Select printer - Displays popup if PrinterPort not found
|
||||
end else
|
||||
* PrintPath = Printer_Select('',1) ;* Get Default printer path
|
||||
PrintPath = ''
|
||||
end
|
||||
stat = Set_Printer('INIT',FileName,Title,Margins,PageSetup,PrintSetup,PrintPath)
|
||||
|
||||
IF stat < 0 THEN
|
||||
ErrorMsg = 'Stat = ' : Stat : ', PrintPath = ' : PrintPath
|
||||
GOTO OIPrintErr
|
||||
end
|
||||
DateRange = 'Effective ':OCONV(Date(),'D4')
|
||||
|
||||
|
||||
*Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'"
|
||||
Header<-1> = "'T'"
|
||||
Header<-1> = '' ;* Blank line following heading
|
||||
|
||||
font = 'Arial'
|
||||
font<2> = '10'
|
||||
font<4> = '0' ;* Bold
|
||||
|
||||
stat = Set_Printer('FONTHEADFOOT',font) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
stat = Set_Printer('HEADER',Header) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
|
||||
Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'"
|
||||
stat = Set_Printer('FOOTER',Footer) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
|
||||
*
|
||||
@RECCOUNT = 0
|
||||
FirstPass = 1
|
||||
LastRecord = 0
|
||||
FirstLine = 1
|
||||
fontSpacing = 100
|
||||
|
||||
* Make Column Heading
|
||||
|
||||
ColHead = '' ; ColFmt = ''
|
||||
ColHead<1,1> = 'React No' ; ColFmt<1,1> = '+^720'
|
||||
ColHead<1,2> = 'WO No' ; ColFmt<1,2> = '+^1260'
|
||||
ColHead<1,3> = 'Sub Part No' ; ColFmt<1,3> = '+<1800'
|
||||
ColHead<1,4> = 'Epi Part No' ; ColFmt<1,4> = '+<1800'
|
||||
ColHead<1,5> = 'WO Qty' ; ColFmt<1,5> = '+>720'
|
||||
ColHead<1,6> = 'RX Qty' ; ColFmt<1,6> = '+>720'
|
||||
ColHead<1,7> = 'UnRel Qty' ; ColFmt<1,7> = '+>720'
|
||||
ColHead<1,8> = 'Kit Location' ; ColFmt<1,8> = '+^1260'
|
||||
ColHead<1,9> = 'Kit Qty' ; ColFmt<1,9> = '+^1260'
|
||||
ColHead<1,10> = '1K Stage Location' ; ColFmt<1,10> = '+^1260'
|
||||
ColHead<1,11> = 'Stage Qty' ; ColFmt<1,11> = '+^1260'
|
||||
ColHead<1,12> = 'PTI Location' ; ColFmt<1,12> = '+^1260'
|
||||
ColHead<1,13> = 'PTI RO' ; ColFmt<1,13> = '+^1260'
|
||||
|
||||
|
||||
* Zero Accumulators For Each Break
|
||||
|
||||
Prev.ReactNo = ''
|
||||
Last.ReactNo.Break = 1
|
||||
|
||||
|
||||
* * * * * * *
|
||||
ReadRecord:
|
||||
* * * * * * *
|
||||
|
||||
* Zero Break Flags To False
|
||||
|
||||
ReactNo.Break=0
|
||||
|
||||
|
||||
READNEXT @ID, Which.Value ELSE
|
||||
LastRecord = 1
|
||||
ReactNo.Break = 1
|
||||
ReactNo = Prev.ReactNo
|
||||
END
|
||||
|
||||
S.ATID = @ID
|
||||
|
||||
IF FirstPass AND LastRecord THEN
|
||||
GOTO Bail
|
||||
END
|
||||
|
||||
IF LastRecord THEN GOTO BREAKS
|
||||
|
||||
|
||||
READO @RECORD FROM SchedDetTable,@ID ELSE
|
||||
GOTO ReadRecord
|
||||
END
|
||||
|
||||
@RECCOUNT += 1
|
||||
|
||||
* Calculate Value(s) For Column(s)
|
||||
|
||||
S.ATID = {@ID}
|
||||
I.ATID = S.ATID
|
||||
S.ReactNo = {REACT_NO}
|
||||
I.ReactNo = S.ReactNo
|
||||
S.WoNo = {WO_NO}
|
||||
I.WoNo = S.WoNo
|
||||
S.SubPartNo = XLATE('WO_LOG',S.WoNo,'ORD_SUB_PART_NO','X')
|
||||
I.SubPartNo = S.SubPartNo
|
||||
S.EpiPartNo = XLATE('WO_LOG',S.WoNo,WO_LOG_EPI_PART_NO$,'X')
|
||||
I.EpiPartNo = S.EpiPartNo
|
||||
S.WO_Qty = {WO_QTY}
|
||||
I.WO_Qty = S.WO_Qty
|
||||
S.WO_RX_Qty = {WO_RX_QTY}
|
||||
I.WO_RX_Qty = S.WO_RX_Qty
|
||||
S.WO_UnRel_QTY = {WO_UNREL_QTY}
|
||||
I.WO_UnRel_QTY = S.WO_UnRel_QTY
|
||||
S.Sched_DT = {SCHED_DT}
|
||||
I.Sched_DT = S.Sched_DT
|
||||
|
||||
KitData = obj_Location('KitLocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN KitData
|
||||
|
||||
S.KitLocation = KitData<1>
|
||||
I.KitLocation = S.KitLocation
|
||||
|
||||
S.KitQty = OCONV(SUM(KitData<2>) * 25,'MD0,Z')
|
||||
I.KitQty = S.KitQty
|
||||
|
||||
S.KitCassCnt = COUNT(KitData<3>,',') + (KitData<3> NE '')
|
||||
I.KitCassCnt = S.KitCassCnt
|
||||
|
||||
StageData = obj_Location('StageLocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN StageData
|
||||
|
||||
S.StageLocation = StageData<1>
|
||||
I.StageLocation = S.StageLocation
|
||||
|
||||
S.StageQty = StageData<3>
|
||||
I.StageQty = S.StageQty
|
||||
|
||||
S.StageCassCnt = COUNT(S.StageQty,',') + (S.StageQty NE '')
|
||||
I.StageCassCnt = S.StageCassCnt
|
||||
|
||||
PTIData = obj_Location('PTILocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN PTIData
|
||||
|
||||
S.PTILocation = PTIData<1>
|
||||
I.PTILocation = S.PTILocation
|
||||
|
||||
S.PTIQty = PTIData<3>
|
||||
I.PTIQty = S.PTIQty
|
||||
|
||||
S.PTICassCnt = COUNT(S.PTIQty,',') + (S.PTIQty NE '')
|
||||
I.PTICassCnt = S.PTICassCnt
|
||||
|
||||
|
||||
CassQueueCnt = I.KitCassCnt + I.StageCassCnt + I.PTICassCnt
|
||||
|
||||
|
||||
* TEST FOR CONTROL BREAK(S)
|
||||
|
||||
|
||||
IF (S.ReactNo NE Prev.ReactNo) OR ReactNo.Break THEN
|
||||
ReactNo = Prev.ReactNo
|
||||
Prev.ReactNo = S.ReactNo
|
||||
ReactNo.Break += 1
|
||||
END
|
||||
|
||||
IF FirstPass THEN
|
||||
FirstPass=0
|
||||
GOTO DETAIL
|
||||
END
|
||||
|
||||
* * * * * * *
|
||||
BREAKS:
|
||||
* * * * * * *
|
||||
|
||||
* Print Break Total(s) And Accumulate Total(s)
|
||||
|
||||
IF ReactNo.Break THEN
|
||||
|
||||
IF ReportParm = 'D' ELSE
|
||||
stat = Set_Printer('TEXT')
|
||||
END
|
||||
|
||||
/*
|
||||
ColData = ''
|
||||
ColData<1,1> = ''
|
||||
ColData<1,2> = ''
|
||||
ColData<1,3> = ''
|
||||
ColData<1,4> = ''
|
||||
ColData<1,5> = ''
|
||||
ColData<1,6> = ''
|
||||
ColData<1,7> = ''
|
||||
ColData<1,8> = ''
|
||||
ColData<1,9> = ''
|
||||
ColData<1,10> = ''
|
||||
|
||||
GOSUB PrintTable
|
||||
*/
|
||||
|
||||
|
||||
END
|
||||
|
||||
|
||||
* Perform Last Record Output If Done
|
||||
|
||||
IF LastRecord THEN
|
||||
|
||||
colData = ''
|
||||
|
||||
|
||||
GOTO Bail
|
||||
|
||||
END
|
||||
|
||||
|
||||
* * * * * * *
|
||||
DETAIL:
|
||||
* * * * * * *
|
||||
|
||||
* Do Conversion If Any
|
||||
|
||||
|
||||
IF ReportParm = 'T' OR CassQueueCnt < MinDemand THEN
|
||||
|
||||
IF S.REACTNO NE "" THEN S.REACTNO = OCONV(S.REACTNO,"MD0,")
|
||||
IF S.WONO NE "" THEN S.WONO = OCONV(S.WONO,"MD0")
|
||||
IF S.WO_QTY NE "" THEN S.WO_QTY = OCONV(S.WO_QTY,"MD0,")
|
||||
IF S.WO_RX_QTY NE "" THEN S.WO_RX_QTY = OCONV(S.WO_RX_QTY,"MD0,")
|
||||
IF S.WO_UNREL_QTY NE "" THEN S.WO_UNREL_QTY = OCONV(S.WO_UNREL_QTY,"MD0,")
|
||||
IF S.SCHED_DT NE "" THEN S.SCHED_DT = OCONV(S.SCHED_DT,"D4/")
|
||||
|
||||
* PRINT DETAIL LINE
|
||||
|
||||
* If @User4 EQ 'FRANCOIS_R' then
|
||||
|
||||
COLDATA = ''
|
||||
RowNumber = 0
|
||||
For each Location in S.PTILocation using @VM setting fPos
|
||||
LocationCassNos = S.PTIQty<0, fPos>
|
||||
FilteredCassList = ''
|
||||
|
||||
For each CassNo in LocationCassNos using ','
|
||||
WOMatKey = S.WoNo:'*':CassNo
|
||||
InvActions = Xlate('WO_MAT', WOMatKey, 'INV_ACTION', 'X')
|
||||
NumActions = DCount(InvActions, @VM)
|
||||
CurrAction = InvActions<0, NumActions>
|
||||
If CurrAction EQ 'PLACE' then
|
||||
FilteredCassList<0, -1> = CassNo
|
||||
end
|
||||
Next CassNo
|
||||
If ( (FilteredCassList NE '') and (Location NE '') ) or ( (FilteredCassList EQ '') and (Location EQ '') ) then
|
||||
|
||||
RowNumber += 1
|
||||
Convert @VM to ',' in FilteredCassList
|
||||
COLDATA<RowNumber,1> = S.ReactNo
|
||||
COLDATA<RowNumber,2> = S.WoNo
|
||||
COLDATA<RowNumber,3> = S.SubPartNo
|
||||
ColData<RowNumber,4> = S.EpiPartNo
|
||||
COLDATA<RowNumber,5> = S.WO_Qty
|
||||
COLDATA<RowNumber,6> = S.WO_RX_Qty
|
||||
COLDATA<RowNumber,7> = S.WO_UnRel_Qty
|
||||
COLDATA<RowNumber,8> = S.KitLocation
|
||||
COLDATA<RowNumber,9> = S.KitQty ; *ColFmt<1,9> = '_<1260'
|
||||
COLDATA<RowNumber,10> = S.StageLocation
|
||||
COLDATA<RowNumber,11> = S.StageQty ; *ColFmt<1,11> = '_<1260'
|
||||
COLDATA<RowNumber,12> = S.PTILocation<0, fPos>
|
||||
* COLDATA<fPos,13> = S.PTIQty<0, fPos> ; *ColFmt<1,13> = '_<1260'
|
||||
COLDATA<RowNumber,13> = FilteredCassList
|
||||
end
|
||||
Next Location
|
||||
* end else
|
||||
*
|
||||
* COLDATA = ''
|
||||
* COLDATA<1,1> = S.ReactNo
|
||||
* COLDATA<1,2> = S.WoNo
|
||||
* COLDATA<1,3> = S.SubPartNo
|
||||
* ColData<1,4> = S.EpiPartNo
|
||||
* COLDATA<1,5> = S.WO_Qty
|
||||
* COLDATA<1,6> = S.WO_RX_Qty
|
||||
* COLDATA<1,7> = S.WO_UnRel_Qty
|
||||
* COLDATA<1,8> = S.KitLocation
|
||||
* COLDATA<1,9> = S.KitQty ; *ColFmt<1,9> = '_<1260'
|
||||
* COLDATA<1,10> = S.StageLocation
|
||||
* COLDATA<1,11> = S.StageQty ; *ColFmt<1,11> = '_<1260'
|
||||
* COLDATA<1,12> = S.PTILocation
|
||||
* COLDATA<1,13> = S.PTIQty ; *ColFmt<1,13> = '_<1260'
|
||||
* end
|
||||
|
||||
* If @User4 EQ 'FRANCOIS_R' then
|
||||
If COLDATA NE '' then GoSub PrintTable
|
||||
* end else
|
||||
* GOSUB PrintTable
|
||||
* end
|
||||
|
||||
END
|
||||
|
||||
|
||||
GOTO ReadRecord
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Bail:
|
||||
* * * * * * *
|
||||
|
||||
stat = Set_Printer('TERM',1)
|
||||
SRP_Stopwatch('Stop', 'Build Report')
|
||||
* If @UserName EQ 'FRANCOIS_R' then SRP_Stopwatch('ShowAll')
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
OIPrintErr:
|
||||
* * * * * * *
|
||||
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
ErrMsg(ErrorTitle:@SVM:'Set_Printer returned errorcode ':stat)
|
||||
stat = Set_Printer('TERM',1)
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * *
|
||||
PrintTable:
|
||||
* * * * * *
|
||||
|
||||
PageHeight = Get_Printer('PAGESIZE')<2>
|
||||
PrintableHeight = PageHeight - TopMargin - BottomMargin
|
||||
PrinterHeight = Get_Printer('POS')<2>
|
||||
|
||||
stat = Set_Printer('CALCTABLE',ColFmt:@FM:ColData)
|
||||
TableSize = Get_Printer('CALCTABLE')
|
||||
|
||||
|
||||
TableHeight = TableSize<2>
|
||||
|
||||
fontSpacing = 120
|
||||
|
||||
IF ( TableHeight + PrinterHeight >= PrintableHeight ) OR FirstLine THEN
|
||||
IF NOT(FirstLine) THEN
|
||||
stat = Set_Printer('PAGEBREAK')
|
||||
END
|
||||
FirstLine = 0
|
||||
font<2> = 10
|
||||
font<4> = 1 ;* Bold
|
||||
stat = Set_Printer('FONT',font,'100')
|
||||
|
||||
stat = Set_Printer('ADDTABLE',colFmt,colHead,'',LTGREY$,'',0,TB_ALL)
|
||||
|
||||
|
||||
font<4> = 0
|
||||
stat = Set_Printer('FONT',font,fontSpacing)
|
||||
|
||||
stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',0,7)
|
||||
|
||||
END ELSE
|
||||
font<2> = 10
|
||||
font<4> = 0
|
||||
stat = Set_Printer('FONT',font,fontSpacing)
|
||||
stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',1,TB_ALL)
|
||||
|
||||
END
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -1,545 +0,0 @@
|
||||
COMPILE SUBROUTINE Print_Demand(ReportParm)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
/*
|
||||
Print Material Demand Report
|
||||
10/27/2016 - John C Henry, J.C. Henry & Co., Inc. - Initial Coding
|
||||
10/05/2017 - Donald Bakke - No longer select SCHED_DET rows with an end date specified.
|
||||
10/24/2018 - Daniel Stieber - Patch added to resolve scheduling conflicts on the same day
|
||||
*/
|
||||
|
||||
DECLARE SUBROUTINE Utility, ErrMsg, Set_Status, Set_Printer, RList, SRP_Stopwatch
|
||||
DECLARE FUNCTION Set_Printer, Get_Printer, Msg, Get_Status, Printer_Select, obj_Install, Dialog_Box, obj_Location
|
||||
DECLARE FUNCTION Schedule_Services
|
||||
|
||||
$INSERT OIPRINT_EQUATES
|
||||
$INSERT SCHED_DET_EQUATES
|
||||
$INSERT WO_LOG_EQUATES
|
||||
$INSERT APPCOLORS
|
||||
$INSERT MSG_EQUATES
|
||||
$INSERT LOGICAL
|
||||
$INSERT SCHEDULE_EQU
|
||||
|
||||
EQU TAB$ TO \09\
|
||||
EQU TARGET_ACTIVELIST$ TO 5
|
||||
|
||||
ErrorTitle = 'Error in stored procedure Print_Demand'
|
||||
ErrCode = ''
|
||||
ErrorMsg = ''
|
||||
SRP_Stopwatch('Reset')
|
||||
SRP_Stopwatch('Start', 'Initializing')
|
||||
OPEN 'SCHED_DET' TO SchedDetTable ELSE
|
||||
ErrorMsg = 'Unable to open "SCHED_DET" table.'
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
RETURN
|
||||
END
|
||||
|
||||
OPEN 'DICT.SCHED_DET' TO @DICT ELSE
|
||||
ErrorMsg = 'Unable to open "SCHED_DET" table.'
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
RETURN
|
||||
END
|
||||
|
||||
// Two full week
|
||||
Today = OCONV(Date(),'D4/')
|
||||
*Today = OCONV(Date()-60,'D4/')
|
||||
EndDate = OCONV(Date()+13,'D4/')
|
||||
|
||||
|
||||
ReactList = ''
|
||||
WOList = ''
|
||||
SchedDetKeys = ''
|
||||
|
||||
* SelectSent = 'SELECT SCHED_DET WITH SCHED_DT GE ':QUOTE(Today):' AND WITH SCHED_DT LE ':QUOTE(EndDate):' BY REACT_NO'
|
||||
SelectSent = 'SELECT SCHED_DET WITH SCHED_DT GE ':QUOTE(Today):' BY REACT_NO'
|
||||
*SelectSent = 'SELECT SCHED_DET WITH SCHED_DT GE ':QUOTE(Today):' BY REACT_NO'
|
||||
|
||||
|
||||
SRP_Stopwatch('Stop', 'Initializing')
|
||||
SRP_Stopwatch('Start', 'Data Select')
|
||||
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
RETURN
|
||||
END
|
||||
SRP_Stopwatch('Stop', 'Data Select')
|
||||
SRP_Stopwatch('Start', 'Build Key List')
|
||||
Done = 0
|
||||
|
||||
LOOP
|
||||
READNEXT @ID ELSE Done = 1
|
||||
UNTIL Done
|
||||
ReactNo = @ID[1,'*']
|
||||
SchedDt = @ID[COL2()+1,'*']
|
||||
SeqNo = @ID[COL2()+1,'*']
|
||||
|
||||
READ SchedDetRec FROM SchedDetTable,@ID THEN
|
||||
|
||||
WONo = SchedDetRec<SCHED_DET_WO_NO$>
|
||||
|
||||
LOCATE ReactNo IN ReactList BY 'AR' USING @FM SETTING Pos ELSE
|
||||
ReactList = INSERT(ReactList,Pos,0,0,ReactNo)
|
||||
END
|
||||
|
||||
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
|
||||
WOList = INSERT(WOList,Pos,-1,0,WONo)
|
||||
// Patch added on 10/24/18 to resolve scheduling conflicts on the same day for
|
||||
// the material track report. - djs
|
||||
PrevSchedDetKey = SchedDetKeys[-1, 'B':@FM]
|
||||
PrevReactNo = Field(PrevSchedDetKey, '*', 1)
|
||||
PrevSchedDt = Field(PrevSchedDetKey, '*', 2)
|
||||
If (PrevReactNo EQ ReactNo) and (PrevSchedDt EQ SchedDt) then
|
||||
PrevSeqNo = Field(PrevSchedDetKey, '*', 3)
|
||||
NumWO = DCount(WOList<Pos>, @VM)
|
||||
PrevWONo = WOList<Pos, NumWO - 1>
|
||||
SchedEvents = Schedule_Services('GetScheduleEventSummary', ReactNo, WONo, SchedDt, SeqNo, True$)
|
||||
StartDt = IConv(SchedEvents<SCHEDULE_ENTRY_DATE$>, 'D')
|
||||
PrevSchedEvents = Schedule_Services('GetScheduleEventSummary', ReactNo, PrevWONo, PrevSchedDt, PrevSeqNo, True$)
|
||||
PrevStartDt = IConv(PrevSchedEvents<SCHEDULE_ENTRY_DATE$>, 'D')
|
||||
If StartDt GT PrevStartDt then
|
||||
// This is the common case
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
||||
end else
|
||||
// Scheduling irregularity - Insert this key in the second to last position.
|
||||
NumKeys = DCount(SchedDetKeys, @FM)
|
||||
InsertPos = NumKeys
|
||||
SchedDetKeys = INSERT(SchedDetKeys,InsertPos,0,0,@ID)
|
||||
end
|
||||
end else
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
||||
end
|
||||
END
|
||||
END
|
||||
|
||||
REPEAT
|
||||
|
||||
CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT)
|
||||
SRP_Stopwatch('Stop', 'Build Key List')
|
||||
SRP_Stopwatch('Start', 'Build Report')
|
||||
IF ReportParm = 'T' THEN
|
||||
|
||||
* Tracking Report
|
||||
|
||||
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'"
|
||||
MinDemand = 0
|
||||
|
||||
END
|
||||
|
||||
IF ReportParm = 'D' THEN
|
||||
|
||||
* Demand Report
|
||||
|
||||
MinDemand = Msg(@WINDOW,'','MIN_DEMAND_QTY')
|
||||
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Demand with Reactor Queue < ':MinDemand:' Cassettes':@VM:"Page 'P'"
|
||||
|
||||
END
|
||||
|
||||
Set_Status(0)
|
||||
|
||||
/*
|
||||
Today = OCONV(Date(),'D4/')
|
||||
Tomorrow = OCONV(Date()+1,'D4/')
|
||||
|
||||
SelectSent = 'SELECT SCHED_DET WITH SCHED_DT = ':QUOTE(Today):' BY REACT_NO'
|
||||
|
||||
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
RETURN
|
||||
END
|
||||
*/
|
||||
|
||||
* Start of printing process
|
||||
|
||||
FileName = 'Print Material Demand'
|
||||
Title = 'Printing Material Demand'
|
||||
|
||||
TopMargin = 1.0
|
||||
BottomMargin = 0.75
|
||||
LeftMargin = 0.25
|
||||
RightMargin = 0.25
|
||||
|
||||
Margins = LeftMargin:@FM:TopMargin:@FM:RightMargin:@FM:BottomMargin
|
||||
|
||||
PageSetup = '1' ;* LandScape
|
||||
PrintSetup = '2' ;* Preview Normal
|
||||
PrintSetup<1,2> = '0' ;* All buttons
|
||||
PrintSetup<1,5> = '1' ;* Page Range
|
||||
PrintSetup<1,6> = 7 ;* full mouse and keyboard support
|
||||
|
||||
If @UserName EQ 'MESCATXMUSER' then
|
||||
PageSetup = '1' ;* Landscape
|
||||
PrintSetup = '0' ;* Print to specific location
|
||||
PrintPath = Printer_Select(PrinterID) ;* Select printer - Displays popup if PrinterPort not found
|
||||
end else
|
||||
* PrintPath = Printer_Select('',1) ;* Get Default printer path
|
||||
PrintPath = ''
|
||||
end
|
||||
stat = Set_Printer('INIT',FileName,Title,Margins,PageSetup,PrintSetup,PrintPath)
|
||||
|
||||
IF stat < 0 THEN
|
||||
ErrorMsg = 'Stat = ' : Stat : ', PrintPath = ' : PrintPath
|
||||
GOTO OIPrintErr
|
||||
end
|
||||
DateRange = 'Effective ':OCONV(Date(),'D4')
|
||||
|
||||
|
||||
*Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'"
|
||||
Header<-1> = "'T'"
|
||||
Header<-1> = '' ;* Blank line following heading
|
||||
|
||||
font = 'Arial'
|
||||
font<2> = '10'
|
||||
font<4> = '0' ;* Bold
|
||||
|
||||
stat = Set_Printer('FONTHEADFOOT',font) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
stat = Set_Printer('HEADER',Header) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
|
||||
Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'"
|
||||
stat = Set_Printer('FOOTER',Footer) ; IF stat < 0 THEN GOTO OIPrintErr
|
||||
|
||||
*
|
||||
@RECCOUNT = 0
|
||||
FirstPass = 1
|
||||
LastRecord = 0
|
||||
FirstLine = 1
|
||||
fontSpacing = 100
|
||||
|
||||
* Make Column Heading
|
||||
|
||||
ColHead = '' ; ColFmt = ''
|
||||
ColHead<1,1> = 'React No' ; ColFmt<1,1> = '+^720'
|
||||
ColHead<1,2> = 'React Type' ; ColFmt<1,2> = '+<^720'
|
||||
ColHead<1,3> = 'Wafer Size' ; ColFmt<1,3> = '+^1000'
|
||||
ColHead<1,4> = 'WO No' ; ColFmt<1,4> = '+^1000'
|
||||
ColHead<1,5> = 'Sub Part No' ; ColFmt<1,5> = '+<1200'
|
||||
ColHead<1,6> = 'Epi Part No' ; ColFmt<1,6> = '+<1200'
|
||||
ColHead<1,7> = 'WO Qty' ; ColFmt<1,7> = '+>720'
|
||||
ColHead<1,8> = 'RX Qty' ; ColFmt<1,8> = '+>720'
|
||||
ColHead<1,9> = 'UnRel Qty' ; ColFmt<1,9> = '+>720'
|
||||
ColHead<1,10> = 'Kit Location' ; ColFmt<1,10> = '+^1260'
|
||||
ColHead<1,11> = 'Kit Qty' ; ColFmt<1,11> = '+^720'
|
||||
ColHead<1,12> = '1K Stage Location' ; ColFmt<1,12> = '+^1260'
|
||||
ColHead<1,13> = 'Stage Qty' ; ColFmt<1,13> = '+^1260'
|
||||
ColHead<1,14> = 'PTI Location' ; ColFmt<1,14> = '+^1260'
|
||||
ColHead<1,15> = 'PTI RO' ; ColFmt<1,15> = '+^1260'
|
||||
|
||||
|
||||
* Zero Accumulators For Each Break
|
||||
|
||||
Prev.ReactNo = ''
|
||||
Last.ReactNo.Break = 1
|
||||
|
||||
|
||||
* * * * * * *
|
||||
ReadRecord:
|
||||
* * * * * * *
|
||||
|
||||
* Zero Break Flags To False
|
||||
|
||||
ReactNo.Break=0
|
||||
|
||||
|
||||
READNEXT @ID, Which.Value ELSE
|
||||
LastRecord = 1
|
||||
ReactNo.Break = 1
|
||||
ReactNo = Prev.ReactNo
|
||||
END
|
||||
|
||||
S.ATID = @ID
|
||||
|
||||
IF FirstPass AND LastRecord THEN
|
||||
GOTO Bail
|
||||
END
|
||||
|
||||
IF LastRecord THEN GOTO BREAKS
|
||||
|
||||
|
||||
READO @RECORD FROM SchedDetTable,@ID ELSE
|
||||
GOTO ReadRecord
|
||||
END
|
||||
|
||||
@RECCOUNT += 1
|
||||
|
||||
* Calculate Value(s) For Column(s)
|
||||
|
||||
S.ATID = {@ID}
|
||||
I.ATID = S.ATID
|
||||
S.ReactNo = {REACT_NO}
|
||||
I.ReactNo = S.ReactNo
|
||||
S.WoNo = {WO_NO}
|
||||
I.WoNo = S.WoNo
|
||||
S.SubPartNo = XLATE('WO_LOG',S.WoNo,'ORD_SUB_PART_NO','X')
|
||||
I.SubPartNo = S.SubPartNo
|
||||
S.EpiPartNo = XLATE('WO_LOG',S.WoNo,WO_LOG_EPI_PART_NO$,'X')
|
||||
I.EpiPartNo = S.EpiPartNo
|
||||
S.WO_Qty = {WO_QTY}
|
||||
I.WO_Qty = S.WO_Qty
|
||||
S.WO_RX_Qty = {WO_RX_QTY}
|
||||
I.WO_RX_Qty = S.WO_RX_Qty
|
||||
S.WO_UnRel_QTY = {WO_UNREL_QTY}
|
||||
I.WO_UnRel_QTY = S.WO_UnRel_QTY
|
||||
S.Sched_DT = {SCHED_DT}
|
||||
I.Sched_DT = S.Sched_DT
|
||||
*Changed Here JRO
|
||||
S.REACT_TYPE = {REACTOR_TYPE}
|
||||
S.WAFER_SIZE = {WAFER_SIZE}
|
||||
|
||||
KitData = obj_Location('KitLocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN KitData
|
||||
|
||||
S.KitLocation = KitData<1>
|
||||
I.KitLocation = S.KitLocation
|
||||
|
||||
S.KitQty = OCONV(SUM(KitData<2>) * 25,'MD0,Z')
|
||||
I.KitQty = S.KitQty
|
||||
|
||||
S.KitCassCnt = COUNT(KitData<3>,',') + (KitData<3> NE '')
|
||||
I.KitCassCnt = S.KitCassCnt
|
||||
|
||||
StageData = obj_Location('StageLocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN StageData
|
||||
|
||||
S.StageLocation = StageData<1>
|
||||
I.StageLocation = S.StageLocation
|
||||
|
||||
S.StageQty = StageData<3>
|
||||
I.StageQty = S.StageQty
|
||||
|
||||
S.StageCassCnt = COUNT(S.StageQty,',') + (S.StageQty NE '')
|
||||
I.StageCassCnt = S.StageCassCnt
|
||||
|
||||
PTIData = obj_Location('PTILocations',S.WONo)
|
||||
|
||||
SWAP CRLF$ WITH @VM IN PTIData
|
||||
|
||||
S.PTILocation = PTIData<1>
|
||||
I.PTILocation = S.PTILocation
|
||||
|
||||
S.PTIQty = PTIData<3>
|
||||
I.PTIQty = S.PTIQty
|
||||
|
||||
S.PTICassCnt = COUNT(S.PTIQty,',') + (S.PTIQty NE '')
|
||||
I.PTICassCnt = S.PTICassCnt
|
||||
|
||||
|
||||
CassQueueCnt = I.KitCassCnt + I.StageCassCnt + I.PTICassCnt
|
||||
|
||||
|
||||
* TEST FOR CONTROL BREAK(S)
|
||||
|
||||
|
||||
IF (S.ReactNo NE Prev.ReactNo) OR ReactNo.Break THEN
|
||||
ReactNo = Prev.ReactNo
|
||||
Prev.ReactNo = S.ReactNo
|
||||
ReactNo.Break += 1
|
||||
END
|
||||
|
||||
IF FirstPass THEN
|
||||
FirstPass=0
|
||||
GOTO DETAIL
|
||||
END
|
||||
|
||||
* * * * * * *
|
||||
BREAKS:
|
||||
* * * * * * *
|
||||
|
||||
* Print Break Total(s) And Accumulate Total(s)
|
||||
|
||||
IF ReactNo.Break THEN
|
||||
|
||||
IF ReportParm = 'D' ELSE
|
||||
stat = Set_Printer('TEXT')
|
||||
END
|
||||
|
||||
/*
|
||||
ColData = ''
|
||||
ColData<1,1> = ''
|
||||
ColData<1,2> = ''
|
||||
ColData<1,3> = ''
|
||||
ColData<1,4> = ''
|
||||
ColData<1,5> = ''
|
||||
ColData<1,6> = ''
|
||||
ColData<1,7> = ''
|
||||
ColData<1,8> = ''
|
||||
ColData<1,9> = ''
|
||||
ColData<1,10> = ''
|
||||
|
||||
GOSUB PrintTable
|
||||
*/
|
||||
|
||||
|
||||
END
|
||||
|
||||
|
||||
* Perform Last Record Output If Done
|
||||
|
||||
IF LastRecord THEN
|
||||
|
||||
colData = ''
|
||||
|
||||
|
||||
GOTO Bail
|
||||
|
||||
END
|
||||
|
||||
|
||||
* * * * * * *
|
||||
DETAIL:
|
||||
* * * * * * *
|
||||
|
||||
* Do Conversion If Any
|
||||
|
||||
|
||||
IF ReportParm = 'T' OR CassQueueCnt < MinDemand THEN
|
||||
|
||||
IF S.REACTNO NE "" THEN S.REACTNO = OCONV(S.REACTNO,"MD0,")
|
||||
IF S.WONO NE "" THEN S.WONO = OCONV(S.WONO,"MD0")
|
||||
IF S.WO_QTY NE "" THEN S.WO_QTY = OCONV(S.WO_QTY,"MD0,")
|
||||
IF S.WO_RX_QTY NE "" THEN S.WO_RX_QTY = OCONV(S.WO_RX_QTY,"MD0,")
|
||||
IF S.WO_UNREL_QTY NE "" THEN S.WO_UNREL_QTY = OCONV(S.WO_UNREL_QTY,"MD0,")
|
||||
IF S.SCHED_DT NE "" THEN S.SCHED_DT = OCONV(S.SCHED_DT,"D4/")
|
||||
|
||||
* PRINT DETAIL LINE
|
||||
|
||||
* If @User4 EQ 'FRANCOIS_R' then
|
||||
|
||||
COLDATA = ''
|
||||
RowNumber = 0
|
||||
For each Location in S.PTILocation using @VM setting fPos
|
||||
LocationCassNos = S.PTIQty<0, fPos>
|
||||
FilteredCassList = ''
|
||||
|
||||
For each CassNo in LocationCassNos using ','
|
||||
WOMatKey = S.WoNo:'*':CassNo
|
||||
InvActions = Xlate('WO_MAT', WOMatKey, 'INV_ACTION', 'X')
|
||||
NumActions = DCount(InvActions, @VM)
|
||||
CurrAction = InvActions<0, NumActions>
|
||||
If CurrAction EQ 'PLACE' then
|
||||
FilteredCassList<0, -1> = CassNo
|
||||
end
|
||||
Next CassNo
|
||||
If ( (FilteredCassList NE '') and (Location NE '') ) or ( (FilteredCassList EQ '') and (Location EQ '') ) then
|
||||
|
||||
RowNumber += 1
|
||||
Convert @VM to ',' in FilteredCassList
|
||||
COLDATA<RowNumber,1> = S.ReactNo
|
||||
COLDATA<RowNumber,2> = S.React_Type
|
||||
COLDATA<RowNumber,3> = S.Wafer_Size
|
||||
COLDATA<RowNumber,4> = S.WoNo
|
||||
COLDATA<RowNumber,5> = S.SubPartNo
|
||||
ColData<RowNumber,6> = S.EpiPartNo
|
||||
COLDATA<RowNumber,7> = S.WO_Qty
|
||||
COLDATA<RowNumber,8> = S.WO_RX_Qty
|
||||
COLDATA<RowNumber,9> = S.WO_UnRel_Qty
|
||||
COLDATA<RowNumber,10> = S.KitLocation
|
||||
COLDATA<RowNumber,11> = S.KitQty ; *ColFmt<1,9> = '_<1260'
|
||||
COLDATA<RowNumber,12> = S.StageLocation
|
||||
COLDATA<RowNumber,13> = S.StageQty ; *ColFmt<1,11> = '_<1260'
|
||||
COLDATA<RowNumber,14> = S.PTILocation<0, fPos>
|
||||
* COLDATA<fPos,13> = S.PTIQty<0, fPos> ; *ColFmt<1,13> = '_<1260'
|
||||
COLDATA<RowNumber,15> = FilteredCassList
|
||||
end
|
||||
Next Location
|
||||
* end else
|
||||
*
|
||||
* COLDATA = ''
|
||||
* COLDATA<1,1> = S.ReactNo
|
||||
* COLDATA<1,2> = S.WoNo
|
||||
* COLDATA<1,3> = S.SubPartNo
|
||||
* ColData<1,4> = S.EpiPartNo
|
||||
* COLDATA<1,5> = S.WO_Qty
|
||||
* COLDATA<1,6> = S.WO_RX_Qty
|
||||
* COLDATA<1,7> = S.WO_UnRel_Qty
|
||||
* COLDATA<1,8> = S.KitLocation
|
||||
* COLDATA<1,9> = S.KitQty ; *ColFmt<1,9> = '_<1260'
|
||||
* COLDATA<1,10> = S.StageLocation
|
||||
* COLDATA<1,11> = S.StageQty ; *ColFmt<1,11> = '_<1260'
|
||||
* COLDATA<1,12> = S.PTILocation
|
||||
* COLDATA<1,13> = S.PTIQty ; *ColFmt<1,13> = '_<1260'
|
||||
* end
|
||||
|
||||
* If @User4 EQ 'FRANCOIS_R' then
|
||||
If COLDATA NE '' then GoSub PrintTable
|
||||
* end else
|
||||
* GOSUB PrintTable
|
||||
* end
|
||||
|
||||
END
|
||||
|
||||
|
||||
GOTO ReadRecord
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Bail:
|
||||
* * * * * * *
|
||||
|
||||
stat = Set_Printer('TERM',1)
|
||||
SRP_Stopwatch('Stop', 'Build Report')
|
||||
* If @UserName EQ 'FRANCOIS_R' then SRP_Stopwatch('ShowAll')
|
||||
RETURN
|
||||
debug
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
OIPrintErr:
|
||||
* * * * * * *
|
||||
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
ErrMsg(ErrorTitle:@SVM:'Set_Printer returned errorcode ':stat)
|
||||
stat = Set_Printer('TERM',1)
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * *
|
||||
PrintTable:
|
||||
* * * * * *
|
||||
|
||||
PageHeight = Get_Printer('PAGESIZE')<2>
|
||||
PrintableHeight = PageHeight - TopMargin - BottomMargin
|
||||
PrinterHeight = Get_Printer('POS')<2>
|
||||
|
||||
stat = Set_Printer('CALCTABLE',ColFmt:@FM:ColData)
|
||||
TableSize = Get_Printer('CALCTABLE')
|
||||
|
||||
|
||||
TableHeight = TableSize<2>
|
||||
|
||||
fontSpacing = 120
|
||||
|
||||
IF ( TableHeight + PrinterHeight >= PrintableHeight ) OR FirstLine THEN
|
||||
IF NOT(FirstLine) THEN
|
||||
stat = Set_Printer('PAGEBREAK')
|
||||
END
|
||||
FirstLine = 0
|
||||
font<2> = 10
|
||||
font<4> = 1 ;* Bold
|
||||
stat = Set_Printer('FONT',font,'100')
|
||||
|
||||
stat = Set_Printer('ADDTABLE',colFmt,colHead,'',LTGREY$,'',0,TB_ALL)
|
||||
|
||||
|
||||
font<4> = 0
|
||||
stat = Set_Printer('FONT',font,fontSpacing)
|
||||
|
||||
stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',0,7)
|
||||
|
||||
END ELSE
|
||||
font<2> = 10
|
||||
font<4> = 0
|
||||
stat = Set_Printer('FONT',font,fontSpacing)
|
||||
stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',1,TB_ALL)
|
||||
|
||||
END
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -648,7 +648,9 @@ Service GetMaterialTrackJSON()
|
||||
SRP_JSON(objRow, 'SetValue', 'CassDelta', Row<MATERIAL_REPORT.CASS_DELTA$>)
|
||||
Swap ',' with ', ' in KitRunOrder
|
||||
SRP_JSON(objRow, 'SetValue', 'KitRunOrder', KitRunOrder)
|
||||
SRP_JSON(objRow, 'SetValue', 'KitDemand', Row<MATERIAL_REPORT.KIT_DEMAND$>)
|
||||
KitDemand = Row<MATERIAL_REPORT.KIT_DEMAND$>
|
||||
Swap ',' with ', ' in KitDemand
|
||||
SRP_JSON(objRow, 'SetValue', 'KitDemand', KitDemand)
|
||||
Swap ',' with ', ' in PTIRunOrder
|
||||
SRP_JSON(objRow, 'SetValue', 'PtiRunOrder', PTIRunOrder)
|
||||
Swap ',' with ', ' in LoadRunOrder
|
||||
@ -1080,7 +1082,9 @@ Service CalcDailyPerformanceData(DateOut)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GenerateOrUpdateDailyReactorUptimeData()
|
||||
|
||||
//Generates new or updates existing Reactor uptime data for all reactors in the current day.
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
Lock hSysLists, ServiceKeyID then
|
||||
@ -1104,9 +1108,12 @@ Service GenerateOrUpdateDailyReactorUptimeData()
|
||||
Database_Services('WriteDataRow', 'REACTOR_DAILY_UPTIME', ALLRecordKey, ALLUptimeRec, True$, False$, True$)
|
||||
Unlock hSysLists, ServiceKeyID else Null
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetDailyReactorUptimeDataJSON(ReportStartDt, ReportEndDt)
|
||||
|
||||
Response = ''
|
||||
Begin Case
|
||||
Case ReportStartDt EQ ''
|
||||
@ -1253,8 +1260,10 @@ Service GetDailyReactorUptimeDataJSON(ReportStartDt, ReportEndDt)
|
||||
SRP_Json(ReactorUptimeJson, "Release")
|
||||
Response = ResponseJson
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetDailyPerformanceDataJSON(DateOut)
|
||||
|
||||
Response = ''
|
||||
@ -1454,6 +1463,7 @@ Service GenerateMaterialTrackRows()
|
||||
Today = Datetime()
|
||||
|
||||
ReactList = ''
|
||||
RemainingReactorDemandList = ''
|
||||
WOList = ''
|
||||
SchedDetKeys = ''
|
||||
PrevReactNo = ''
|
||||
@ -1468,6 +1478,10 @@ Service GenerateMaterialTrackRows()
|
||||
RETURN
|
||||
END
|
||||
|
||||
AsmDemand = Database_Services('ReadDataRow', 'APP_INFO', 'MATERIAL_REPORT*ASM_DEMAND')
|
||||
HtrDemand = Database_Services('ReadDataRow', 'APP_INFO', 'MATERIAL_REPORT*HTR_DEMAND')
|
||||
EppDemand = Database_Services('ReadDataRow', 'APP_INFO', 'MATERIAL_REPORT*EPP_DEMAND')
|
||||
|
||||
Done = 0
|
||||
CurrSchedDetKey = ''
|
||||
LOOP
|
||||
@ -1479,13 +1493,25 @@ Service GenerateMaterialTrackRows()
|
||||
WONo = SchedDetRec<SCHED_DET_NG.WO_NO$>
|
||||
If ReactNo NE '' then
|
||||
LOCATE ReactNo IN ReactList BY 'AR' USING @FM SETTING Pos ELSE
|
||||
ReactList = INSERT(ReactList,Pos,0,0,ReactNo)
|
||||
ReactType = Database_Services('ReadDataColumn', 'REACTOR', ReactNo, REACTOR_REACT_TYPE$)
|
||||
ReactList = Insert(ReactList,Pos,0,0,ReactNo)
|
||||
Begin Case
|
||||
Case IndexC(ReactType, 'ASM', 1)
|
||||
ReactTypeDemand = AsmDemand
|
||||
Case IndexC(ReactType, 'HTR', 1)
|
||||
ReactTypeDemand = HtrDemand
|
||||
Case IndexC(ReactType, 'EPP', 1)
|
||||
ReactTypeDemand = EppDemand
|
||||
Case Otherwise$
|
||||
ReactTypeDemand = 0
|
||||
End Case
|
||||
RemainingReactorDemandList = Insert(RemainingReactorDemandList, Pos, 0, 0, ReactTypeDemand)
|
||||
END
|
||||
END
|
||||
If WONo NE '' then
|
||||
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
|
||||
WOList = INSERT(WOList,Pos,-1,0,WONo)
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,CurrSchedDetKey)
|
||||
WOList = Insert(WOList,Pos,-1,0,WONo)
|
||||
SchedDetKeys = Insert(SchedDetKeys,-1,0,0,CurrSchedDetKey)
|
||||
END
|
||||
END
|
||||
END
|
||||
@ -1714,36 +1740,42 @@ Service GenerateMaterialTrackRows()
|
||||
PTICassList = SRP_Array('SortSimpleList', PTICassList, 'AscendingNumbers', ',')
|
||||
LoadedCassList = SRP_Array('SortSimpleList', LoadedCassList, 'AscendingNumbers', ',')
|
||||
|
||||
CassNeeded = ''
|
||||
EpiPartNo = Xlate('WO_LOG', S.WONo, 'EPI_PART_NO', 'X')
|
||||
If EpiPartNo NE '' then
|
||||
WPDAdjusted = Epi_Part_Services('GetAdjustedWafersPerDayScheduler', EpiPartNo, S.React_Type)
|
||||
If WPDAdjusted NE '' then
|
||||
CPDAdjusted = SRP_Math('CEILING', (WPDAdjusted/25) )
|
||||
CassInCR = DCount(KitCassList, ',') + DCount(PTICassList, ',') + DCount(LoadedCassList, ',')
|
||||
CassNeeded = CassInCR - CPDAdjusted
|
||||
Locate S.ReactNo in ReactList using @FM setting rPos then
|
||||
ThisReactorRemainingDemand = RemainingReactorDemandList<rPos>
|
||||
PTICassCount = DCount(PTICassList, ',')
|
||||
ThisReactorRemainingDemand -= PTICassCount
|
||||
If ThisReactorRemainingDemand LT 0 then ThisReactorRemainingDemand = 0
|
||||
RemainingReactorDemandList<rPos> = ThisReactorRemainingDemand
|
||||
If ThisReactorRemainingDemand GT 0 then
|
||||
KitDemand = Field(KitCassList, ',', 1, ThisReactorRemainingDemand)
|
||||
ThisReactorRemainingDemand -= DCount(KitDemand, ',')
|
||||
RemainingReactorDemandList<rPos> = ThisReactorRemainingDemand
|
||||
end else
|
||||
KitDemand = ''
|
||||
end
|
||||
end else
|
||||
KitDemand = ''
|
||||
end
|
||||
|
||||
RowIndex += 1
|
||||
Swap '.1' with '' in S.ProdOrdNo
|
||||
|
||||
AllReportData<RowIndex, 1> = S.ReactNo
|
||||
AllReportData<RowIndex, 2> = S.React_Type
|
||||
AllReportData<RowIndex, 3> = S.WONo
|
||||
AllReportData<RowIndex, 4> = S.ProdOrdNo
|
||||
AllReportData<RowIndex, 5> = S.SubPartNo
|
||||
AllReportData<RowIndex, 6> = S.EpiPartNo
|
||||
AllReportData<RowIndex, 7> = S.WO_Qty
|
||||
AllReportData<RowIndex, 8> = S.WO_RX_Qty
|
||||
AllReportData<RowIndex, 9> = S.WO_UnRel_Qty
|
||||
AllReportData<RowIndex, 10> = S.KitLocation
|
||||
AllReportData<RowIndex, 11> = S.KitQty
|
||||
AllReportData<RowIndex, 12> = CassNeeded
|
||||
AllReportData<RowIndex, 13> = KitCassList ; // Skip field 14, it is populated by users
|
||||
AllReportData<RowIndex, 15> = PTICassList
|
||||
AllReportData<RowIndex, 16> = LoadedCassList ; // Skip field 17, it is populated by users
|
||||
AllReportData<RowIndex, 18> = S.StartDtm
|
||||
AllReportData<RowIndex, MATERIAL_REPORT.REACT_NO$> = S.ReactNo
|
||||
AllReportData<RowIndex, MATERIAL_REPORT.REACT_TYPE$> = S.React_Type
|
||||
AllReportData<RowIndex, MATERIAL_REPORT.WO_NO$> = S.WONo
|
||||
AllReportData<RowIndex, MATERIAL_REPORT.PROD_ORD_NO$> = S.ProdOrdNo
|
||||
AllReportData<RowIndex, MATERIAL_REPORT.SUB_PART_NO$> = S.SubPartNo
|
||||
AllReportData<RowIndex, MATERIAL_REPORT.EPI_PART_NO$> = S.EpiPartNo
|
||||
AllReportData<RowIndex, MATERIAL_REPORT.WO_QTY$> = S.WO_Qty
|
||||
AllReportData<RowIndex, MATERIAL_REPORT.WO_RX_QTY$> = S.WO_RX_Qty
|
||||
AllReportData<RowIndex, MATERIAL_REPORT.WO_UNREL_QTY$> = S.WO_UnRel_Qty
|
||||
AllReportData<RowIndex, MATERIAL_REPORT.KIT_LOCATION$> = S.KitLocation
|
||||
AllReportData<RowIndex, MATERIAL_REPORT.KIT_QTY$> = S.KitQty
|
||||
AllReportData<RowIndex, MATERIAL_REPORT.KIT_RO$> = KitCassList
|
||||
AllReportData<RowIndex, MATERIAL_REPORT.KIT_DEMAND$> = KitDemand
|
||||
AllReportData<RowIndex, MATERIAL_REPORT.PTI_RO$> = PTICassList
|
||||
AllReportData<RowIndex, MATERIAL_REPORT.LOAD_RO$> = LoadedCassList
|
||||
AllReportData<RowIndex, MATERIAL_REPORT.START_DTM$> = S.StartDtm
|
||||
|
||||
end
|
||||
end else
|
||||
@ -1762,7 +1794,6 @@ Service GenerateMaterialTrackRows()
|
||||
Rec = Database_Services('ReadDataRow', 'MATERIAL_REPORT', Key)
|
||||
If Error_Services('NoError') then
|
||||
// Preserve user input fields
|
||||
Row<MATERIAL_REPORT.KIT_DEMAND$> = Rec<MATERIAL_REPORT.KIT_DEMAND$>
|
||||
Row<MATERIAL_REPORT.COMMENTS$> = Rec<MATERIAL_REPORT.COMMENTS$>
|
||||
Database_Services('WriteDataRow', 'MATERIAL_REPORT', Key, Row)
|
||||
end
|
||||
@ -1814,13 +1845,11 @@ Service UpdateMaterialTrackData(MaterialTrackJSON)
|
||||
For ArrayIndex = 1 to ArrayCount
|
||||
objRow = SRP_JSON(objArray, 'Get', '[':ArrayIndex:']')
|
||||
KeyId = SRP_JSON(objRow, 'GetValue', 'KeyId')
|
||||
KitDemand = SRP_JSON(objRow, 'GetValue', 'KitDemand', '')
|
||||
Comments = SRP_JSON(objRow, 'GetValue', 'Comments', '')
|
||||
HaveLock = Database_Services('GetKeyIDLock', 'MATERIAL_REPORT', KeyId, True$)
|
||||
If HaveLock then
|
||||
MatRepRec = Database_Services('ReadDataRow', 'MATERIAL_REPORT', KeyId)
|
||||
If Error_Services('NoError') then
|
||||
MatRepRec<MATERIAL_REPORT.KIT_DEMAND$> = KitDemand
|
||||
MatRepRec<MATERIAL_REPORT.COMMENTS$> = Comments
|
||||
Database_Services('WriteDataRow', 'MATERIAL_REPORT', KeyId, MatRepRec, True$, False$, False$)
|
||||
end
|
||||
@ -1839,508 +1868,6 @@ Service UpdateMaterialTrackData(MaterialTrackJSON)
|
||||
end service
|
||||
|
||||
|
||||
Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldReport=BOOLEAN)
|
||||
|
||||
If OldReport EQ '' then OldReport = False$
|
||||
Abort = False$
|
||||
// All Possible Report Columns
|
||||
AllRptColumns = ''
|
||||
AllRptColumns<1, 1> = 'React No'
|
||||
AllRptColumns<1, 2> = 'React Type'
|
||||
AllRptColumns<1, 3> = 'WO No'
|
||||
AllRptColumns<1, 4> = 'SAP Prod No'
|
||||
AllRptColumns<1, 5> = 'Sub Part No'
|
||||
AllRptColumns<1, 6> = 'Epi Part No'
|
||||
AllRptColumns<1, 7> = 'WO Qty'
|
||||
AllRptColumns<1, 8> = 'RX Qty'
|
||||
AllRptColumns<1, 9> = 'UnRel Qty'
|
||||
AllRptColumns<1, 10> = 'Kit Location'
|
||||
AllRptColumns<1, 11> = 'Kit Qty'
|
||||
AllRptColumns<1, 12> = '+/-'
|
||||
AllRptColumns<1, 13> = 'Kit RO'
|
||||
AllRptColumns<1, 14> = 'PTI RO'
|
||||
AllRptColumns<1, 15> = 'Load'
|
||||
AllRptColumns<1, 16> = 'Comments'
|
||||
|
||||
If Index(RptColumns, 'Comments', 1) then
|
||||
AllColFmt = ''
|
||||
AllColFmt<1, 1> = '+^720'
|
||||
AllColFmt<1, 2> = '+<720'
|
||||
AllColFmt<1, 3> = '+^1000'
|
||||
AllColFmt<1, 4> = '+^1100'
|
||||
AllColFmt<1, 5> = '+^1300'
|
||||
AllColFmt<1, 6> = '+^1200'
|
||||
AllColFmt<1, 7> = '+>720'
|
||||
AllColFmt<1, 8> = '+>720'
|
||||
AllColFmt<1, 9> = '+>720'
|
||||
AllColFmt<1, 10> = '+^1260'
|
||||
AllColFmt<1, 11> = '+^720'
|
||||
AllColFmt<1, 12> = '+^500'
|
||||
AllColFmt<1, 13> = '+^1300'
|
||||
AllColFmt<1, 14> = '+^1300'
|
||||
AllColFmt<1, 15> = '+^700'
|
||||
AllColFmt<1, 16> = '+^1300'
|
||||
end else
|
||||
AllColFmt = ''
|
||||
AllColFmt<1, 1> = '+^720'
|
||||
AllColFmt<1, 2> = '+<720'
|
||||
AllColFmt<1, 3> = '+^1000'
|
||||
AllColFmt<1, 4> = '+^1100'
|
||||
AllColFmt<1, 5> = '+^1300'
|
||||
AllColFmt<1, 6> = '+^1200'
|
||||
AllColFmt<1, 7> = '+>720'
|
||||
AllColFmt<1, 8> = '+>720'
|
||||
AllColFmt<1, 9> = '+>720'
|
||||
AllColFmt<1, 10> = '+^1260'
|
||||
AllColFmt<1, 11> = '+^720'
|
||||
AllColFmt<1, 12> = '+^500'
|
||||
AllColFmt<1, 13> = '+^1800'
|
||||
AllColFmt<1, 14> = '+^1800'
|
||||
AllColFmt<1, 15> = '+^1100'
|
||||
AllColFmt<1, 16> = ''
|
||||
end
|
||||
|
||||
ErrorTitle = 'Error in service ':Service
|
||||
ErrCode = ''
|
||||
ErrorMsg = ''
|
||||
|
||||
SchedDetTable = ''
|
||||
SchedDetDict = ''
|
||||
|
||||
OPEN 'SCHED_DET_NG' TO SchedDetTable then
|
||||
OPEN 'DICT.SCHED_DET_NG' TO SchedDetDict then
|
||||
Today = Datetime()
|
||||
|
||||
ReactList = ''
|
||||
WOList = ''
|
||||
SchedDetKeys = ''
|
||||
PrevReactNo = ''
|
||||
PrevWO = ''
|
||||
|
||||
If OldReport then
|
||||
SelectSent = 'SELECT SCHED_DET_NG WITH STOP_DTM GE ':Today:' BY REACT_NO BY START_DTM'
|
||||
end else
|
||||
SelectSent = 'SELECT SCHED_DET_NG WITH STOP_DTM GE "':OCONV(Today, 'DT'):'" BY REACT_NO BY START_DTM'
|
||||
end
|
||||
|
||||
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
RETURN
|
||||
END
|
||||
|
||||
Done = 0
|
||||
CurrSchedDetKey = ''
|
||||
LOOP
|
||||
PrevSchedDetKey = CurrSchedDetKey
|
||||
READNEXT CurrSchedDetKey ELSE Done = 1
|
||||
UNTIL Done
|
||||
READ SchedDetRec FROM SchedDetTable,CurrSchedDetKey THEN
|
||||
ReactNo = SchedDetRec<SCHED_DET_NG.REACT_NO$>
|
||||
WONo = SchedDetRec<SCHED_DET_NG.WO_NO$>
|
||||
If ReactNo NE '' then
|
||||
LOCATE ReactNo IN ReactList BY 'AR' USING @FM SETTING Pos ELSE
|
||||
ReactList = INSERT(ReactList,Pos,0,0,ReactNo)
|
||||
END
|
||||
END
|
||||
If WONo NE '' then
|
||||
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
|
||||
WOList = INSERT(WOList,Pos,-1,0,WONo)
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,CurrSchedDetKey)
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
REPEAT
|
||||
|
||||
CALL Make.List(0,SchedDetKeys,SchedDetTable,SchedDetDict)
|
||||
|
||||
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'"
|
||||
MinDemand = 0
|
||||
Set_Status(0)
|
||||
|
||||
* Start of printing process
|
||||
FileName = 'Print Material Demand'
|
||||
Title = 'Printing Material Demand'
|
||||
|
||||
TopMargin = 1.0
|
||||
BottomMargin = 0.75
|
||||
LeftMargin = 0.25
|
||||
RightMargin = 0.25
|
||||
|
||||
Margins = LeftMargin:@FM:TopMargin:@FM:RightMargin:@FM:BottomMargin
|
||||
|
||||
PageSetup = '1' ;* LandScape
|
||||
PrintSetup = '2' ;* Preview Normal
|
||||
PrintSetup<1,2> = '0' ;* All buttons
|
||||
PrintSetup<1,5> = '1' ;* Page Range
|
||||
PrintSetup<1,6> = 7 ;* full mouse and keyboard support
|
||||
|
||||
PrintPath = ''
|
||||
stat = Set_Printer('INIT',FileName,Title,Margins,PageSetup,PrintSetup,PrintPath)
|
||||
|
||||
If Stat GE 0 THEN
|
||||
DateRange = 'Effective ':OCONV(Date(),'D4')
|
||||
|
||||
Header<-1> = "'T'"
|
||||
Header<-1> = '' ;* Blank line following heading
|
||||
|
||||
font = 'Arial'
|
||||
font<2> = '10'
|
||||
font<4> = '0' ;* Bold
|
||||
|
||||
stat = Set_Printer('FONTHEADFOOT',font)
|
||||
If Stat GE 0 then
|
||||
stat = Set_Printer('HEADER',Header)
|
||||
If Stat GE 0 then
|
||||
Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'"
|
||||
stat = Set_Printer('FOOTER',Footer)
|
||||
If Stat GE 0 then
|
||||
RecCount = 0
|
||||
FirstPass = 1
|
||||
LastRecord = 0
|
||||
FirstLine = 1
|
||||
fontSpacing = 100
|
||||
|
||||
* Make Column Heading
|
||||
ColHead = ''
|
||||
ColFmt = ''
|
||||
|
||||
For each Column in RptColumns using @VM setting rcPos
|
||||
Locate Column in AllRptColumns using @VM setting dataPos then
|
||||
ColHead<0, -1> = Column
|
||||
ColFmt<0, -1> = AllColFmt<0, dataPos>
|
||||
end
|
||||
Next Column
|
||||
|
||||
* Zero Accumulators For Each Break
|
||||
|
||||
Prev.ReactNo = ''
|
||||
Last.ReactNo.Break = 1
|
||||
|
||||
CurrSchedDetRec = ''
|
||||
|
||||
Loop
|
||||
|
||||
* Zero Break Flags To False
|
||||
|
||||
ReactNo.Break = 0
|
||||
|
||||
READNEXT CurrSchedDetKey, Which.Value ELSE
|
||||
LastRecord = 1
|
||||
ReactNo.Break = 1
|
||||
ReactNo = Prev.ReactNo
|
||||
END
|
||||
|
||||
S.ATID = CurrSchedDetKey
|
||||
Abort = (FirstPass AND LastRecord)
|
||||
IF Not(Abort) THEN
|
||||
|
||||
IF Not(LastRecord) then
|
||||
READO CurrSchedDetRec FROM SchedDetTable,CurrSchedDetKey then
|
||||
|
||||
RecCount += 1
|
||||
|
||||
* Calculate Value(s) For Column(s)
|
||||
S.ATID = CurrSchedDetKey
|
||||
I.ATID = S.ATID
|
||||
S.ReactNo = CurrSchedDetRec<SCHED_DET_NG.REACT_NO$>
|
||||
I.ReactNo = S.ReactNo
|
||||
S.WoNo = CurrSchedDetRec<SCHED_DET_NG.WO_NO$>
|
||||
I.WoNo = S.WoNo
|
||||
S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X')
|
||||
I.SubPartNo = S.SubPartNo
|
||||
S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X')
|
||||
I.EpiPartNo = S.EpiPartNo
|
||||
S.WO_Qty = Xlate('WO_LOG', S.WoNo, WO_LOG_WO_QTY$, 'X')
|
||||
I.WO_Qty = S.WO_Qty
|
||||
S.WO_RX_Qty = Xlate('WO_LOG', S.WoNo, 'RX_QTY', 'X')
|
||||
I.WO_RX_Qty = S.WO_RX_Qty
|
||||
S.WO_UnRel_QTY = Xlate('WO_LOG', S.WoNo, 'UNREL_QTY', 'X')
|
||||
I.WO_UnRel_QTY = S.WO_UnRel_QTY
|
||||
S.REACT_TYPE = Xlate('WO_LOG', S.WoNo, 'REACT_TYPE', 'X')
|
||||
S.ProdOrdNo = Xlate('WO_LOG', S.WoNo, 'PROD_ORD_NO', 'X')
|
||||
|
||||
If OldReport then
|
||||
|
||||
Locate 'SR*KTR]' in LocationFilter using @VM setting vPos then
|
||||
KitData = Location_Services('GetLocationCassInfo', S.WONo, 'SR*KTR]')
|
||||
SWAP CRLF$ WITH @VM IN KitData
|
||||
end else
|
||||
KitData = ''
|
||||
end
|
||||
|
||||
S.KitLocation = KitData<1>
|
||||
I.KitLocation = S.KitLocation
|
||||
|
||||
S.KitQty = OCONV(SUM(KitData<2>) * 25,'MD0,Z')
|
||||
I.KitQty = S.KitQty
|
||||
|
||||
S.KitCassCnt = COUNT(KitData<3>,',') + (KitData<3> NE '')
|
||||
I.KitCassCnt = S.KitCassCnt
|
||||
|
||||
KitCassList = KitData<3>
|
||||
|
||||
Locate '1K*PTI' in LocationFilter using @VM setting vPos then
|
||||
PTIData = Location_Services('GetLocationCassInfo', S.WONo, '1K*PTI')
|
||||
SWAP CRLF$ WITH @VM IN PTIData
|
||||
end else
|
||||
PTIData = ''
|
||||
end
|
||||
|
||||
end else
|
||||
|
||||
Locate 'SR*KTR]' in LocationFilter using @VM setting vPos then
|
||||
KitData = Database_Services('ReadDataRow', 'WO_LOC', S.WONo:'*':'SR*KTR]')
|
||||
end else
|
||||
KitData = ''
|
||||
end
|
||||
|
||||
Swap @VM with ',' in KitData
|
||||
|
||||
S.KitLocation = KitData<1>
|
||||
I.KitLocation = S.KitLocation
|
||||
|
||||
S.KitCassCnt = COUNT(KitData<3>,',') + (KitData<3> NE '')
|
||||
I.KitCassCnt = S.KitCassCnt
|
||||
|
||||
KitCassList = KitData<3>
|
||||
S.KitQty = 0
|
||||
For each CassNo in KitCassList using ','
|
||||
S.KitQty += Xlate('WO_MAT', S.WONo:'*':CassNo, 'WAFER_QTY', 'X')
|
||||
Next CassNo
|
||||
I.KitQty = S.KitQty
|
||||
|
||||
Locate '1K*PTI' in LocationFilter using @VM setting vPos then
|
||||
PTIData = Database_Services('ReadDataRow', 'WO_LOC', S.WONo:'*':'1K*PTI')
|
||||
end else
|
||||
PTIData = ''
|
||||
end
|
||||
PTICassList = PTIData<3>
|
||||
|
||||
Swap @VM with ',' in PTIData
|
||||
|
||||
end
|
||||
|
||||
PTICassList = PTIData<3>
|
||||
|
||||
CRLocs = ''
|
||||
CRLocs<0, -1> = 'CR*BE'
|
||||
CRLocs<0, -1> = 'CR*BO'
|
||||
CRLocs<0, -1> = 'CR*TUN'
|
||||
CRLocs<0, -1> = 'CR*EPR'
|
||||
CRLocs<0, -1> = 'CR*FE'
|
||||
CRLocs<0, -1> = 'CR*FEH'
|
||||
CRLocs<0, -1> = 'CR*FO'
|
||||
CRLocs<0, -1> = 'CR*FOH'
|
||||
|
||||
LoadedData = ''
|
||||
LocQueryList = ''
|
||||
For each Loc in CRLocs using @VM setting crPos
|
||||
Locate Loc in LocationFilter using @VM setting vPos then
|
||||
LocQueryList<0, -1> = Loc
|
||||
end
|
||||
Next Loc
|
||||
LoadedCassList = ''
|
||||
ReactType = Xlate('WO_LOG', S.WONo, 'REACT_TYPE', 'X')
|
||||
If ReactType NE 'EPP' then
|
||||
If LocQueryList NE '' then
|
||||
If OldReport then
|
||||
LoadedData = Location_Services('GetLocationCassInfo', S.WONo, LocQueryList)
|
||||
Swap CRLF$ with @VM in LoadedData
|
||||
CassList = LoadedData<3>
|
||||
Swap @VM with ',' in CassList
|
||||
For each CassNo in CassList using ','
|
||||
If ( (S.WONo NE '') and (CassNo NE '') ) then
|
||||
WOMatKey = S.WONo:'*':CassNo
|
||||
UnloadSigComp = Signature_Services('CheckSignature', WOMatKey, 'UNLOAD')
|
||||
OnHold = Xlate('WO_MAT', WOMatKey, 'HOLD', 'X')
|
||||
CurrStatus = Xlate('WO_MAT', WOMatKey, 'CURR_STATUS', 'X')
|
||||
If Not(UnloadSigComp or OnHold or (CurrStatus EQ 'REJ') ) then
|
||||
LoadedCassList<0, -1> = CassNo
|
||||
end
|
||||
end
|
||||
Next CassNo
|
||||
end else
|
||||
For each CRLoc in LocQueryList using @VM
|
||||
CRLocInfo = Database_Services('ReadDataRow', 'WO_LOC', S.WONo:'*':CRLoc)
|
||||
CRLocCassList = CRLocInfo<3>
|
||||
LoadedCassList = SRP_Array('Join', LoadedCassList, CRLocCassList, 'OR', @VM)
|
||||
Next CRLoc
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
If Not(OldReport) then LoadedCassList = SRP_Array('Clean', LoadedCassList, 'TrimAndMakeUnique', @VM)
|
||||
* TEST FOR CONTROL BREAK(S)
|
||||
|
||||
IF (S.ReactNo NE Prev.ReactNo) OR ReactNo.Break THEN
|
||||
ReactNo = Prev.ReactNo
|
||||
Prev.ReactNo = S.ReactNo
|
||||
ReactNo.Break += 1
|
||||
END
|
||||
|
||||
IF ReactNo.Break THEN stat = Set_Printer('TEXT')
|
||||
|
||||
IF FirstPass THEN FirstPass = False$
|
||||
|
||||
* Do Conversion If Any
|
||||
|
||||
IF S.REACTNO NE "" THEN S.REACTNO = OCONV(S.REACTNO,"MD0,")
|
||||
IF S.WONO NE "" THEN S.WONO = OCONV(S.WONO,"MD0")
|
||||
IF S.WO_QTY NE "" THEN S.WO_QTY = OCONV(S.WO_QTY,"MD0,")
|
||||
IF S.WO_RX_QTY NE "" THEN S.WO_RX_QTY = OCONV(S.WO_RX_QTY,"MD0,")
|
||||
IF S.WO_UNREL_QTY NE "" THEN S.WO_UNREL_QTY = OCONV(S.WO_UNREL_QTY,"MD0,")
|
||||
|
||||
* PRINT DETAIL LINE
|
||||
|
||||
COLDATA = ''
|
||||
RowNumber = 0
|
||||
|
||||
/* ascending sort */
|
||||
Convert @VM to ',' in KitCassList
|
||||
Convert @VM to ',' in PTICassList
|
||||
Convert @VM to ',' in LoadedCassList
|
||||
KitCassList = SRP_Array('SortSimpleList', KitCassList, 'AscendingNumbers', ',')
|
||||
PTICassList = SRP_Array('SortSimpleList', PTICassList, 'AscendingNumbers', ',')
|
||||
LoadedCassList = SRP_Array('SortSimpleList', LoadedCassList, 'AscendingNumbers', ',')
|
||||
|
||||
Convert ',' to @VM in KitCassList
|
||||
Convert ',' to @VM in PTICassList
|
||||
Convert ',' to @VM in LoadedCassList
|
||||
|
||||
NumKitCass = DCount(KitCassList, @VM)
|
||||
If NumKitCass GT 4 then
|
||||
For CassIndex = 4 to NumKitCass Step 4
|
||||
CassNo = KitCassList<0, CassIndex>
|
||||
CassNo := CRLF$
|
||||
KitCassList<0, CassIndex> = CassNo
|
||||
Next CassIndex
|
||||
end
|
||||
NumPTICass = DCount(PTICassList, @VM)
|
||||
If NumPTICass GT 4 then
|
||||
For CassIndex = 4 to NumPTICass Step 4
|
||||
CassNo = PTICassList<0, CassIndex>
|
||||
CassNo := CRLF$
|
||||
PTICassList<0, CassIndex> = CassNo
|
||||
Next CassIndex
|
||||
end
|
||||
NumLoadedCass = DCount(LoadedCassList, @VM)
|
||||
If NumLoadedCass GT 2 then
|
||||
For CassIndex = 2 to NumLoadedCass Step 2
|
||||
CassNo = LoadedCassList<0, CassIndex>
|
||||
CassNo := CRLF$
|
||||
LoadedCassList<0, CassIndex> = CassNo
|
||||
Next CassIndex
|
||||
end
|
||||
Convert @VM to ',' in KitCassList
|
||||
Convert @VM to ',' in PTICassList
|
||||
Convert @VM to ',' in LoadedCassList
|
||||
|
||||
CassNeeded = ''
|
||||
EpiPartNo = Xlate('WO_LOG', S.WONo, 'EPI_PART_NO', 'X')
|
||||
If EpiPartNo NE '' then
|
||||
WPDAdjusted = Epi_Part_Services('GetAdjustedWafersPerDayScheduler', EpiPartNo, S.React_Type)
|
||||
If WPDAdjusted NE '' then
|
||||
CPDAdjusted = SRP_Math('CEILING', (WPDAdjusted/25) )
|
||||
CassInCR = DCount(KitCassList, ',') + DCount(PTICassList, ',') + DCount(LoadedCassList, ',')
|
||||
CassNeeded = CassInCR - CPDAdjusted
|
||||
end
|
||||
end
|
||||
|
||||
Swap '.1' with '' in S.ProdOrdNo
|
||||
AllReportData = ''
|
||||
AllReportData<1> = S.ReactNo
|
||||
AllReportData<2> = S.React_Type
|
||||
AllReportData<3> = S.WONo
|
||||
AllReportData<4> = S.ProdOrdNo
|
||||
AllReportData<5> = S.SubPartNo
|
||||
AllReportData<6> = S.EpiPartNo
|
||||
AllReportData<7> = S.WO_Qty
|
||||
AllReportData<8> = S.WO_RX_Qty
|
||||
AllReportData<9> = S.WO_UnRel_Qty
|
||||
AllReportData<10> = S.KitLocation
|
||||
AllReportData<11> = S.KitQty
|
||||
AllReportData<12> = CassNeeded
|
||||
AllReportData<13> = KitCassList
|
||||
AllReportData<14> = PTICassList
|
||||
AllReportData<15> = LoadedCassList
|
||||
AllReportData<16> = ''
|
||||
|
||||
If ( (KitCassList NE '') or (PTICassList NE '') or (LoadedCassList NE '') or (NoMatFlag EQ True$) ) then
|
||||
RowNumber += 1
|
||||
For each RptColumn in RptColumns using @VM setting rcPos
|
||||
Locate RptColumn in AllRptColumns using @VM setting dataPos then
|
||||
COLDATA<RowNumber,rcPos> = AllReportData<dataPos>
|
||||
end
|
||||
Next RptColumn
|
||||
If COLDATA NE '' then
|
||||
// Print the data
|
||||
PageHeight = Get_Printer('PAGESIZE')<2>
|
||||
PrintableHeight = PageHeight - TopMargin - BottomMargin
|
||||
PrinterHeight = Get_Printer('POS')<2>
|
||||
stat = Set_Printer('CALCTABLE',ColFmt:@FM:ColData)
|
||||
TableSize = Get_Printer('CALCTABLE')
|
||||
TableHeight = TableSize<2>
|
||||
fontSpacing = 120
|
||||
|
||||
IF ( TableHeight + PrinterHeight >= PrintableHeight ) OR FirstLine THEN
|
||||
IF NOT(FirstLine) THEN
|
||||
stat = Set_Printer('PAGEBREAK')
|
||||
END
|
||||
FirstLine = 0
|
||||
font<2> = 10
|
||||
font<4> = 1 ;* Bold
|
||||
stat = Set_Printer('FONT',font,'100')
|
||||
stat = Set_Printer('ADDTABLE',colFmt,colHead,'',LTGREY$,'',0,TB_ALL)
|
||||
font<4> = 0
|
||||
stat = Set_Printer('FONT',font,fontSpacing)
|
||||
stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',0,7)
|
||||
END ELSE
|
||||
font<2> = 10
|
||||
font<4> = 0
|
||||
stat = Set_Printer('FONT',font,fontSpacing)
|
||||
stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',1,TB_ALL)
|
||||
END
|
||||
end
|
||||
END
|
||||
end
|
||||
end else
|
||||
// Last record -> Finish printing
|
||||
colData = ''
|
||||
stat = Set_Printer('TERM',1)
|
||||
end
|
||||
END else
|
||||
// No records selected -> Bail
|
||||
stat = Set_Printer('TERM',1)
|
||||
end
|
||||
Until (LastRecord or Abort)
|
||||
Repeat
|
||||
end else
|
||||
GoSub OipiPrintError
|
||||
end
|
||||
end else
|
||||
GoSub OipiPrintError
|
||||
end
|
||||
end else
|
||||
GoSub OipiPrintError
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Stat = ' : Stat : ', PrintPath = ' : PrintPath
|
||||
GoSub OipiPrintError
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Unable to open "SCHED_DET_NG" table.'
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Unable to open "SCHED_DET_NG" table.'
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetOpenNCRReportJson()
|
||||
|
||||
ErrorMessage = ''
|
||||
|
@ -18,12 +18,12 @@ compile insert MATERIAL_REPORT_EQUATES
|
||||
equ MATERIAL_REPORT.WO_UNREL_QTY$ to 9
|
||||
equ MATERIAL_REPORT.KIT_LOCATION$ to 10
|
||||
equ MATERIAL_REPORT.KIT_QTY$ to 11
|
||||
equ MATERIAL_REPORT.CASS_DELTA$ to 12
|
||||
equ MATERIAL_REPORT.CASS_DELTA$ to 12 ; // No longer used
|
||||
equ MATERIAL_REPORT.KIT_RO$ to 13
|
||||
equ MATERIAL_REPORT.KIT_DEMAND$ to 14
|
||||
equ MATERIAL_REPORT.PTI_RO$ to 15
|
||||
equ MATERIAL_REPORT.LOAD_RO$ to 16
|
||||
equ MATERIAL_REPORT.COMMENTS$ to 17
|
||||
equ MATERIAL_REPORT.COMMENTS$ to 17 ; // Populated by users via the front end web app
|
||||
equ MATERIAL_REPORT.START_DTM$ to 18
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user