function wo_daily_sched_comm(Branch, CurParam) declare function Set_Property, fieldcount, Get_Property, msg, dialog_box, Security_Check declare function send_message, utility, key_sort, Start_Window, entid, repository declare FUNCTION relational_call, MemberOf declare SUBROUTINE extract_si_keys, End_Dialog, make.list, security_err_msg, Set_Property $insert msg_equates $insert lsl_users_equ $insert rds_equ $insert security_rights_equ $insert logical $insert popup_equates $insert react_mode_equ equ Blue$ TO 16711680 equ Red$ TO 255 equ Green$ TO 65280 equ Yellow$ TO 65535 equ White$ TO 16777215 equ Black$ TO 1 equ Gray$ TO 12632256 equ BoxStart$ TO 8 ;* this is critical it is the position in the * wo_daily_sched1-8 records where the box arrays start; IF the structure * changes then this will need to also ForceModeChange = false$ ;* flag set to true when changing work order as to stamp ReturnVar = 0 Branches = 'WO_GOT_FOCUS,WO_LOST_FOCUS,FORM_CREATE,FORM_SAVE,FORM_CANCEL,CALL_WINDOW,REFRESH,OPTIONS,REACT_MODE' CONVERT ',' TO @FM in Branches LOCATE Branch in Branches using @FM setting Bpos then on Bpos GOSUB WO_GOT_FOCUS, WO_LOST_FOCUS, FORM_CREATE, FORM_SAVE, FORM_CANCEL, CALL_WINDOW, REFRESH, OPTIONS, REACT_MODE END ELSE void = msg( '', 'Invalid Branch ':Bpos:' passed to wo_daily_sched_comm' ) END RETURN ReturnVar * * * * * * * WO_GOT_FOCUS: * * * * * * * * CurParam is the current control name OrigWoVal = Get_Property( CurParam, 'TEXT' ) Set_Property( @WINDOW, '@OrigWoVal', OrigWoVal ) RETURN * * * * * * * WO_LOST_FOCUS: * * * * * * * * CurParam is the current control name HoldParam = CurParam NewWoVal = Get_Property( CurParam, 'TEXT' ) OrigWoVal = Get_Property( @WINDOW, '@OrigWoVal' ) IF NewWoVal <> OrigWoVal then * NOW FORCE THEM TO CHANGE THE STATUS OR APPLY SETTING THIS WORK ORDER SWAP 'RW' with 'RM' in CurParam ForceModeChange = true$ Mode = '' GOSUB react_mode IF Mode = 'CANCEL' then * could not get a lock so someone else is changing the mode with a * different work order than the one we have changed to * so do not change the work order void = Set_Property( HoldParam, 'TEXT', OrigWoVal ) END ELSE * check to see IF we are running this wo anywhere else * and warn user - as to not forget to finish a wo before * starting a new one IF OrigWoVal then GOSUB CheckWo END CurEditTable = HoldParam CurWoVal = NewWoVal SWAP '.RW' with '.R' in CurEditTable GOSUB PrepWo GOSUB RecalcWo END END RETURN * * * * * * * RecalcWo: * * * * * * * * called from this code only no external branch CurRMode = CurEditTable TRMode = field( CurRMode, '.', 2 ) SWAP 'R' with 'RM' in TRMode CurRMode = field( CurRMode, '.', 1 ):'.':TRMode RNum = field( CurRMode, '.', 2 ) SWAP 'RM' with '' in RNum RMId = 'REACT_MODE':RNum Mode = XLATE( 'CONFIG', RMId, Mode$, 'X' )[1,4] IF Mode then SWAP 'Down' with 'Down2' in Mode ;* down 2 is bmp for down no material SWAP 'N/A ' with 'NONA' in Mode ;* nona is for not_applicable reactor not in use DosBmp = 'BMPS\':Mode:'.BMP' void = Set_Property( CurRMode, 'BITMAP', DosBmp ) END IF num( WoToRecalc ) then Stat = utility( 'CURSOR', 'H' ) OPEN 'RDS' TO RdsTable else void = msg( '', 'Unable TO OPEN RDS...' ) RETURN 0 END extract_si_keys( 'RDS', 'WO', WoToRecalc, RdsToProc ) IF RdsToProc then CurArray = Get_Property( CurEditTable, 'ARRAY' ) for i = 1 TO 80 void = send_message( CurEditTable, 'COLOR_BY_POS', i, 1, Black$ ) NEXT I CONVERT @VM TO @FM in RdsToProc RdsToProc = key_sort( RdsToProc, 'RDS', 'RUN_ORDER_NUM', 1 ) Tcnt = fieldcount( RdsToProc, @FM ) IF SeperateLayer then IF SeperateLayer = 1 then * eliminate all layers except one Trds = RdsToProc RdsToProc = '' FOR I = 1 TO Tcnt IF INDEX( Trds, '.', 1 ) else RdsToProc := Trds:@FM END NEXT I RdsToProc[-1,1] = '' END ELSE * have to extract only the .layers Trds = RdsToProc RdsToProc = '' FOR I = 1 TO Tcnt IF INDEX( Trds, '.':SeperateLayer, 1 ) then RdsToProc := Trds:@FM END NEXT I RdsToProc[-1,1] = '' END END RdsToProc = field( RdsToProc, @FM, 1, 80 ) ;* only room for 80 Rcnt = fieldcount( RdsToProc, @FM ) FOR I = 1 TO Rcnt READ RdsRec FROM RdsTable, RdsToProc else void = msg( '', 'Unable to READ ':RdsToProc:' FROM RDS...' ) RETURN 0 END * IF CurArray = 0 then * they do not want to run this box on this reactor GrayBox = true$ END ELSE * it is either one on blank meaning show this box GrayBox = false$ END DateIn = RdsRec DateOut = RdsRec Reactor = RdsRec BEGIN CASE CASE ( GrayBox ) and ( Reactor = CurReactor ) * this is a gray box meaning run on another reactor but it * ran here so show blue ColorToUse = Blue$ CASE GrayBox ColorToUse = Gray$ CASE ( DateIn = '' ) and ( DateOut = '' ) ColorToUse = White$ CASE Reactor <> CurReactor ColorToUse = Blue$ CASE ( DateIn <> '' ) and ( DateOut = '' ) ColorToUse = Green$ CASE ( DateIn <> '' ) and ( DateOut <> '' ) ColorToUse = Red$ END CASE * void = send_message( CurEditTable, 'COLOR_BY_POS', i, 1, ColorToUse ) NEXT I END Stat = utility( 'CURSOR', 'A' ) END RETURN * * * * * * * FORM_CREATE: * * * * * * * * curparam is the window number 1,2,3,4,5 * field one of the config "WO_DAILY_SCHED"1-9999 will have an @VM delim on * controls to load using fields 2-999 DailySchedName = 'WO_DAILY_SCHED':CurParam OPEN 'CONFIG' TO ConfigTable else void = msg( '', 'Unable to OPEN CONFIG table' ) End_Dialog( @WINDOW, '' ) RETURN 0 END *UserRec = XLATE( 'LSL_USERS', @user4, '', 'X' ) *Groups = UserRec *LOCATE 'DATA_ENTRY' in Groups using @VM setting Fpos then IF MemberOf( @user4, 'SUPERVISOR' ) or MemberOf( @user4, 'DATA_ENTRY' ) then lock ConfigTable, DailySchedName then GOSUB DoRead END ELSE MsgInfo = '' MsgInfo = DailySchedName:' is in use somewhere else...You will not be allowed to change anything.' MsgInfo = '!' void = msg( '', MsgInfo ) void = Set_Property( @WINDOW:'.SAVE', 'ENABLED', 0 ) void = Set_Property( @WINDOW:'.CANCEL', 'TEXT', 'OK' ) void = Set_Property( @WINDOW:'.SAVE2', 'ENABLED', 0 ) void = Set_Property( @WINDOW:'.CANCEL2', 'TEXT', 'OK' ) GOSUB DoRead FOR I = 1 TO Ccnt ThisControl = @WINDOW:'.':ControlsToLoad<1,i> void = Set_Property( ThisControl, 'ENABLED', 0 ) NEXT I END END ELSE void = Set_Property( @WINDOW:'.SAVE', 'ENABLED', 0 ) void = Set_Property( @WINDOW:'.CANCEL', 'TEXT', 'OK' ) void = Set_Property( @WINDOW:'.SAVE2', 'ENABLED', 0 ) void = Set_Property( @WINDOW:'.CANCEL2', 'TEXT', 'OK' ) GOSUB DoRead FOR I = 1 TO Ccnt ThisControl = @WINDOW:'.':ControlsToLoad<1,i> void = Set_Property( ThisControl, 'ENABLED', 0 ) NEXT I END RETURN 0 * * * * * * * DoRead: * * * * * * * * called from this code only no external branch READ DailySched FROM ConfigTable, DailySchedName then IF DailySched then ControlsToLoad = DailySched<1> ValsToLoad = field( DailySched, @FM, 2, 999 ) Ccnt = fieldcount( ControlsToLoad, @VM ) FOR j = 1 TO Ccnt ControlToLoad = @WINDOW:'.':ControlsToLoad<1,j> CurWoVal = ValsToLoad CurEditTable = ControlToLoad SWAP '.RW' with '.R' in CurEditTable void = Set_Property( ControlToLoad, 'TEXT', CurWoVal ) BoxPos = j+6 BoxData = ValsToLoad ArrayData = '' FOR k = 1 TO 80 ArrayData = k ArrayData = BoxData<1,k> next k void = Set_Property( CurEditTable, 'ARRAY', ArrayData ) GOSUB PrepWo GOSUB RecalcWo next j END END ELSE Ccnt = 0 END RETURN * * * * * * * FORM_SAVE: * * * * * * * * curparam is the window number 1,2,3,4,5 * field one of the config "WO_DAILY_SCHED"1-9999 will have an @VM delim on * controls to save in fields 2-999 OPEN 'CONFIG' TO ConfigTable else void = msg( '', 'Unable to OPEN CONFIG table' ) End_Dialog( @WINDOW, '' ) RETURN 0 END DailySchedName = 'WO_DAILY_SCHED':CurParam ControlsToSave = XLATE( 'CONFIG', DailySchedName, 1, 'X' ) DailySchedRec = '' Ccnt = fieldcount( ControlsToSave, @VM ) FOR I = 1 TO Ccnt ControlToSave = @WINDOW:'.':ControlsToSave<1,i> DailySchedRec = Get_Property( ControlToSave, 'TEXT' ) NEXT I DailySchedRec = ControlsToSave:@FM:DailySchedRec SWAP 'RW' with 'R' in ControlsToSave BoxPos = BoxStart$ FOR I = 1 TO Ccnt CurArray = Get_Property( @WINDOW:'.':ControlsToSave<1,i>, 'ARRAY' ) FieldOut = '' FOR j = 1 TO 80 FieldOut<1,j> = CurArray next j DailySchedRec = FieldOut BoxPos += 1 NEXT I write DailySchedRec on ConfigTable, DailySchedName else void = msg( '', 'Unable to write ':DailySchedName:' in CONFIG table' ) End_Dialog( @WINDOW, '' ) RETURN 0 END unlock ConfigTable, DailySchedName else void = msg( '', 'Unable to unlock ':DailySchedName:' in CONFIG table' ) END End_Dialog( @WINDOW, '' ) RETURN * * * * * * * FORM_CANCEL: * * * * * * * * curparam is the window number 1,2,3,4,5 *UserRec = XLATE( 'LSL_USERS', @user4, '', 'X' ) *Groups = UserRec *LOCATE 'DATA_ENTRY' in Groups using @VM setting Fpos then IF MemberOf( @user4, 'SUPERVISOR' ) or MemberOf( @user4, 'DATA_ENTRY' ) then DailySchedName = 'WO_DAILY_SCHED':CurParam OPEN 'CONFIG' TO ConfigTable else void = msg( '', 'Unable to OPEN CONFIG table' ) End_Dialog( @WINDOW, '' ) RETURN 0 END unlock ConfigTable, DailySchedName else *void = msg( '', 'Unable to unlock CONFIG ':DailySchedName ) * removed error message - as to allow DATA_ENTRY to view * only is alREADy locked END END End_Dialog( @WINDOW, '' ) RETURN * * * * * * * CALL_WINDOW: * * * * * * * *CurParam is the window to call If Get_Property('NDW_MAIN', 'VISIBLE') then AppMain = 'NDW_MAIN' end else AppMain = 'LSL_MAIN2' end void = Start_Window( CurParam, AppMain, '*CENTER', '', '' ) RETURN * * * * * * * PrepWo: * * * * * * * * called internally CurReactor = field( CurEditTable, '.', 2 ) CONVERT @UPPER_CASE TO '' in CurReactor CONVERT @LOWER_CASE TO '' in CurReactor SeperateLayer = '' LayPos = INDEX( CurWoVal, 'LAY', 1 ) IF LayPos then BegPos = LayPos +3 ;* for length of lay SeperateLayer = CurWoVal[BegPos,'F>'] SWAP '' with '' in CurWoVal END SWAP '52nd' with '' in CurWoVal CONVERT @UPPER_CASE TO '' in CurWoVal CONVERT @LOWER_CASE TO '' in CurWoVal CONVERT " `~!@#$%^&*()_+-=\][{}|';:/?.>,<" TO '' in CurWoVal CONVERT '"' TO '' in CurWoVal WoToRecalc = CurWoVal RETURN * * * * * * * REFRESH: * * * * * * * * curparam is the window number 1,2,3,4,5 DailySchedName = 'WO_DAILY_SCHED':CurParam OPEN 'CONFIG' TO ConfigTable else void = msg( '', 'Unable TO OPEN CONFIG table' ) End_Dialog( @WINDOW, '' ) RETURN 0 END IF Get_Property( @WINDOW:'.SAVE', 'ENABLED' ) then * is a DATA_ENTRY and has the lock so reload from window values READ DailySched FROM ConfigTable, DailySchedName then IF DailySched then ;* READ controls from config but get vals from window ControlsToLoad = DailySched<1> Ccnt = fieldcount( ControlsToLoad, @VM ) FOR j = 1 TO Ccnt ControlToLoad = @WINDOW:'.':ControlsToLoad<1,j> CurWoVal = Get_Property( ControlToLoad, 'TEXT' ) CurEditTable = ControlToLoad SWAP '.RW' with '.R' in CurEditTable GOSUB PrepWo GOSUB RecalcWo NEXT I END END ELSE Ccnt = 0 END END ELSE GOSUB DoRead * is not a DATA_ENTRY so READ FROM disk as it may have changed END RETURN * * * * * * * OPTIONS: * * * * * * * * CurParam will pass the control name of the edittable * and all this code needs to do is add a W to the R HoldEdTable = CurParam Reactor = CurParam Reactor = field(CurParam,'.', 2 ) CONVERT @UPPER_CASE TO '' in Reactor CONVERT @LOWER_CASE TO '' in Reactor SWAP '.R' with '.RW' in CurParam PopupId = entid( @appid<1>, 'POPUP', '', 'DAILY_SCHED_OPTS' ) OverRide = '' IF MemberOf( @user4, 'SUPERVISOR' ) or MemberOf( @user4, 'DATA_ENTRY' ) THEN * add option to choose boxes if the save button is enabled meaning they have the lock IF Get_Property( @WINDOW:'.SAVE', 'ENABLED' ) THEN Display = 'Quote':@tm:'QUOTE':@VM:'PSN':@tm:'PSN':@VM:'Recipe':@tm:'RECIPE':@VM:'RunData Sheet':@tm:'RDS':@VM:'Work Order':@tm:'WO' Display:= @VM:'Choose Boxes':@tm:'CHOOSE_BOXES' * When the popup daily_sched_opts changes the above 2 lines need changing OverRide = Display END END ChosenOpt = repository( 'EXECUTE', PopupId, @WINDOW, OverRide ) CurWoVal = Get_Property( CurParam, 'TEXT' ) HoldWoVal = CurWoVal SeperateLayer = '' LayPos = INDEX( CurWoVal, 'LAY', 1 ) IF LayPos then BegPos = LayPos +3 ;* for length of lay SeperateLayer = CurWoVal[BegPos,'F>'] SWAP '' with '' in CurWoVal END SWAP '52nd' with '' in CurWoVal CONVERT @UPPER_CASE TO '' IN CurWoVal CONVERT @LOWER_CASE TO '' IN CurWoVal CONVERT " `~!@#$%^&*()_+-=\][{}|';:/?.>,<" TO '' IN CurWoVal CONVERT '"' TO '' IN CurWoVal RdsKeys = '' BEGIN CASE CASE ChosenOpt = 'QUOTE' IF Security_Check( 'Quote', Read$ ) THEN GOSUB GetRdsKeys QuoteKey = XLATE( 'RDS', RdsKeys<1,1>, rds_quote_no$, 'X' ) void = Start_Window( 'QUOTE', @WINDOW, QuoteKey:'*CENTER', '', '' ) END ELSE security_err_msg( 'Quote', Read$ ) END CASE ChosenOpt = 'PSN' IF Security_Check( 'Prod Spec', Read$ ) THEN GOSUB GetRdsKeys PSNId = XLATE( 'RDS', RdsKeys<1,1>, rds_prod_spec_id$, 'X' ) void = Start_Window( 'PROD_SPEC', @WINDOW, PSNId:'*CENTER', '', '' ) END ELSE security_err_msg( 'Prod Spec', Read$ ) END CASE ChosenOpt = 'RECIPE' IF Security_Check( 'Recipe', Read$ ) THEN GOSUB GetRdsKeys RecipeKey = XLATE( 'RDS', RdsKeys<1,1>, rds_recipe_no$, 'X' ) void = Start_Window( 'RECIPE', @WINDOW, RecipeKey:'*CENTER', '', '' ) END ELSE security_err_msg( 'Recipe', Read$ ) END CASE ChosenOpt = 'RDS' IF Security_Check( 'RDS', Read$ ) THEN Keys = relational_call( 'WO_LOG', 'RDS_KEYS', CurWoVal, 'RDS_QUERY', 'RDS', 'CUST_NAME':@FM:'WO':@FM:'RUN_ORDER_NUM' ) IF Keys then SWAP 'NoKeys' with '' in Keys ParamToPass = Keys void = Start_Window( 'RDS', @WINDOW, Keys:'*CENTER', '', '' ) END END ELSE security_err_msg( 'RDS', Read$ ) END CASE ChosenOpt = 'WO' IF Security_Check( 'WO Log', Read$ ) then void = Start_Window( 'WO_LOG', @WINDOW, CurWoVal:'*CENTER', '', '' ) END ELSE security_err_msg( 'WO Log', Read$ ) END CASE ChosenOpt = 'CHOOSE_BOXES' extract_si_keys( 'RDS', 'WO', CurWoVal, RdsIds ) IF RdsIds then PopId = entid( @appid<1>, 'POPUP', '', 'RDS_QUERY' ) OverRide = '' OverRide = 'Choose the RDS Run Orders for Reactor ':Reactor CONVERT @VM TO @FM in RdsIds make.list( 0, RdsIds, '', '' ) ChosenKeys = repository( "EXECUTE", PopId, @WINDOW, OverRide ) IF ChosenKeys then Ccnt = fieldcount( ChosenKeys, @VM ) CurArray = Get_Property( HoldEdTable, 'ARRAY' ) FOR I = 1 TO 80 * to gray boxes CurArray = 0 NEXT I RunNums = XLATE( 'RDS', ChosenKeys, 'RUN_ORDER_NUM', 'X' ) FOR I = 1 TO Ccnt * ungray selected boxes CurArray,2> = 1 NEXT I void = Set_Property( HoldEdTable, 'ARRAY', CurArray ) CurEditTable = HoldEdTable CurWoVal = HoldWoVal GOSUB PrepWo GOSUB RecalcWo END END ELSE MsgInfo = '' MsgInfo = 'Error extracting keys...' MsgInfo = 'H' void = msg( '', MsgInfo ) RETURN 0 END END CASE RETURN * * * * * * * GetRdsKeys: * * * * * * * * called internally only Extract_SI_keys( 'RDS', 'WO', CurWoVal, RdsKeys ) RETURN * * * * * * * CheckWo: * * * * * * * Window = @WINDOW CONVERT @UPPER_CASE TO '' in Window CONVERT @LOWER_CASE TO '' in Window CONVERT '_' TO '' in Window IF Window else Window = 1 END * get current window control names FROM config but load from window CurControl = CurParam Controls = XLATE( 'CONFIG', 'WO_DAILY_SCHED':Window, 1, 'X' ) CCnt = fieldcount( Controls, @VM ) ErrMsg = '' FOR I = 1 TO CCnt TControl = @WINDOW:'.':Controls<1,i> IF TControl = CurControl else IF Get_Property( TControl, 'TEXT' ) = OrigWoVal then * present a message to user Treactor = Controls<1,i> CONVERT @UPPER_CASE TO '' in Treactor CONVERT @LOWER_CASE TO '' in Treactor ErrMsg := 'Reactor ':Treactor:', ' END END NEXT I * now look through all other windows using disk values OPEN 'CONFIG' TO ConfigTable else void = msg( '', 'Unable to OPEN CONFIG table' ) End_Dialog( @WINDOW, '' ) RETURN 0 END i = 1 loop ThisDailyWoId = 'WO_DAILY_SCHED':i IF i = Window then DailyWoRec = 'SkipThisMother' END ELSE READ DailyWoRec FROM ConfigTable, ThisDailyWoId else DailyWoRec = '' END IF DailyWoRec then FOR j = 2 TO 6 ;* for the positions of actual wo# in the config record IF INDEX( DailyWoRec, OrigWoVal, 1 ) then * present a message to user Treactor = DailyWoRec<1,j-1> CONVERT @UPPER_CASE TO '' in Treactor CONVERT @LOWER_CASE TO '' in Treactor ErrMsg := 'Reactor ':Treactor:', ' END next j END END until DailyWoRec = '' i += 1 repeat ErrMsg[-2,2] = '' IF ErrMsg then CONVERT ',' TO @FM in ErrMsg LastOne = fieldcount( ErrMsg, @FM ) IF LastOne > 1 then TWo = ErrMsg TWo = ' and ':TWo ErrMsg = TWo CONVERT @FM TO ',' in ErrMsg END MsgInfo = '' MsgInfo = '!' MsgInfo = quote( OrigWoVal ):' is currently running on ':ErrMsg:'...Please verify that all boxes for Work Order ':quote( OrigWoVal ):' are assigned to reactors before starting a new Work Order.' void = msg( '', MsgInfo ) END RETURN * * * * * * * REACT_MODE: * * * * * * * * CurParam is the current control name Tparam = CurParam WoControl = Tparam SWAP 'RM' with 'RW' in WoControl CurWo = Get_Property( WoControl, 'TEXT' ) SeperateLayer = '' LayPos = INDEX( CurWo, 'LAY', 1 ) IF LayPos then BegPos = LayPos +3 ;* for length of lay SeperateLayer = CurWo[BegPos,'F>'] SWAP '' with '' in CurWo END SWAP '52nd' with '' in CurWo CONVERT @UPPER_CASE TO '' in CurWo CONVERT @LOWER_CASE TO '' in CurWo CONVERT " `~!@#$%^&*()_+-=\][{}|';:/?.>,<" TO '' in CurWo CONVERT '"' TO '' in CurWo Tparam = field( Tparam, '.', 2 ) SWAP 'RM' with '' in Tparam *Tparam is the reactor number Mode = dialog_box( 'REACT_MODE_CHG', @WINDOW, Tparam:'*':CurWo:'*':ForceModechange ) IF Mode <> 'CANCEL' then SWAP 'Down' with 'Down2' in Mode ;* down 2 is bmp for down no material SWAP 'N/A ' with 'NONA' in Mode ;* nona is for not_applicable reactor not in use DosBmp = 'BMPS\':Mode:'.BMP' void = Set_Property( CurParam, 'BITMAP', DosBmp ) END RETURN