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:
Stieber Daniel (CSC FI SPS MESLEO)
2025-10-15 17:19:33 +00:00
parent 6e829bd06a
commit 712cec903a
9 changed files with 1744 additions and 7731 deletions

View File

@ -73,7 +73,7 @@ $Insert MATERIAL_REPORT_EQUATES
// Reduce modes (for Select statement)
Equ NEW_EXIST$ To 0
Equ NEXT_CUR$ To 1
Equ ADD_EXIST$ To 2
Equ ADD_EXIST$ To 2
Declare subroutine Utility, ErrMsg, Set_Status, Set_Printer, RList, SRP_Stopwatch, Btree.Extract, Error_Services, V119
Declare subroutine Push.Select, Pop.Select, Database_Services, SRP_JSON, Logging_Services, Reduce, FSMsg
@ -632,23 +632,25 @@ Service GetMaterialTrackJSON()
SRP_JSON(objRow, 'SetValue', 'SapProdNo', Row<MATERIAL_REPORT.PROD_ORD_NO$>)
SRP_JSON(objRow, 'SetValue', 'SubPartNo', Row<MATERIAL_REPORT.SUB_PART_NO$>)
SRP_JSON(objRow, 'SetValue', 'EpiPartNo', Row<MATERIAL_REPORT.EPI_PART_NO$>)
WOQty = Row<MATERIAL_REPORT.WO_QTY$>
WOQty = Row<MATERIAL_REPORT.WO_QTY$>
Swap ',' with '' in WOQty
SRP_JSON(objRow, 'SetValue', 'WoQty', WOQty)
RxQty = Row<MATERIAL_REPORT.WO_RX_QTY$>
RxQty = Row<MATERIAL_REPORT.WO_RX_QTY$>
Swap ',' with '' in RxQty
SRP_JSON(objRow, 'SetValue', 'RxQty', RxQty)
UnRelQty = Row<MATERIAL_REPORT.WO_UNREL_QTY$>
UnRelQty = Row<MATERIAL_REPORT.WO_UNREL_QTY$>
Swap ',' with '' in UnRelQty
SRP_JSON(objRow, 'SetValue', 'UnRelQty', UnRelQty)
SRP_JSON(objRow, 'SetValue', 'KitLoc', Row<MATERIAL_REPORT.KIT_LOCATION$>)
KitQty = Row<MATERIAL_REPORT.KIT_QTY$>
KitQty = Row<MATERIAL_REPORT.KIT_QTY$>
Swap ',' with '' in KitQty
SRP_JSON(objRow, 'SetValue', 'KitQty', KitQty)
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 = ''
@ -1453,11 +1462,12 @@ Service GenerateMaterialTrackRows()
OPEN 'DICT.SCHED_DET_NG' TO SchedDetDict then
Today = Datetime()
ReactList = ''
WOList = ''
SchedDetKeys = ''
PrevReactNo = ''
PrevWO = ''
ReactList = ''
RemainingReactorDemandList = ''
WOList = ''
SchedDetKeys = ''
PrevReactNo = ''
PrevWO = ''
SelectSent = 'SELECT SCHED_DET_NG WITH STOP_DTM GE "':OCONV(Today, 'DT'):'" BY REACT_NO BY START_DTM'
@ -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
@ -1498,7 +1524,7 @@ Service GenerateMaterialTrackRows()
RowIndex = 0
AllReportData = ''
RecCount = 0
RecCount = 0
FirstPass = 1
LastRecord = 0
FirstLine = 1
@ -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
end
end
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 = ''