1465 lines
64 KiB
Plaintext
1465 lines
64 KiB
Plaintext
Function Work_Order_Services(@Service, @Params)
|
|
/***********************************************************************************************************************
|
|
|
|
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
|
permission from SRP Computer Solutions, Inc.
|
|
|
|
Name : Work_Order_Services
|
|
|
|
Description : Handler program for all module related services.
|
|
|
|
Notes : The generic parameters should contain all the necessary information to process the services. Often
|
|
this will be information like the data Record and Key ID.
|
|
|
|
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)
|
|
06/16/17 dmb Original programmer. - [EPIOI-8]
|
|
11/23/20 djs Added CreateOutbound service.
|
|
|
|
***********************************************************************************************************************/
|
|
|
|
#pragma precomp SRP_PreCompiler
|
|
|
|
$insert APP_INSERTS
|
|
$insert SERVICE_SETUP
|
|
$insert WO_LOG_EQUATES
|
|
$insert EPI_PART_EQUATES
|
|
$insert WO_MAT_EQUATES
|
|
$insert WO_STEP_EQUATES
|
|
$insert WO_SCHEDULE_EQUATES
|
|
$insert WO_SCHEDULE_NG_EQUATES
|
|
$insert RDS_EQUATES
|
|
$insert PROD_SPEC_EQUATES
|
|
$insert PRS_LAYER_EQU
|
|
$insert PROD_VER_EQUATES
|
|
$insert WO_MAT_WFR_EQUATES
|
|
$insert MSG_EQUATES
|
|
$insert POPUP_EQUATES
|
|
$insert LOGICAL
|
|
$insert RLIST_EQUATES
|
|
$insert COMPANY_EQUATES
|
|
$Insert NOTIFICATION_EQUATES
|
|
$Insert WM_IN_EQUATES
|
|
$Insert WM_OUT_EQUATES
|
|
|
|
Declare subroutine Error_Services, Work_Order_Services, Memory_Services, RList, Database_Services, SRP_JSON
|
|
Declare subroutine Btree.Extract, Set_Status, obj_WO_Log, obj_Notes, Print_Wo_Mat_In_Labels, Print_Wo_Mat_Out_Labels
|
|
Declare subroutine Print_Wmi_Labels, Print_Wmo_Labels, ErrMsg, Print_Cass_Labels, Logging_Services, Service_Services
|
|
Declare subroutine obj_WO_Mat_Log, WO_Mat_Services
|
|
Declare function SRP_Array, Work_Order_Services, Memory_Services, Database_Services, SRP_Sort_Array, SRP_JSON
|
|
Declare function Company_Services, obj_Prod_Spec, Schedule_Services, Datetime, obj_WO_Log, obj_WO_Step, Memberof
|
|
Declare function Environment_Services, Logging_Services, Hold_Services
|
|
|
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
|
LogDate = Oconv(Date(), 'D4/')
|
|
LogTime = Oconv(Time(), 'MTS')
|
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Release Log.csv'
|
|
Headers = 'Logging DTM' : @FM : 'User' : @FM : 'Notes'
|
|
objReleaseLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$)
|
|
|
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
|
LogDate = Oconv(Date(), 'D4/')
|
|
LogTime = Oconv(Time(), 'MTS')
|
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Void Log.csv'
|
|
Headers = 'Logging DTM' : @FM : 'User' : @FM : 'CassetteId' : @FM : 'Notes'
|
|
objVoidLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$)
|
|
|
|
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
|
|
|
GoToService else
|
|
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
|
|
end
|
|
|
|
Return Response else ''
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Service Parameter Options
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
Options BOOLEAN = True$, False$
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Services
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetUnscheduledWorkOrders
|
|
//
|
|
// Returns an array of unscheduled work order details based on the arguments provided.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetUnscheduledWorkOrders(ReactorType, SusceptorSize, ReactorNo)
|
|
|
|
WorkOrders = ''
|
|
// Select WO_LOG rows that do not have a closed date.
|
|
OpenWOLogKeyIDs = Database_Services('SearchIndex', 'WO_LOG', 'CLOSE_DATE', '=', True$)
|
|
// Check each WO_LOG Key ID against the WO_SCHEDULE table. If the row does not exist or if the row does not have any
|
|
// SCED_DET Key IDs, exists then it is not scheduled an should be included.
|
|
WOLogKeyIDs = Str(\00\, 100000)
|
|
If OpenWOLogKeyIDs NE '' then
|
|
hWOSchedule = Database_Services('GetTableHandle', 'WO_SCHEDULE')
|
|
If Error_Services('NoError') then
|
|
cPos = 1
|
|
For Each WOLogKeyID in OpenWOLogKeyIDs using @FM
|
|
Read WOScheduleRow from hWOSchedule, WOLogKeyID then
|
|
If WOScheduleRow<WO_SCHEDULE_SCHED_DET_KEY_IDS$> EQ '' then
|
|
WOLogKeyIDs[cPos, Len(WOLogKeyID) + 1] = WOLogKeyID : @FM
|
|
cPos += Len(WOLogKeyID) + 1
|
|
end
|
|
end else
|
|
WOLogKeyIDs[cPos, Len(WOLogKeyID) + 1] = WOLogKeyID : @FM
|
|
cPos += Len(WOLogKeyID) + 1
|
|
end
|
|
Next WOLogKeyID
|
|
end
|
|
end
|
|
Convert \00\ to '' in WOLogKeyIDs
|
|
WOLogKeyIDs[-1, 1] = ''
|
|
|
|
If Error_Services('NoError') then
|
|
For Each WOLogKeyID in WOLogKeyIDs using @FM setting fPos
|
|
WOLogRow = Database_Services('ReadDataRow', 'WO_LOG', WOLogKeyID)
|
|
EpiPartNo = WOLogRow<WO_LOG_EPI_PART_NO$>
|
|
ProdVerNo = WOLogRow<WO_LOG_PROD_VER_NO$>
|
|
ProdVerRow = Database_Services('ReadDataRow', 'PROD_VER', ProdVerNo)
|
|
PSN = ProdVerRow<PROD_VER_PROC_STEP_PSN$>
|
|
ProdSpecRow = Database_Services('ReadDataRow', 'PROD_SPEC', PSN)
|
|
BlockedReactors = ProdSpecRow<PROD_SPEC_BLOCKED_REACTS$>
|
|
PSNBlock = False$
|
|
If EpiPartNo NE '' then
|
|
AcceptWorkOrder = True$ ; // Assume this work order is acceptable for now.
|
|
ReactType = WOLogRow<WO_LOG_REACT_TYPE$>
|
|
// The following two lines of code are temporary but necessary to allows work orders
|
|
// for ASM to be scheduled on ASM+ and vice-versa.
|
|
If ReactType _EQC 'ASM+' then ReactType = 'ASM'
|
|
If ReactorType _EQC 'ASM+' then ReactorType = 'ASM'
|
|
If (ReactorType NE '') AND (ReactType NE ReactorType) then
|
|
// The reactor type for this work order does not match the required reactor type.
|
|
AcceptWorkOrder = False$
|
|
end
|
|
If AcceptWorkOrder AND SusceptorSize NE '' then
|
|
EpiPart = Database_Services('ReadDataRow', 'EPI_PART', EpiPartNo)
|
|
SuscSize = EpiPart<EPI_PART_SUB_WAFER_SIZE$>
|
|
If SuscSize NE SusceptorSize then
|
|
// The susceptor size for this work order does not match the required susceptor size.
|
|
AcceptWorkOrder = False$
|
|
end
|
|
end
|
|
If (BlockedReactors NE '') AND (ReactorNo NE '') then
|
|
// This work order uses a part spec that is blocked on the current reactor.
|
|
Locate ReactorNo in BlockedReactors using @VM setting vPos then PSNBlock = True$
|
|
end
|
|
If AcceptWorkOrder then
|
|
CustNo = WOLogRow<WO_LOG_CUST_NO$>
|
|
CompanyRow = Database_Services('ReadDataRow', 'COMPANY', CustNo)
|
|
CustName = CompanyRow<42>
|
|
Swap True$ with 'Yes' in PSNBlock
|
|
Swap False$ with '' in PSNBlock
|
|
WorkOrders := WOLogKeyID : @VM : EpiPartNo : @VM : CustName : @VM : ReactType : @VM : PSNBlock : @FM
|
|
end
|
|
end
|
|
Next WOLogKeyID
|
|
|
|
WorkOrders[-1, 1] = ''
|
|
WorkOrders = SRP_Array('SortRows', WorkOrders, 'AR1' : @FM : 'AR2', 'LIST', @FM, @VM)
|
|
end
|
|
|
|
Response = WorkOrders
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetWorkOrderLogDetail
|
|
//
|
|
// Returns the WO_LOG row for the indicated Key ID.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetWorkOrderLogDetail(WorkOrderLogID)
|
|
|
|
WorkOrderDetail = ''
|
|
|
|
TableName = 'WO_LOG'
|
|
If WorkOrderLogID NE '' then
|
|
WorkOrderDetail = Database_Services('ReadDataRow', Tablename, WorkOrderLogID)
|
|
end else
|
|
Error_Services('Add', 'WorkOrderLogID argument was missing from the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = WorkOrderDetail
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetWorkOrder
|
|
//
|
|
// Returns a JSON formatted object of information related to the indicated work order number. The ExtendedData argument
|
|
// determines if extended data related to wafers, product versions, and recipe should be included. The default is false.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetWorkOrder(WorkOrderNo, ExtendedData)
|
|
SRP_Stopwatch('Start', Service)
|
|
If ExtendedData NE True$ then ExtendedData = False$
|
|
|
|
ServiceKeyID := '*' : WorkOrderNo
|
|
WorkOrder = ''
|
|
|
|
If Memory_Services('IsValueCurrent', ServiceKeyID, 15, True$) then
|
|
WorkOrder = Memory_Services('GetValue', ServiceKeyID)
|
|
end else
|
|
If WorkOrderNo NE '' then
|
|
WorkOrderRow = Database_Services('ReadDataRow', 'WO_LOG', WorkOrderNo, True$, 15)
|
|
objWorkOrder = ''
|
|
If SRP_JSON(objWorkOrder, 'NEW', 'OBJECT') then
|
|
SRP_JSON(objWorkOrder, 'SETVALUE', 'WorkOrderNumber', WorkOrderNo, 'STRING')
|
|
SRP_JSON(objWorkOrder, 'SETVALUE', 'EpiPartNumber', WorkOrderRow<WO_LOG_EPI_PART_NO$>, 'STRING')
|
|
SRP_JSON(objWorkOrder, 'SETVALUE', 'ReactorType', WorkOrderRow<WO_LOG_REACT_TYPE$>, 'STRING')
|
|
ProdVerNo = WorkOrderRow<WO_LOG_PROD_VER_NO$>
|
|
SRP_JSON(objWorkOrder, 'SETVALUE', 'ProdVerNumber', ProdVerNo, 'STRING')
|
|
TotalWafers = WorkOrderRow<WO_LOG_WO_QTY$>
|
|
SRP_JSON(objWorkOrder, 'SETVALUE', 'TotalWafers', TotalWafers, 'STRING')
|
|
SRP_JSON(objWorkOrder, 'SETVALUE', 'Closed', Oconv(WorkOrderRow<WO_LOG_CLOSE_DATE$> NE '', 'BYes,No'), 'STRING')
|
|
SRP_JSON(objWorkOrder, 'SETVALUE', 'ClosedDate', Oconv(WorkOrderRow<WO_LOG_CLOSE_DATE$>, 'D4/'), 'STRING')
|
|
SRP_JSON(objWorkOrder, 'SETVALUE', 'HotLot', Oconv(WorkOrderRow<WO_LOG_HOT_FLAG$> NE '', 'BYes,No'), 'STRING')
|
|
CustomerNo = WorkOrderRow<WO_LOG_CUST_NO$>
|
|
Company = Company_Services('GetCompany', CustomerNo)
|
|
objCompany = ''
|
|
If SRP_JSON(objCompany, 'PARSE', Company) EQ '' then
|
|
SRP_JSON(objWorkOrder, 'SET', 'Company', objCompany)
|
|
SRP_JSON(objCompany, 'RELEASE')
|
|
end
|
|
If ExtendedData EQ True$ then
|
|
WafersRemaining = Work_Order_Services('GetRemainingWafers', WorkOrderNo)
|
|
SRP_JSON(objWorkOrder, 'SETVALUE', 'WafersRemaining', WafersRemaining, 'STRING')
|
|
If TotalWafers GT 0 then
|
|
PercentComplete = (TotalWafers - WafersRemaining) / TotalWafers * 100
|
|
end else
|
|
PercentComplete = 0
|
|
end
|
|
PercentComplete = Oconv(Iconv(PercentComplete, 'MD2'), 'MD2%S')
|
|
SRP_JSON(objWorkOrder, 'SETVALUE', 'PercentComplete', PercentComplete, 'STRING')
|
|
ProdVerRow = Database_Services('ReadDataRow', 'PROD_VER', ProdVerNo, True$, 15)
|
|
PSN = ProdVerRow<PROD_VER_PROC_STEP_PSN$>
|
|
SRP_JSON(objWorkOrder, 'SETVALUE', 'PSN', PSN, 'STRING')
|
|
LayerSpecs = obj_Prod_Spec('GetLayerProp', PSN : @RM : @RM : 1) ; // Returns specs for all layers in internal format.
|
|
LayerSpec = Field(LayerSpecs, @RM, 1) ; // Take the first Layer
|
|
LayerSet = Field(LayerSpec, @FM, 1) ; // Not used here but shown for clarity
|
|
LayerSpec = Field(LayerSpec, @FM, 2, 99) ; // LayerSpec without the LayerSet
|
|
Recipe = LayerSpec<PRS_LAYER_RECIPE$>
|
|
SRP_JSON(objWorkOrder, 'SETVALUE', 'Recipe', Recipe, 'STRING')
|
|
end
|
|
WorkOrder = SRP_JSON(objWorkOrder, 'STRINGIFY', 'FAST')
|
|
Memory_Services('SetValue', ServiceKeyID, WorkOrder)
|
|
SRP_JSON(objWorkOrder, 'RELEASE')
|
|
end else
|
|
Error_Services('Add', 'Error creating objWorkOrder in the ' : Service : ' service.')
|
|
end
|
|
end else
|
|
Error_Services('Add', 'WorkOrder argument was missing from the ' : Service : ' service.')
|
|
end
|
|
end
|
|
|
|
Response = WorkOrder
|
|
SRP_Stopwatch('Stop', Service)
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetRemainingWafers
|
|
//
|
|
// Returns the number of remaining wafers needed to be scheduled for the indicated work order.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetRemainingWafers(WorkOrderNo)
|
|
|
|
RemainingWafers = ''
|
|
|
|
If WorkOrderNo NE '' then
|
|
WOLogRow = Database_Services('ReadDataRow', 'WO_LOG', WorkOrderNo)
|
|
|
|
If Error_Services('NoError') then
|
|
// Get the total number of unreleased work orders.
|
|
TotalWafers = WOLogRow<WO_LOG_WO_QTY$>
|
|
TotalReleased = 0
|
|
WOMatKeys = WOLogRow<WO_LOG_WO_MAT_KEY$>
|
|
For Each WOMatKey in WOMatKeys using @VM
|
|
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
|
TotalReleased += WOMatRec<WO_MAT_WAFER_QTY$>
|
|
Next WOMatKey
|
|
TotalUnreleased = TotalWafers - TotalReleased
|
|
|
|
WOStepKeys = WOLogRow<WO_LOG_WO_STEP_KEY$>
|
|
TotalUnprocessed = 0
|
|
If WOStepKeys NE '' then
|
|
ReactorType = WOLogRow<WO_LOG_REACT_TYPE$>
|
|
For Each WOStepKey in WOStepKeys using @VM
|
|
WOStepRec = Database_Services('ReadDataRow', 'WO_STEP', WOStepKey)
|
|
If Error_Services('NoError') then
|
|
// Get the total released but unprocessed.
|
|
If ReactorType EQ 'EPP' then
|
|
// EpiPro work orders have their own way of calculating.
|
|
StatusCodes = Xlate('WM_IN', WOStepRec<WO_STEP_WM_IN_KEYS$>, 'CURR_STATUS', 'X')
|
|
RFWCnt = Count(StatusCodes, 'RFW')
|
|
TotalUnprocessed = RFWCnt * 25
|
|
end else
|
|
// All other reactor types use this method.
|
|
RDSKeys = WOStepRec<WO_STEP_RDS_KEY$>
|
|
If RDSKeys NE '' then
|
|
For Each RDSKey in RDSKeys using @VM
|
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
|
|
If RDSRec<RDS_DATE_IN$> EQ '' then
|
|
TotalUnprocessed += 25
|
|
end
|
|
Next RDSKey
|
|
end
|
|
end
|
|
end
|
|
Next WOStepKey
|
|
end
|
|
|
|
// Add the two.
|
|
RemainingWafers = TotalUnreleased + TotalUnprocessed
|
|
end
|
|
end else
|
|
Error_Services('Add', 'WorkOrderNo argument was missing from the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = RemainingWafers
|
|
|
|
end service
|
|
|
|
|
|
! This service should be deprecated as it returns inaccurate information for EpiPro.
|
|
! Use GetRemainingWafers service insead.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetUnprocessedWafers
|
|
//
|
|
// Returns the number of released wafers that have not yet been processed.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetUnprocessedWafers(WorkOrderNo)
|
|
|
|
RemainingWafers = ''
|
|
|
|
If WorkOrderNo NE '' then
|
|
WOLogRow = Database_Services('ReadDataRow', 'WO_LOG', WorkOrderNo)
|
|
|
|
If Error_Services('NoError') then
|
|
// Get the total number of unreleased work orders.
|
|
TotalWafers = WOLogRow<WO_LOG_WO_QTY$>
|
|
TotalReleased = 0
|
|
WOMatKeys = WOLogRow<WO_LOG_WO_MAT_KEY$>
|
|
For Each WOMatKey in WOMatKeys using @VM
|
|
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
|
TotalReleased += WOMatRec<WO_MAT_WAFER_QTY$>
|
|
Next WOMatKey
|
|
TotalUnreleased = TotalWafers - TotalReleased
|
|
|
|
WOStepKeys = WOLogRow<WO_LOG_WO_STEP_KEY$>
|
|
TotalUnprocessed = 0
|
|
If WOStepKeys NE '' then
|
|
ReactorType = WOLogRow<WO_LOG_REACT_TYPE$>
|
|
For Each WOStepKey in WOStepKeys using @VM
|
|
WOStepRec = Database_Services('ReadDataRow', 'WO_STEP', WOStepKey)
|
|
If Error_Services('NoError') then
|
|
// Get the total released but unprocessed.
|
|
RDSKeys = WOStepRec<WO_STEP_RDS_KEY$>
|
|
If RDSKeys NE '' then
|
|
For Each RDSKey in RDSKeys using @VM
|
|
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
|
|
WOMatKey = Xlate('RDS', RDSKey, 'WO_MAT_KEY', 'X')
|
|
CurrStatus = Xlate('WO_MAT', WOMatKey, 'CURR_STATUS', 'X')
|
|
If ( (RDSRec<RDS_DATE_OUT$> EQ '') and (CurrStatus NE 'REJ') and (CurrStatus NE 'MT') ) then
|
|
TotalUnprocessed += RDSRec<RDS_CASS_WAFER_QTY$>
|
|
end
|
|
Next RDSKey
|
|
end
|
|
end
|
|
Next WOStepKey
|
|
end
|
|
|
|
// Add the two.
|
|
RemainingWafers = TotalUnreleased + TotalUnprocessed
|
|
end
|
|
end else
|
|
Error_Services('Add', 'WorkOrderNo argument was missing from the ' : Service : ' service.')
|
|
end
|
|
|
|
Response = RemainingWafers
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetCurrCassNo
|
|
//
|
|
// Returns the next cassette number to be unloaded.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetCurrCassNo(WorkOrderNo)
|
|
|
|
If RowExists('WO_LOG', WorkOrderNo) then
|
|
CurrCassNo = ''
|
|
DateIn = ''
|
|
RDSKeys = Xlate('WO_STEP', WorkOrderNo:'*1', 'RDS_KEY', 'X')
|
|
NumKeys = DCount(RDSKeys, @VM)
|
|
For KeyIndex = NumKeys to 1 Step -1
|
|
RDSKey = RDSKeys<0, KeyIndex>
|
|
DateIn = Xlate('RDS', RDSKey, 'DATE_IN', 'X')
|
|
Until DateIn NE ''
|
|
Next KeyIndex
|
|
If DateIn NE '' then CurrCassNo = Xlate('RDS', RDSKey, 'CASS_NO', 'X')
|
|
Response = CurrCassNo
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetLastCassOut
|
|
//
|
|
// Returns the last cassette number unloaded.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetLastCassOut(WorkOrderNo)
|
|
|
|
If RowExists('WO_LOG', WorkOrderNo) then
|
|
LastCassOut = ''
|
|
DateOut = ''
|
|
RDSKeys = Xlate('WO_STEP', WorkOrderNo:'*1', 'RDS_KEY', 'X')
|
|
NumKeys = DCount(RDSKeys, @VM)
|
|
For KeyIndex = NumKeys to 1 Step -1
|
|
RDSKey = RDSKeys<0, KeyIndex>
|
|
DateOut = Xlate('RDS', RDSKey, 'DATE_OUT', 'X')
|
|
Until DateOut NE ''
|
|
Next KeyIndex
|
|
If DateOut NE '' then LastCassOut = Xlate('RDS', RDSKey, 'CASS_NO', 'X')
|
|
Response = LastCassOut
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// GetNextRunNo
|
|
//
|
|
// Returns the next run number in the work order.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service GetNextRunNo(WorkOrderNo, WorkOrderStep)
|
|
|
|
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
|
HaveLock = False$
|
|
TimeElapsed = 0
|
|
RequestTime = Time()
|
|
If WorkOrderNo NE '' then
|
|
Loop
|
|
Lock hSysLists, ServiceKeyID then
|
|
HaveLock = True$
|
|
If WorkOrderStep = '' then WorkOrderStep = 1
|
|
StepRDSNos = XLATE('WO_STEP', WorkOrderNo:'*':WorkOrderStep, 'RDS_KEY', 'X')
|
|
CurrRuns = 0
|
|
NumRDS = DCount(StepRDSNos, @VM)
|
|
For I = 1 to NumRDS
|
|
If RowExists('RDS', StepRDSNos<1,I>) then
|
|
CurrRuns += 1
|
|
end
|
|
next I
|
|
NextRunNo = CurrRuns + 1
|
|
Response = NextRunNo
|
|
Unlock hSysLists, ServiceKeyID else Null
|
|
end
|
|
TimeElapsed = Time() - RequestTime
|
|
Until HaveLock EQ True$ or TimeElapsed GT 60
|
|
Repeat
|
|
end
|
|
If TimeElapsed GT 60 then
|
|
Error_Services('Add', 'Error occurred within the ':Service:' service module')
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
// CreateOutbound
|
|
//
|
|
// Creates an empty outbound cassette for a GaN work order.
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
Service CreateOutbound(WONo)
|
|
|
|
If WONo NE '' then
|
|
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
|
CassNos = WORec<WO_LOG_WO_MAT_KEY$>
|
|
LastCassNo = DCount(CassNos, @VM)
|
|
NextCassNo = LastCassNo + 1
|
|
LastCassID = WONo : '*' : LastCassNo
|
|
NewCassID = WONo : '*' : NextCassNo
|
|
SchedCassQty = Xlate('WO_MAT', LastCassID, 'SCHED_QTY', 'X')
|
|
WOMatWfrRec = Database_Services('ReadDataRow', 'WO_MAT_WFR', NewCassID)
|
|
If WOMatWfrRec EQ '' then
|
|
for WfrCount = 1 to SchedCassQty
|
|
WOMatWfrRec<WO_MAT_WFR_OUT_PREV_WFR_ID$,WfrCount> = NewCassID : '*' : WfrCount
|
|
Next WfrCount
|
|
Database_Services('WriteDataRow', 'WO_MAT_WFR', NewCassID, WOMatWfrRec)
|
|
WOMatRecToCopy = Database_Services('ReadDataRow', 'WO_MAT', LastCassID)
|
|
WOMatRecToCopy<WO_MAT_RDS_FINAL_SIG_ORG$> = ''
|
|
WOMatRecToCopy<WO_MAT_CASS_FINAL_SIG_DTM$> = ''
|
|
Database_Services('WriteDataRow', 'WO_MAT', NewCassID, WOMatRecToCopy)
|
|
WORec = Insert(WORec, WO_LOG_WO_MAT_KEY$, -1, 0, NewCassID)
|
|
Database_Services('WriteDataRow', 'WO_LOG', WONo, WORec)
|
|
end else
|
|
ErrorMessage = 'Error in service ':Service:'. WO_MAT_WFR record ':NewCassID:' already exists!'
|
|
Error_Services('Add', ErrorMessage)
|
|
end
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
Service UpdateUnscheduledQuantities(WOList)
|
|
|
|
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
|
Lock hSysLists, ServiceKeyID then
|
|
SchedList = Database_Services('ReadDataRow', 'APP_INFO', 'SCHED_WO_LIST')
|
|
// Select WO_LOG rows that do not have a closed date.
|
|
OpenWOLogKeyIDs = ''
|
|
If WOList NE '' then OpenWOLogKeyIDs = WOList
|
|
If OpenWOLogKeyIDs EQ '' then
|
|
Open 'DICT.WO_LOG' to hWOLogDict then
|
|
Set_Status(0)
|
|
Flag = ''
|
|
Btree.Extract('CLOSE_DATE' : @VM : '' : @FM, 'WO_LOG', hWOLogDict, OpenWOLogKeyIDs, 'S', Flag)
|
|
If Flag NE 0 then
|
|
Status = Get_Status(errCode)
|
|
Error_Services('Add', 'Error in ':Service:' service. Error code ':errCode:'.')
|
|
end
|
|
end
|
|
end
|
|
If ( Error_Services('NoError') and (OpenWOLogKeyIDs NE '') ) then
|
|
SchedList = SRP_Array('Rotate', SchedList, @FM, @VM)
|
|
For Each WONo in OpenWOLogKeyIDs using @VM setting fPos
|
|
UnscheduledWfrQty = Schedule_Services('GetUnscheduledWfrQty', WONo)
|
|
WONos = SchedList<1>
|
|
If UnscheduledWfrQty GT 0 then
|
|
Locate WONo in WONos using @VM setting vPos else vPos = -1
|
|
WOLogRow = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
|
EpiPartNo = WOLogRow<WO_LOG_EPI_PART_NO$>
|
|
CustNo = WOLogRow<WO_LOG_CUST_NO$>
|
|
CompanyRow = Database_Services('ReadDataRow', 'COMPANY', CustNo)
|
|
CustName = CompanyRow<COMPANY_ABBREV$>
|
|
ReactorType = WOLogRow<WO_LOG_REACT_TYPE$>
|
|
SchedList<1, vPos> = WONo
|
|
SchedList<2, vPos> = EpiPartNo
|
|
SchedList<3, vPos> = CustName
|
|
SchedList<4, vPos> = ReactorType
|
|
WOSchedRec = Database_Services('ReadDataRow', 'WO_SCHEDULE_NG', WONo)
|
|
CurrVal = WOSchedRec<WO_SCHEDULE_NG.UNSCHED_QTY$>
|
|
If CurrVal NE UnscheduledWfrQty then
|
|
WOSchedRec<WO_SCHEDULE_NG.UNSCHED_QTY$> = UnscheduledWfrQty
|
|
Database_Services('WriteDataRow', 'WO_SCHEDULE_NG', WONo, WOSchedRec, True$, False$, True$)
|
|
end
|
|
end else
|
|
Locate WONo in WONos using @VM setting vPos then
|
|
SchedList = Delete(SchedList, 1, vPos, 0)
|
|
SchedList = Delete(SchedList, 2, vPos, 0)
|
|
SchedList = Delete(SchedList, 3, vPos, 0)
|
|
SchedList = Delete(SchedList, 4, vPos, 0)
|
|
Database_Services('DeleteDataRow', 'WO_SCHEDULE_NG', WONo)
|
|
end
|
|
end
|
|
Next WONo
|
|
end
|
|
SchedList = SRP_Array('Rotate', SchedList, @FM, @VM)
|
|
If WOList EQ '' then
|
|
// Clear out WO_SCHEDULE_NG table of work orders that no longer have any wafers left to schedule.
|
|
EOF = False$
|
|
Query = 'SELECT WO_SCHEDULE_NG WITH UNSCHED_QTY EQ 0'
|
|
RList(Query, TARGET_ACTIVELIST$, '', '', '')
|
|
Loop
|
|
Readnext WOLogKeyID else EOF = True$
|
|
Until EOF = True$
|
|
Database_Services('DeleteDataRow', 'WO_SCHEDULE_NG', WOLogKeyID)
|
|
Repeat
|
|
end
|
|
SchedList = SRP_Array('SortSimpleList', SchedList, 'DescendingNumbers', @FM)
|
|
Database_Services('WriteDataRow', 'APP_INFO', 'SCHED_WO_LIST', SchedList)
|
|
Unlock hSysLists, ServiceKeyID else Null
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
Service ReleaseCassettes(WONo)
|
|
|
|
NumRelCass = 0
|
|
ErrorMsg = ''
|
|
If WONo NE '' then
|
|
|
|
PSNo = Xlate('WO_LOG', WONo, 'PS_NO', 'X')
|
|
PSMode = Xlate('PROD_SPEC',PSNo,'SPEC_TYPE','X')
|
|
|
|
If PSMode = 'Q' OR PSMode = 'U' then
|
|
|
|
ReactType = Xlate('WO_LOG', WONo, 'REACT_TYPE', 'X')
|
|
|
|
If ReactType = 'EPP' OR ReactType = 'EpiPro' then
|
|
|
|
OutLoadQty = Xlate('WO_LOG', WONo, 'CUST_EPI_PART_WMO_LOAD_CNT', 'X')
|
|
If OutLoadQty = '' then
|
|
ErrorMsg = 'Outbound Load Cnt is required for ':OCONV(PSMode,'[PROD_SPEC_MODE_CONV]'):' Work Orders.'
|
|
end
|
|
|
|
end else
|
|
|
|
OutLoadQty = Xlate('WO_LOG', WONo, 'CUST_EPI_PART_SHIP_QTY', 'X')
|
|
If OutLoadQty = '' then
|
|
ErrorMsg = 'Cass Ship Qty is required for ':OCONV(PSMode,'[PROD_SPEC_MODE_CONV]'):' Work Orders.'
|
|
end
|
|
end
|
|
end
|
|
|
|
If ErrorMsg EQ '' then
|
|
|
|
CassList = Xlate('WO_LOG', WONo, 'WO_MAT_CASS_NO', 'X')
|
|
RelDTMs = Xlate('WO_LOG', WONo, 'WO_MAT_REL_DTM', 'X')
|
|
SAPCassIDs = Xlate('WO_LOG', WONo, 'WO_MAT_CASS_ID_SAP', 'X')
|
|
CassStatus = Xlate('WO_LOG', WONo, 'WO_MAT_CURR_STATUS', 'X')
|
|
|
|
Loop
|
|
LastLine = CassList[-1,'B':@VM]
|
|
Until LastLine<1,1> NE '' OR LastLine = ''
|
|
CassList[COL1(),COL2()] = ''
|
|
Repeat
|
|
|
|
CassCnt = DCount(CassList, @VM)
|
|
|
|
UnReleasedCassNos = ''
|
|
For I = 1 to CassCnt
|
|
If ( (RelDTMs<0, I> = '') and (CassStatus<0, I> EQ '') ) then
|
|
ErrorMsg = 'Error in obj_WO_Log("ReleaseCassettes"). Cass status is null for ':CassList<0, I>:'!'
|
|
LogData = ''
|
|
LogData<1> = LoggingDTM
|
|
LogData<2> = @USER4
|
|
LogData<3> = ErrorMsg
|
|
Machine = Environment_Services('GetServer')
|
|
If Machine NE 'MESSA01EC' then
|
|
EmailAddr = 'dstieber@srpcs.com,6613649828@txt.att.net'
|
|
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$, EmailAddr, ErrorMsg)
|
|
end else
|
|
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
|
|
end
|
|
end
|
|
If ErrorMsg EQ '' then
|
|
// Log work order, cassette number, status, and release DTM in the event that a release
|
|
// issue occurs again.
|
|
LogData = ''
|
|
LogData<1> = LoggingDTM
|
|
LogData<2> = @User4
|
|
LogData<3> = WONo
|
|
LogData<4> = CassList<0, I> ; // CassNo
|
|
LogData<5> = CassStatus<0, I> ; // Cass Status
|
|
LogData<6> = Quote(RelDTMs<0, I>) ; // Release DTM
|
|
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
|
|
If ( (RelDTMs<0, I> = '') and ( (CassStatus<0, I> = 'RX') or (CassStatus<0, I> = 'MT'))) then
|
|
UnReleasedCassNos<1,-1> = CassList<0, I>
|
|
end
|
|
end
|
|
Until ErrorMsg NE ''
|
|
Next I
|
|
|
|
If ErrorMsg EQ '' then
|
|
|
|
TempWONo = WONo
|
|
Set_Status(0)
|
|
|
|
obj_WO_Log('ReleaseCassettes',TempWONo:@RM:UnReleasedCassNos) ;* This variable gets changed down the line
|
|
errCode = ''
|
|
|
|
If Get_Status(errCode) then
|
|
|
|
ErrorMsg = 'Error in obj_WO_Log("ReleaseCassettes"). Error code ':errCode:'.'
|
|
Database_Services('ReleaseKeyIDLock', 'WO_LOG', WONo)
|
|
|
|
end else
|
|
|
|
NumRelCass = CassCnt
|
|
OrderNo = Get_Property(@WINDOW:'.ORD_NO','TEXT')
|
|
|
|
Recipients = XLATE('NOTIFICATION','WO_ENTRY',NOTIFICATION_USER_ID$,'X')
|
|
SentFrom = @USER4
|
|
Subject = 'Work Order Released ':WONo
|
|
Message = 'Work Order Released to Production.'
|
|
NewForm = Xlate('APP_INFO', 'NEW_WO_FORM', '', 'X')
|
|
If NewForm then
|
|
AttachWindow = 'NDW_WO_LOG'
|
|
end else
|
|
AttachWindow = 'WO_LOG2'
|
|
end
|
|
AttachKey = WONo
|
|
SendToGroup = ''
|
|
|
|
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
|
obj_Notes('Create',Parms)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateReleasedQty':@VM:WONo, False$)
|
|
|
|
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
|
Response = DCount(UnReleasedCassNos, @VM)
|
|
|
|
end service
|
|
|
|
|
|
Service PrintLabels(WONo)
|
|
|
|
If WONo NE '' then
|
|
|
|
WOSteps = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
|
|
|
|
If INDEX(WOSteps,@VM,1) then
|
|
Buttons = ''
|
|
FOR I = 1 TO COUNT(WOSteps,@VM) + (WOSteps NE '')
|
|
Buttons<I> = 'Step ':I
|
|
NEXT I
|
|
SWAP @FM WITH ',' IN Buttons
|
|
Buttons = 'B':Buttons
|
|
|
|
TypeOver = ''
|
|
TypeOver<MTEXT$> = 'Which Work Order step do you wish to print labels for?'
|
|
TypeOver<MTYPE$> = Buttons
|
|
TypeOver<MICON$> = '?'
|
|
TypeOver<MCAPTION$> = 'MultiStep WorkOrder Selection'
|
|
WOStep = Msg(@window, TypeOver)
|
|
MultiStepFlag = WOStep
|
|
end ELSE
|
|
WOStep = 1
|
|
MultiStepFlag = 0
|
|
end
|
|
|
|
If WOStep = 1 then
|
|
PSNo = XLATE('WO_STEP',WONo:'*1',WO_STEP_PROD_SPEC_ID$,'X')
|
|
ReactorType = XLATE('PROD_SPEC',PSNo,PROD_SPEC_REACTOR_TYPE$,'X')
|
|
|
|
If ReactorType = 'GAN' then
|
|
Print_WO_Mat_In_Labels(WONo,'')
|
|
Print_WO_Mat_Out_Labels(WONo,'')
|
|
end
|
|
|
|
If ReactorType = 'EPP' OR ReactorType = 'P' then
|
|
Print_WMI_Labels(WONo,1)
|
|
Print_WMO_Labels(WONo,1)
|
|
end
|
|
end
|
|
|
|
NonEpiPro = ( (ReactorType NE 'GAN') and (ReactorType NE 'EPP') and (ReactorType NE 'P') )
|
|
|
|
If NonEpiPro then
|
|
|
|
If WOStep > 1 then
|
|
|
|
Def = ""
|
|
Def<MTEXT$> = "Adjusting Step ":WOStep:" Scheduled Quantities..."
|
|
Def<MTYPE$> = "U"
|
|
|
|
MsgUp = Msg(@window, Def)
|
|
|
|
RDSNos = obj_WO_Step('AdjStepRDSQtys', WOStep:@RM:WOSteps)
|
|
|
|
If Get_Status(errCode) then
|
|
|
|
ErrMsg(errCode) ;* Display error from the update
|
|
Msg(@WINDOW,MsgUp) ;* Take down the processing message
|
|
|
|
RETURN
|
|
end
|
|
Msg(@WINDOW,MsgUp)
|
|
|
|
end ELSE
|
|
RDSNos = XLATE('WO_STEP',WOSteps<1,1>,WO_STEP_RDS_KEY$,'X')
|
|
end
|
|
|
|
If MemberOf(@USER4,'OI_ADMIN') then
|
|
WOMatKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_MAT_KEY$,'X')
|
|
CONVERT @VM TO @FM IN WOMatKeys
|
|
AllRDSNos = XLATE('WO_MAT',WOMatKeys,WO_MAT_RDS_NO$,'X')
|
|
|
|
RDSNos = ''
|
|
|
|
LOOP
|
|
CassRDSNos = AllRDSNos[1,@FM]
|
|
AllRDSNos[1,COL2()] = ''
|
|
UNTIL CassRdsNos = ''
|
|
RDSNos := CassRdsNos<1,WOStep>:@VM
|
|
REPEAT
|
|
|
|
RDSNos[-1,1] = ''
|
|
|
|
end
|
|
|
|
If INDEX(RDSNos,@VM,1) then
|
|
TypeOver = ''
|
|
TypeOver<PDISPLAY$> = RDSNos
|
|
TypeOver<PFIELD$> = 2
|
|
TypeOver<PTYPE$> = 'K'
|
|
|
|
RDSKeys = Popup(@WINDOW,TypeOver,'WO_LOG_RTS')
|
|
|
|
end ELSE
|
|
RDSKeys = RDSNos
|
|
end
|
|
|
|
If RDSKeys = '' then
|
|
ErrMsg('No RDS Numbers Selected or Work Order Not Yet Released to Production.')
|
|
end ELSE
|
|
CONVERT @VM TO @FM IN RDSKeys
|
|
|
|
Print_Cass_Labels(RDSKeys,MultiStepFlag) ;* Updated labels with Akrion Bar Codes
|
|
|
|
end
|
|
end
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
Service UpdateWOStepStatus(WONo)
|
|
|
|
If WONo NE '' then
|
|
WOStepKey = WONo:'*':1
|
|
WOStepRec = Database_Services('ReadDataRow', 'WO_STEP', WOStepKey)
|
|
WOStepCurrStatus = obj_WO_Step('CurrStatus', WOStepKey:@RM:WOStepRec)
|
|
// Get a fresh copy of the record
|
|
WOStepRec = Database_Services('ReadDataRow', 'WO_STEP', WOStepKey)
|
|
WOStepCurrStatusStatic = WOStepRec<WO_STEP_CURR_STATUS_STATIC$>
|
|
If WOStepCurrStatus NE WOStepCurrStatusStatic then
|
|
WOStepRec<WO_STEP_CURR_STATUS_STATIC$> = WOStepCurrStatus
|
|
Database_Services('WriteDataRow', 'WO_STEP', WOStepKey, WOStepRec, True$, False$, True$)
|
|
end
|
|
Database_Services('ReleaseKeyIDLock', 'WO_STEP', WOStepKey)
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
Service PostWOStepUpdateRequest(WONo)
|
|
|
|
If WONo NE '' then
|
|
StepNo = 1
|
|
WOStepKey = WONo:'*':StepNo
|
|
// Look for a pre-existing request in the queue
|
|
If (RowExists('WO_STEP', WOStepKey) EQ False$) then
|
|
// This is a new request
|
|
RequestKeyID = WOStepKey
|
|
RequestRow = ''
|
|
RequestRow<WO_STEP_CURR_STATUS_STATIC$> = Datetime()
|
|
Database_Services('WriteDataRow', 'WO_STEP_QUEUE', RequestKeyID, RequestRow, False$, False$, False$)
|
|
end else
|
|
// Duplicate request
|
|
Null
|
|
end
|
|
end else
|
|
Error_Services('Add', 'Null parameter passed into service call. All parameters are required.')
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
Service ProcessWOStepUpdateRequests()
|
|
|
|
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
|
Lock hSysLists, ServiceKeyID then
|
|
Open 'WO_STEP_QUEUE' to hTable then
|
|
Select hTable
|
|
EOF = False$
|
|
Loop
|
|
ReadNext RequestKeyID else EOF = True$
|
|
Until EOF EQ True$
|
|
WONo = Field(RequestKeyID, '*', 1)
|
|
Work_Order_Services('UpdateWOStepStatus', WONo)
|
|
If Error_Services('NoError') then
|
|
// Successfully updated the current status, so delete the request from the queue.
|
|
Database_Services('DeleteDataRow', 'WO_STEP_QUEUE', RequestKeyID, True$, True$)
|
|
end
|
|
Repeat
|
|
end else
|
|
ErrorMsg = 'Error opening WO_STEP_QUEUE in ':Service:' service.'
|
|
end
|
|
Unlock hSysLists, ServiceKeyID else Null
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
Service SetHotFlag(WONo, HotFlag=BOOLEAN)
|
|
|
|
If ( ( RowExists('WO_LOG', WONo) and ( (HotFlag EQ True$) or (HotFlag EQ False$) ) ) ) then
|
|
Open 'WO_LOG' to hTable then
|
|
WriteV HotFlag on hTable, WONo, WO_LOG_HOT_FLAG$ else
|
|
Error_Services('Add', 'Error in ':Service:' service. File error: ':@File_Error)
|
|
end
|
|
end
|
|
end else
|
|
Error_Services('Add', 'Error in ':Service:' service. Invalid parameters passed into service.')
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
Service GetHotFlag(WONo)
|
|
|
|
HotFlag = ''
|
|
If RowExists('WO_LOG', WONo) then
|
|
Open 'WO_LOG' to hTable then
|
|
ReadV HotFlag from hTable, WONo, WO_LOG_HOT_FLAG$ else
|
|
Error_Services('Add', 'Error in ':Service:' service. File error: ':@File_Error)
|
|
end
|
|
end
|
|
end else
|
|
Error_Services('Add', 'Error in ':Service:' service. Invalid parameters passed into service.')
|
|
end
|
|
Response = HotFlag
|
|
|
|
end service
|
|
|
|
|
|
Service UpdateReleasedQty(WONo)
|
|
|
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
|
LogDate = Oconv(Date(), 'D4/')
|
|
LogTime = Oconv(Time(), 'MTS')
|
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Update Released Qty Log.csv'
|
|
Headers = 'Logging DTM' : @FM : 'WONo' : @FM : 'Notes'
|
|
objUpRelLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$)
|
|
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
|
|
|
ErrorMsg = ''
|
|
If WONo NE '' then
|
|
If RowExists('WO_LOG', WONo) then
|
|
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
|
If Error_Services('NoError') then
|
|
RelQty = obj_WO_Log('RelQty', WONo:@RM:WORec)
|
|
WOQty = WORec<WO_LOG_QTY$>
|
|
If RelQty GT WOQty then
|
|
UnRelQty = 0
|
|
end else
|
|
UnRelQty = WOQty - RelQty
|
|
end
|
|
Open 'WO_LOG' to hTable then
|
|
WriteV RelQty on hTable, WONo, WO_LOG_REL_QTY_STATIC$ then
|
|
WriteV UnRelQty on hTable, WONo, WO_LOG_UNREL_QTY_STATIC$ else
|
|
ErrorMsg = 'Error in ':Service:' service. Failed to write unreleased quantity ':UnRelQty
|
|
ErrorMsg := ' to the UNREL_QTY_STATIC field of WO_LOG record ':WONo:'.'
|
|
ErrorMsg := '@FILE_ERROR: ':@FILE_ERROR
|
|
end
|
|
end else
|
|
ErrorMsg = 'Error in ':Service:' service. Failed to write released quantity ':RelQty
|
|
ErrorMsg := ' to the REL_QTY_STATIC field of WO_LOG record ':WONo:'.'
|
|
ErrorMsg := '@FILE_ERROR: ':@FILE_ERROR
|
|
end
|
|
end else
|
|
ErrorMsg = 'Error in ':Service:' service. Failed to open the WO_LOG table.'
|
|
end
|
|
end else
|
|
ErrorMsg = 'Error in ':Service:' service. Failed to read record ':WONo:' from the WO_LOG table. '
|
|
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
|
end
|
|
end else
|
|
ErrorMsg = 'Error in ':Service:' service. ':WONo:' does not exist in the WO_LOG table.'
|
|
end
|
|
end else
|
|
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service'
|
|
end
|
|
|
|
LogData = ''
|
|
LogData<1> = LoggingDtm
|
|
LogData<2> = WONo
|
|
If ErrorMsg EQ '' then
|
|
LogResult = 'Successfully updated WO_LOG record ':WONo:' field REL_QTY_STATIC with released quantity ':RelQty
|
|
LogResult := ' and field UNREL_QTY_STATIC with unreleased quantity ':UnRelQty:'.'
|
|
LogData<3> = LogResult
|
|
Logging_Services('AppendLog', objUpRelLog, LogData, @RM, @FM)
|
|
end else
|
|
LogResult = 'Failed to update WO_LOG record ':WONo:' field REL_QTY_STATIC with released quantity ':RelQty
|
|
LogResult := ' or field UNREL_QTY_STATIC with unreleased quantity ':UnRelQty:'. Error message: ':ErrorMsg
|
|
LogData<3> = LogResult
|
|
Logging_Services('AppendLog', objUpRelLog, LogData, @RM, @FM)
|
|
Error_Services('Add', ErrorMsg)
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
Service UpdateReceivedQty(WONo)
|
|
|
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
|
LogDate = Oconv(Date(), 'D4/')
|
|
LogTime = Oconv(Time(), 'MTS')
|
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Update Received Qty Log.csv'
|
|
Headers = 'Logging DTM' : @FM : 'WONo' : @FM : 'Notes'
|
|
objUpRecLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$)
|
|
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
|
|
|
ErrorMsg = ''
|
|
If WONo NE '' then
|
|
If RowExists('WO_LOG', WONo) then
|
|
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
|
If Error_Services('NoError') then
|
|
RXQty = obj_WO_Log('RxQty', WONo:@RM:WORec)
|
|
Open 'WO_LOG' to hTable then
|
|
WriteV RXQty on hTable, WONo, WO_LOG_RX_QTY_STATIC$ else
|
|
ErrorMsg = 'Error in ':Service:' service. Failed to write received quantity ':RXQty
|
|
ErrorMsg := ' to the RX_QTY_STATIC field of WO_LOG record ':WONo:'.'
|
|
ErrorMsg := '@FILE_ERROR: ':@FILE_ERROR
|
|
end
|
|
end else
|
|
ErrorMsg = 'Error in ':Service:' service. Failed to open the WO_LOG table.'
|
|
end
|
|
end else
|
|
ErrorMsg = 'Error in ':Service:' service. Failed to read record ':WONo:' from the WO_LOG table. '
|
|
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
|
end
|
|
end else
|
|
ErrorMsg = 'Error in ':Service:' service. ':WONo:' does not exist in the WO_LOG table.'
|
|
end
|
|
end else
|
|
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service'
|
|
end
|
|
|
|
LogData = ''
|
|
LogData<1> = LoggingDtm
|
|
LogData<2> = WONo
|
|
If ErrorMsg EQ '' then
|
|
LogData<3> = 'Successfully updated WO_LOG record ':WONo:' field RX_QTY_STATIC with received quantity ':RXQty:'.'
|
|
Logging_Services('AppendLog', objUpRecLog, LogData, @RM, @FM)
|
|
end else
|
|
LogResult = 'Failed to update WO_LOG record ':WONo:' field RX_QTY_STATIC with received quantity ':RXQty
|
|
LogResult := '. Error message: ':ErrorMsg
|
|
LogData<3> = LogResult
|
|
Logging_Services('AppendLog', objUpRecLog, LogData, @RM, @FM)
|
|
Error_Services('Add', ErrorMsg)
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
Service UpdateShippedQty(WONo)
|
|
|
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
|
LogDate = Oconv(Date(), 'D4/')
|
|
LogTime = Oconv(Time(), 'MTS')
|
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Update Shipped Qty Log.csv'
|
|
Headers = 'Logging DTM' : @FM : 'WONo' : @FM : 'Notes'
|
|
objUpShipLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$)
|
|
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
|
|
|
ErrorMsg = ''
|
|
If WONo NE '' then
|
|
If RowExists('WO_LOG', WONo) then
|
|
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
|
If Error_Services('NoError') then
|
|
ShipQty = obj_WO_Log('ShipQty', WONo:@RM:WORec)
|
|
Open 'WO_LOG' to hTable then
|
|
WriteV ShipQty on hTable, WONo, WO_LOG_SHIP_QTY_STATIC$ else
|
|
ErrorMsg = 'Error in ':Service:' service. Failed to write ':ShipQty
|
|
ErrorMsg := ' to the SHIP_QTY_STATIC field of WO_LOG record ':WONo:'.'
|
|
ErrorMsg := '@FILE_ERROR: ':@FILE_ERROR
|
|
end
|
|
end else
|
|
ErrorMsg = 'Error in ':Service:' service. Failed to open the WO_LOG table.'
|
|
end
|
|
end else
|
|
ErrorMsg = 'Error in ':Service:' service. Failed to read record ':WONo:' from the WO_LOG table. '
|
|
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
|
end
|
|
end else
|
|
ErrorMsg = 'Error in ':Service:' service. ':WONo:' does not exist in the WO_LOG table.'
|
|
end
|
|
end else
|
|
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service'
|
|
end
|
|
|
|
LogData = ''
|
|
LogData<1> = LoggingDtm
|
|
LogData<2> = WONo
|
|
If ErrorMsg EQ '' then
|
|
LogResult = 'Successfully updated WO_LOG record ':WONo:' field SHIP_QTY_STATIC '
|
|
LogResult := 'with shipped quantity ':ShipQty:'.'
|
|
LogData<3> = LogResult
|
|
Logging_Services('AppendLog', objUpShipLog, LogData, @RM, @FM)
|
|
end else
|
|
LogResult = 'Failed to update WO_LOG record ':WONo:' field SHIP_QTY_STATIC with shipped quantity '
|
|
LogResult := ShipQty:'. Error message: ':ErrorMsg
|
|
LogData<3> = LogResult
|
|
Logging_Services('AppendLog', objUpShipLog, LogData, @RM, @FM)
|
|
Error_Services('Add', ErrorMsg)
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
Service ConvertRecordToJSON(WONo, Record, ItemURL)
|
|
|
|
jsonRecord = ''
|
|
IF WONo NE '' then
|
|
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
|
If Error_Services('NoError') then
|
|
@DICT = Database_Services('GetTableHandle', 'DICT.WO_LOG')
|
|
@ID = WONo
|
|
@RECORD = Record
|
|
objJSON = ''
|
|
If SRP_JSON(objJSON, 'New', 'Object') then
|
|
objWOLog = ''
|
|
If SRP_JSON(objWOLog, 'New', 'Object') then
|
|
SRP_JSON(objWOLog, 'SetValue', 'KeyId', @ID)
|
|
SRP_JSON(objWOLog, 'SetValue', 'ProdOrdNo', {PROD_ORD_NO})
|
|
SRP_JSON(objWOLog, 'SetValue', 'PSN', {PROD_SPEC_ID})
|
|
SRP_JSON(objWOLog, 'SetValue', 'EpiPartNo', {EPI_PART_NO})
|
|
SRP_JSON(objWOLog, 'SetValue', 'HOT_FLAG', {HOT_FLAG})
|
|
//Create a list of cassettes
|
|
CassIDs = {WO_MAT_KEY}
|
|
objChildCassettes = ''
|
|
If SRP_JSON(objChildCassettes, 'New', 'Array') then
|
|
If CassIDs NE '' then
|
|
for each Cass in CassIDs using @VM setting vPos
|
|
SAPBatchNo = XLATE('WO_MAT', Cass, WO_MAT_SAP_BATCH_NO$, 'X')
|
|
SAPTXDtm = XLATE('WO_MAT', Cass, WO_MAT_SAP_TX_DTM$, 'X')
|
|
RDSNo = XLATE('WO_MAT', Cass, WO_MAT_RDS_NO$, 'X')
|
|
ShipNo = XLATE('WO_MAT', Cass, WO_MAT_SHIP_NO$, 'X')
|
|
//Add in each indv. cassette object
|
|
objChildCassette = ''
|
|
If SRP_JSON(objChildCassette, 'New', 'Object') then
|
|
SRP_JSON(objChildCassette, 'SetValue', 'KeyId', Cass)
|
|
SRP_JSON(objChildCassette, 'SetValue', 'SAPBatchNo', SAPBatchNo)
|
|
SRP_JSON(objChildCassette, 'SetValue', 'SAPTXDtm', OCONV(SAPTXDtm, 'DT'))
|
|
SRP_JSON(objChildCassette, 'SetValue', 'RDSNo', RDSNo)
|
|
SRP_JSON(objChildCassette, 'SetValue', 'ShipNo', ShipNo)
|
|
SRP_JSON(objChildCassettes, 'Add', objChildCassette)
|
|
SRP_JSON(objChildCassette, 'Release')
|
|
end
|
|
|
|
Next Cass
|
|
end else
|
|
SRP_JSON(objWOLog, 'SetValue', 'ChildCassettes', '')
|
|
end
|
|
SRP_JSON(objWOLog, 'Set', 'ChildCassettes', objChildCassettes)
|
|
SRP_JSON(objChildCassettes, 'Release')
|
|
end
|
|
SRP_JSON(objJSON, 'Set', 'WO_Log', objWOLog)
|
|
SRP_JSON(objWOLog, 'Release')
|
|
end
|
|
If itemURL NE '' then
|
|
// The itemURL was passed in so add HAL+JSON properties.
|
|
// Create the _links property and then all link objects needed for this resource.
|
|
objLinks = ''
|
|
If SRP_JSON(objLinks, 'New', 'Object') then
|
|
// Create a self link.
|
|
objLink = ''
|
|
If SRP_JSON(objLink, 'New', 'Object') then
|
|
SRP_JSON(objLink, 'SetValue', 'href', ItemURL, 'String')
|
|
SRP_JSON(objLink, 'SetValue', 'title', 'Self', 'String')
|
|
SRP_JSON(objLinks, 'Set', 'self', objLink)
|
|
SRP_JSON(objLink, 'Release')
|
|
end
|
|
SRP_JSON(objJSON, 'Set', '_links', objLinks)
|
|
SRP_JSON(objLinks, 'Release')
|
|
end
|
|
|
|
// Create the _class property for this resource.
|
|
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
|
|
end
|
|
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
|
SRP_JSON(objJSON, 'Release')
|
|
end else
|
|
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
|
end
|
|
end
|
|
end else
|
|
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
|
|
end
|
|
Response = jsonRecord
|
|
|
|
end service
|
|
|
|
|
|
Service RemoveWoMatCassetteFromWO(WoMatKey, Username)
|
|
|
|
ErrorMessage = ''
|
|
If RowExists('WO_MAT', WoMatKey) then
|
|
WoNo = Field(WoMatKey, '*', 1)
|
|
WOLogRecord = Database_Services('ReadDataRow', 'WO_LOG', WoNo, True$, 0, False$)
|
|
If Error_Services('NoError') then
|
|
WoMatKeys = WOLogRecord<WO_LOG_WO_MAT_KEY$>
|
|
Locate WoMatKey in WoMatKeys using @VM setting CassPos then
|
|
WoLogRecord<WO_LOG_WO_MAT_KEY$> = Delete(WOLogRecord<WO_LOG_WO_MAT_KEY$>, 1, CassPos, 0)
|
|
Database_Services('WriteDataRow', 'WO_LOG', WoNo, WoLogRecord)
|
|
If Error_Services('NoError') then
|
|
Work_Order_Services('UpdateReceivedQty', WONo)
|
|
Work_Order_Services('UpdateReleasedQty', WONo)
|
|
Work_Order_Services('UpdateUnscheduledQuantities')
|
|
end else
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
end else
|
|
ErrorMessage = "Unable to locate cass no " : WoMatKey : ' in the WO_LOG ' : WoNo : ' Record.'
|
|
end
|
|
end else
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
end else
|
|
ErrorMessage = 'Invalid WoMat Key ' : WoMatKey : ' passed to RemoveWoMatCassetteFromWO routine.'
|
|
end
|
|
If ErrorMessage NE '' then
|
|
Error_Services('Add', ErrorMessage)
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
Service SignVoidNonEpp(WOMatKey, Username)
|
|
|
|
ErrorMessage = ''
|
|
WONo = Field(WOMatKey, '*', 1)
|
|
CassNo = Field(WoMatKey, '*', 2)
|
|
ReactType = XLATE('WO_LOG', WONo, WO_LOG_REACT_TYPE$, 'X')
|
|
If ReactType EQ 'ASM' OR ReactType EQ 'ASM+' OR ReactType EQ 'HTR' then
|
|
RDSNo = Database_Services('ReadDataColumn', 'WO_MAT', WoMatKey, WO_MAT_RDS_NO$, True$, 0, False$)
|
|
If Error_Services('NoError') then
|
|
WoMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey, True$, 0, False$)
|
|
IsVoided = WoMatRec<WO_MAT_VOID$>
|
|
If Not(IsVoided) then
|
|
IsOnHold = Hold_Services('CheckForHold', WoMatKey)
|
|
If Not(IsOnHold) then
|
|
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'RemoveWoMatCassetteFromWO':@vm:WOMatKey:@vm:Username)
|
|
If Error_Services('NoError') then
|
|
Service_Services('PostProcedure', 'WO_MAT_SERVICES', 'SetWoMatVoidFlag':@vm:WOMatKey:@VM:Username)
|
|
if Error_Services('NoError') then
|
|
Service_Services('PostProcedure', 'RDS_SERVICES', 'DetachRDSFromWO':@vm:RDSNo)
|
|
If Error_Services('NoError') then
|
|
LotEventParams = ''
|
|
LotEventParams<1,1> = 'CreateLotEvent'
|
|
LotEventParams<1,4> = DateTime()
|
|
LotEventParams<1,5> = 'VOID'
|
|
LotEventParams<1,6> = 'Lot voided by ' : Username
|
|
LotEventParams<1,11> = Username
|
|
If RDSNo NE '' then
|
|
LotEventParams<1,2> = RDSNo
|
|
LotEventParams<1,3> = 'RDS'
|
|
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams)
|
|
end else
|
|
LotEventParams<1,2> = WoMatKey
|
|
LotEventParams<1,3> = 'WO_MAT'
|
|
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams)
|
|
end
|
|
If Error_Services('NoError') then
|
|
//Add inventory transaction
|
|
|
|
end else
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
end else
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
end else
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
|
|
end else
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
end
|
|
end else
|
|
ErrorMessage = 'Unable to void lot as it is already voided.'
|
|
end
|
|
end else
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
end else
|
|
ErrorMessage = 'Cannot use this routine to void EpiPro lots.'
|
|
end
|
|
|
|
If ErrorMessage NE '' then
|
|
LogData = ''
|
|
LogData<1> = LoggingDTM
|
|
LogData<2> = Username
|
|
LogData<3> = WOMatKey
|
|
LogData<4> = ErrorMessage
|
|
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
|
|
Error_Services('Add', ErrorMessage)
|
|
end else
|
|
LogData = ''
|
|
LogData<1> = LoggingDTM
|
|
LogData<2> = Username
|
|
LogData<3> = WOMatKey
|
|
LogData<4> = 'Void queued successfully.'
|
|
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
|
|
Error_Services('Add', ErrorMessage)
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
Service SignVoidWMI(WMInKey, Username)
|
|
|
|
ErrorMessage = ''
|
|
WONo = Field(WMInKey, '*', 1)
|
|
CassNo = Field(WMInKey, '*', 3)
|
|
WoStepKey = Xlate('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
|
|
WoMatKey = WONo : '*' : CassNo
|
|
ReactType = XLATE('WO_LOG', WONo, WO_LOG_REACT_TYPE$, 'X')
|
|
If ReactType EQ 'EPP' then
|
|
WMInRec = Database_Services('ReadDataRow', 'WM_IN', WMInKey, True$, 0, False$)
|
|
IsVoided = WMInRec<WM_IN_VOID$>
|
|
If Not(IsVoided) then
|
|
IsOnHold = Hold_Services('CheckForHold', WoMatKey)
|
|
If Not(IsOnHold) then
|
|
Service_Services('PostProcedure', 'WM_IN_SERVICES', 'SetVoidFlag':@vm:WMInKey:@VM:Username)
|
|
If Error_Services('NoError') then
|
|
LotEventParams = ''
|
|
LotEventParams<1,1> = 'CreateLotEvent'
|
|
LotEventParams<1,4> = DateTime()
|
|
LotEventParams<1,5> = 'VOID'
|
|
LotEventParams<1,6> = 'Lot voided by ' : Username
|
|
LotEventParams<1,11> = Username
|
|
LotEventParams<1,2> = WMInKey
|
|
LotEventParams<1,3> = 'WM_IN'
|
|
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams)
|
|
If Error_Services('NoError') then
|
|
//Check if WMO is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record
|
|
WMOKey = WMInKey; //the paired WMO key is the same as the WMIKey
|
|
IsWMOVoided = Database_Services('ReadDataColumn', 'WM_OUT', WMOKey, WM_OUT_VOID$)
|
|
If IsWMOVoided then
|
|
Service_Services('PostProcedure', 'WO_MAT_SERVICES', 'SetWoMatVoidFlag':@VM:WoMatKey:@VM:Username)
|
|
If Error_Services('NoError') then
|
|
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES','RemoveWoMatCassetteFromWO':@VM:WoMatKey:@VM:Username)
|
|
If Error_Services('HasError') then
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
end else
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
end
|
|
end else
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
end else
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
end
|
|
end else
|
|
ErrorMessage = 'Unable to void lot as it is already voided.'
|
|
end
|
|
end else
|
|
ErrorMessage = 'Cannot use this routine to void EpiPro lots.'
|
|
end
|
|
|
|
If ErrorMessage NE '' then
|
|
LogData = ''
|
|
LogData<1> = LoggingDTM
|
|
LogData<2> = Username
|
|
LogData<3> = WMInKey
|
|
LogData<4> = ErrorMessage
|
|
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
|
|
Error_Services('Add', ErrorMessage)
|
|
end else
|
|
LogData = ''
|
|
LogData<1> = LoggingDTM
|
|
LogData<2> = Username
|
|
LogData<3> = WMInKey
|
|
LogData<4> = 'Void queued successfully.'
|
|
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
|
|
Error_Services('Add', ErrorMessage)
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
Service SignVoidWMO(WMOutKey, Username)
|
|
|
|
ErrorMessage = ''
|
|
WONo = Field(WMOutKey, '*', 1)
|
|
CassNo = Field(WMOutKey, '*', 3)
|
|
WoStepKey = Xlate('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
|
|
WoMatKey = WONo : '*' : CassNo
|
|
ReactType = XLATE('WO_LOG', WONo, WO_LOG_REACT_TYPE$, 'X')
|
|
If ReactType EQ 'EPP' then
|
|
WMOutRec = Database_Services('ReadDataRow', 'WM_OUT', WMOutKey, True$, 0, False$)
|
|
IsVoided = WMOutRec<WM_OUT_VOID$>
|
|
If Not(IsVoided) then
|
|
IsOnHold = Hold_Services('CheckForHold', WoMatKey)
|
|
If Not(IsOnHold) then
|
|
Service_Services('PostProcedure', 'WM_OUT_SERVICES', 'SetVoidFlag':@vm:WMOutKey:@VM:Username)
|
|
If Error_Services('NoError') then
|
|
LotEventParams = ''
|
|
LotEventParams<1,1> = 'CreateLotEvent'
|
|
LotEventParams<1,4> = DateTime()
|
|
LotEventParams<1,5> = 'VOID'
|
|
LotEventParams<1,6> = 'Lot voided by ' : Username
|
|
LotEventParams<1,11> = Username
|
|
LotEventParams<1,2> = WMOutKey
|
|
LotEventParams<1,3> = 'WM_OUT'
|
|
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams)
|
|
If Error_Services('NoError') then
|
|
//Check if WMI is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record
|
|
WMIKey = WMOutKey; //the paired WMO key is the same as the WMIKey
|
|
IsWMIVoided = Database_Services('ReadDataColumn', 'WM_IN', WMIKey, WM_IN_VOID$)
|
|
If IsWMIVoided then
|
|
Service_Services('PostProcedure', 'WO_MAT_SERVICES', 'SetWoMatVoidFlag':@VM:WoMatKey:@VM:Username)
|
|
If Error_Services('NoError') then
|
|
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES','RemoveWoMatCassetteFromWO':@VM:WoMatKey:@VM:Username)
|
|
If Error_Services('HasError') then
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
end else
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
end
|
|
end else
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
end else
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
end
|
|
end
|
|
end else
|
|
ErrorMessage = 'Unable to void lot as it is already voided.'
|
|
end
|
|
end else
|
|
ErrorMessage = 'Cannot use this routine to void EpiPro lots.'
|
|
end
|
|
|
|
If ErrorMessage NE '' then
|
|
LogData = ''
|
|
LogData<1> = LoggingDTM
|
|
LogData<2> = Username
|
|
LogData<3> = WMOutKey
|
|
LogData<4> = ErrorMessage
|
|
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
|
|
Error_Services('Add', ErrorMessage)
|
|
end else
|
|
LogData = ''
|
|
LogData<1> = LoggingDTM
|
|
LogData<2> = Username
|
|
LogData<3> = WMOutKey
|
|
LogData<4> = 'Void queued successfully.'
|
|
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
|
|
Error_Services('Add', ErrorMessage)
|
|
end
|
|
|
|
end service
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Internal GoSubs
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
ClearCursors:
|
|
|
|
For counter = 0 to 8
|
|
ClearSelect counter
|
|
Next counter
|
|
|
|
return
|
|
|
|
|