COMPILE SUBROUTINE REPORT_GM(Dummy) * General Manager Report - goes straight to Excel * 9/20/2006 John C. Henry, J.C. Henry & Co. Initial coding * 2/13/2009 John C. Henry, J.C. Henry & Co. Changed to use the WO_MAT table rather than the RDS table. DECLARE SUBROUTINE ErrMsg, Btree.Extract, Set_Status, SetInitDirOptions, MAKE.LIST DECLARE FUNCTION Msg, Get_Status, obj_Calendar, Utility, SetInitDirOptions, Dialog_Box, Environment_Services $INSERT RDS_EQU $INSERT WO_MAT_EQUATES $INSERT WM_OUT_EQUATES $INSERT COMPANY_EQU $INSERT MSG_EQUATES EQU ROW$CAPTIVE_QTD TO 2 EQU ROW$MERCHANT_QTD TO 3 EQU ROW$CAPTIVE_FAB2 TO 5 EQU ROW$CAPTIVE_FAB3 TO 6 EQU ROW$CAPTIVE_FAB10 TO 7 EQU ROW$CAPTIVE_FAB11 TO 8 EQU ROW$CAPTIVE_FOUNDRY TO 9 EQU ROW$MERCHANT_BL TO 11 EQU ROW$MERCHANT_BLANKET TO 12 EQU COL$WAFERS_IN TO 2 EQU COL$CUST_PRE_EPI_REJ TO 3 EQU COL$ACTUAL_STARTS TO 4 EQU COL$CUST_POST_EPI_REJ TO 5 EQU COL$FAB_PRE_EPI_REJ TO 6 EQU COL$FAB_POST_EPI_REJ TO 7 EQU COL$PROD_TEST TO 8 EQU COL$ACTUAL_OUTS TO 9 EQU COL$PERIOD TO 11 EQU COL$PERIOD_VALUE TO 12 EQU COL$PERIOD_START TO 13 EQU COL$PERIOD_END TO 14 EQU CRLF$ TO \0D0A\ equ xlTrue to -1 equ xlFalse to 0 equ xlSheetVisible to -1 equ xlRangeAutoFormatSimple to -4154 equ xlRangeAutoFormatClassic1 to 1 equ xlCSV to 6 equ xlTextMSDOS to 21 equ xlCSVWindows to 23 eXcelCols = 'A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,BB,CC,DD,EE,FF,GG,HH,II,JJ,KK,LL' SWAP "','" WITH ',' IN eXcelCols CONVERT ',' TO @VM IN eXcelCols NoteText = 'Select any date in the Fiscal Week of interest.':CRLF$:CRLF$ NoteText := 'The report will calculate the Quarter and Week ' NoteText := 'beginning and ending dates and report on the QTD ' NoteText := 'and the full (Mon - Sun) week the date was in.' DateLabel = 'Date in Fiscal Week:' CutOffDt = Dialog_Box("DIALOG_DATE",@WINDOW,NoteText:@FM:DateLabel) thisCutOffDt = ICONV(CutOffDt,'D4/') IF thisCutOffDt = '' THEN ErrMsg('Invalid Date Entered.') RETURN END CutOffDt = OCONV(thisCutOffDt,'D4/') IF CutOffDt = '' THEN RETURN FWData = obj_Calendar('IRFiscalWeek',CutOffDt) FiscalWeek = FWData[1,@FM] FWStartDt = FWData[COL2()+1,@FM] FWEndDt = FWData[COL2()+1,@FM] FQData = obj_Calendar('IRFiscalQuarter',CutOffDt) FiscalQuarter = FQData<1> FQStartDt = FQData<2> FQEndDt = FQData<3> RowTitles = '' RowTitles<1,ROW$CAPTIVE_QTD> = 'Captive QTD:' RowTitles<1,ROW$MERCHANT_QTD> = 'Merchant QTD:' RowTitles<1,ROW$CAPTIVE_FAB2> = 'Captive (Fab2)' RowTitles<1,ROW$CAPTIVE_FAB3> = 'Captive (Fab3)' RowTitles<1,ROW$CAPTIVE_FAB10> = 'Captive (Fab 10)' RowTitles<1,ROW$CAPTIVE_FAB11> = 'Captive (Fab 11)' RowTitles<1,ROW$CAPTIVE_FOUNDRY> = 'Captive (Foundry)' RowTitles<1,ROW$MERCHANT_BL> = 'Merchant B/L' RowTitles<1,ROW$MERCHANT_BLANKET> = 'Merchant Blanket' DataArray = RowTitles DataArray = 'Wafers In' DataArray = 'Customer Pre-Epi Rejects' DataArray = 'Actual Starts' DataArray = 'Customer Post-Epi Rejects' DataArray = 'IREPI Pre-Epi Rejects' DataArray = 'IREPI Post-Epi Rejects' DataArray = 'Product Test' DataArray = 'Actual Outs' DataArray = 'Fiscal Period' DataArray = '' DataArray = 'Start Date' DataArray = 'End Date' DataArray = 'Week' DataArray = FiscalWeek DataArray = FWStartDt DataArray = FWEndDt DataArray = 'Quarter' DataArray = FiscalQuarter DataArray = FQStartDt DataArray = FQEndDt DataArray = 'Ran At' DataArray = '' DataArray = OCONV(Date(),'D4/') DataArray = OCONV(Time(),'MTH') OPEN 'DICT.WM_OUT' TO DictWMout ELSE ErrMsg('Unable to open "DICT.WM_OUT" for index lookup') RETURN END OPEN 'DICT.WO_MAT' TO @DICT ELSE ErrMsg('Unable to open "DICT.WO_MAT" for index lookup') RETURN END OPEN 'WO_MAT' TO WOMatTable ELSE ErrMsg('Unable to open "WO_MAT" table') RETURN END /* OPEN 'DICT.RDS' TO @DICT ELSE ErrMsg('Unable to open "DICT.RDS" for index lookup') RETURN END OPEN 'RDS' TO RDSTable ELSE ErrMsg('Unable to open "RDS" table') RETURN END */ * Fudge the dates - '~' is not inclusive of the end dates StartDt = ICONV(FQStartDt,'D') - 1 EndDt = ICONV(FWEndDt,'D') + 1 SearchString = 'DATE_OUT':@VM:OConv(StartDt, 'D4/'):'~':OConv(EndDt, 'D4/'):@FM RDSKeys = '' Option = '' Flag = '' WMOutKeys = '' SearchString = 'SUP_VER_SIG_DT':@VM:OConv(StartDt, 'D4/'):'~':OConv(EndDt, 'D4/'):@FM Set_Status(0) Btree.Extract(SearchString, 'WM_OUT', DictWMOut, WMOutKeys, Option, Flag) IF Get_Status(errCode) THEN ErrMsg(errCode) END KeyCnt = COUNT(WMOutKeys,@VM) + (WMOutKeys NE '') WOMatKeys = '' FOR I = 1 TO KeyCnt WMOutKey = WMOutKEys<1,I> WOMatKeys<1,I> = WMOutKey[1,'*']:'*':WMOutKey[-1,'B*'] NEXT I SearchString = 'RDS_FINAL_SIG_DT':@VM:OConv(StartDt, 'D4/'):'~':OConv(EndDt, 'D4/'):@FM Set_Status(0) Btree.Extract(SearchString, 'WO_MAT', @DICT, SelWOMatKeys, Option, Flag) IF Get_Status(errCode) THEN ErrMsg(errCode) END WOMatKeys := @VM:SelWOMatKeys /* * Dead 2/13/2009 Def = "" Def = "Selecting RDS records..." Def = "U" MsgUp = Msg(@window, Def) ;* display the processing message Set_Status(0) Btree.Extract(SearchString, 'RDS', @DICT, RDSKeys, Option, Flag) Msg(@WINDOW, MsgUp) IF Get_Status(errCode) THEN ErrMsg(errCode) RETURN END IF RDSKeys = '' THEN ErrMsg('No RDS Records found for the current quarter!') RETURN END */ WOMatCnt = COUNT(WOMatKeys,@VM) + (WOMatKeys NE '') LoopCnt = 0 Def = "" Def = "Building Report..." Def = "GC" Def = WOMatCnt Def = 600 MsgUp = Msg(@WINDOW, Def) LOOP @ID = WOMatKeys[1,@VM] WOMatKeys[1,COL2()] = '' LoopCnt += 1 READ @RECORD FROM WOMatTable,@ID THEN WafersIn = {REP_SCH_QTY} IF WafersIn = '' OR WafersIn = 0 ELSE CustPreEpiRej = {CUST_PRE_EPI_REJ} ;* This is the total for the RDS CustPostEpiRej = {CUST_POST_EPI_REJ} FabPreEpiRej = {LSL_PRE_EPI_REJ} FabPostEpiRej = {LSL_POST_EPI_REJ} ProdTest = {REP_TW_PROD} WaferSize = {WAFER_INCHES} ActualStarts = WafersIn - CustPreEpiRej - CustPostEpiRej - ProdTest ActualOuts = ActualStarts - FabPreEpiRej - FabPostEpiRej CustNo = {CUST_NO} Captive = {CAPTIVE} CustReportExclude = XLATE('COMPANY',CustNo,COMPANY_REPORT_EXCLUDE$,'X') Product = {PRODUCT} IF @RECORD = '' THEN FinalSigDTM = @RECORD[-1,'B':@VM] DateOut = OCONV(FinalSigDTM[1,'.'],'D4/') END ELSE FinalSigDTM = XLATE('WM_OUT',@RECORD,WM_OUT_SUP_VER_SIG_DTM$,'X') DateOut = OCONV(FinalSigDTM[1,'.'],'D4/') END RDSFiscalWeek = obj_Calendar('IRFiscalWeek',DateOut)<1> ;* 2nd and 3rd fields are the start and end dates of the week IF NOT(CustReportExclude) THEN BEGIN CASE CASE Captive AND CustNo = '6593' QTDRow = ROW$CAPTIVE_QTD WeekRow = ROW$CAPTIVE_FAB2 CASE Captive AND CustNo = '408' QTDRow = ROW$CAPTIVE_QTD WeekRow = ROW$CAPTIVE_FAB3 CASE Captive AND CustNo = '6874' QTDRow = ROW$CAPTIVE_QTD IF WaferSize[1,' '] = '8' THEN WeekRow = ROW$CAPTIVE_FAB11 END ELSE WeekRow = ROW$CAPTIVE_FAB10 END CASE Captive QTDRow = ROW$CAPTIVE_QTD WeekRow = ROW$CAPTIVE_FOUNDRY CASE NOT(Captive) AND Product = '041-B/L' QTDRow = ROW$MERCHANT_QTD WeekRow = ROW$MERCHANT_BL CASE NOT(Captive) AND Product = '044-Blanket' QTDRow = ROW$MERCHANT_QTD WeekRow = ROW$MERCHANT_BLANKET CASE 1 QTDRow = '' WeekRow = '' END CASE IF QTDRow NE '' THEN DataArray = DataArray + WafersIn DataArray = DataArray + CustPreEpiRej DataArray = DataArray + ActualStarts DataArray = DataArray + CustPostEpiRej DataArray = DataArray + FabPreEpiRej DataArray = DataArray + FabPostEpiRej DataArray = DataArray + ProdTest DataArray = DataArray + ActualOuts END IF WeekRow NE '' AND RDSFiscalWeek = FiscalWeek THEN DataArray = DataArray + WafersIn DataArray = DataArray + CustPreEpiRej DataArray = DataArray + ActualStarts DataArray = DataArray + CustPostEpiRej DataArray = DataArray + FabPreEpiRej DataArray = DataArray + FabPostEpiRej DataArray = DataArray + ProdTest DataArray = DataArray + ActualOuts END END ;* End of check for Report Exclude flag on customer END ;* End of check for WafersIn END ;* End of WO_Mat Record read Running = Msg(@WINDOW, MsgUp, LoopCnt, MSGINSTUPDATE$) UNTIL WOMatKeys = '' OR NOT(Running) REPEAT /* * Dead on 2/13/2009 JCH RDSCnt = COUNT(RDSKeys,@VM) + (RDSKeys NE '') LoopCnt = 0 Def = "" Def = "Building Report..." Def = "GC" Def = RDSCnt Def = 600 MsgUp = Msg(@WINDOW, Def) LOOP @ID = RDSKeys[1,@VM] RDSKeys[1,COL2()] = '' LoopCnt += 1 READ @RECORD FROM RDSTable,@ID THEN WafersIn = {WAFERS_IN} IF WafersIn = '' OR WafersIn = 0 ELSE CustPreEpiRej = {CUST_PRE_EPI_REJ} ;* This is the total for the RDS CustPostEpiRej = {CUST_POST_EPI_REJ} FabPreEpiRej = {LSL_PRE_EPI_REJ} FabPostEpiRej = {LSL_POST_EPI_REJ} ProdTest = {TW_PROD} WaferSize = {WAFER_INCHES} ActualStarts = WafersIn - CustPreEpiRej - CustPostEpiRej - ProdTest ActualOuts = ActualStarts - FabPreEpiRej - FabPostEpiRej CustNo = @RECORD Captive = {CUST_CAPTIVE} CustReportExclude = XLATE('COMPANY',CustNo,COMPANY_REPORT_EXCLUDE$,'X') Product = {PRODUCT} DateOut = OCONV({DATE_OUT},'D4/') RDSFiscalWeek = obj_Calendar('IRFiscalWeek',DateOut)<1> ;* 2nd and 3rd fields are the start and end dates of the week IF NOT(CustReportExclude) THEN BEGIN CASE CASE Captive AND CustNo = '6593' QTDRow = ROW$CAPTIVE_QTD WeekRow = ROW$CAPTIVE_FAB2 CASE Captive AND CustNo = '408' QTDRow = ROW$CAPTIVE_QTD WeekRow = ROW$CAPTIVE_FAB3 CASE Captive AND CustNo = '6874' QTDRow = ROW$CAPTIVE_QTD IF WaferSize[1,' '] = '8' THEN WeekRow = ROW$CAPTIVE_FAB11 END ELSE WeekRow = ROW$CAPTIVE_FAB10 END CASE Captive QTDRow = ROW$CAPTIVE_QTD WeekRow = ROW$CAPTIVE_FOUNDRY CASE NOT(Captive) AND Product = '041-B/L' QTDRow = ROW$MERCHANT_QTD WeekRow = ROW$MERCHANT_BL CASE NOT(Captive) AND Product = '044-Blanket' QTDRow = ROW$MERCHANT_QTD WeekRow = ROW$MERCHANT_BLANKET CASE 1 QTDRow = '' WeekRow = '' END CASE IF QTDRow NE '' THEN DataArray = DataArray + WafersIn DataArray = DataArray + CustPreEpiRej DataArray = DataArray + ActualStarts DataArray = DataArray + CustPostEpiRej DataArray = DataArray + FabPreEpiRej DataArray = DataArray + FabPostEpiRej DataArray = DataArray + ProdTest DataArray = DataArray + ActualOuts END IF WeekRow NE '' AND RDSFiscalWeek = FiscalWeek THEN DataArray = DataArray + WafersIn DataArray = DataArray + CustPreEpiRej DataArray = DataArray + ActualStarts DataArray = DataArray + CustPostEpiRej DataArray = DataArray + FabPreEpiRej DataArray = DataArray + FabPostEpiRej DataArray = DataArray + ProdTest DataArray = DataArray + ActualOuts END END ;* End of check for Report Exclude flag on customer END ;* End of check for WafersIn END ;* End of RDS Record read Running = Msg(@WINDOW, MsgUp, LoopCnt, MSGINSTUPDATE$) UNTIL RDSKeys = '' OR NOT(Running) REPEAT */ Msg(@WINDOW,MsgUp) xlApp = OleCreateInstance("excel.Application") OlePutProperty(XlApp, 'Visible', xlSheetVisible) if OleStatus() then Goto HadError xlWorkBooks =OleGetProperty(xlApp, "Workbooks") xlWkb = OleCallMethod(xlWorkbooks,"Add") if OleStatus() then Goto HadError xlSht = OleGetProperty(xlWkb, "Worksheets",1) if OleStatus() then Goto HadError ColCnt = COUNT(DataArray,@FM) + (DataArray NE '') LineCnt = COUNT(DataArray<1>,@VM) + (DataArray<1> NE '') FOR LineNo = 1 TO LineCnt FOR Column = 1 to ColCnt RangeColumn = eXcelCols<1,Column> range = OleGetProperty( xlSht, 'Range',RangeColumn:LineNo) OlePutProperty(range, 'Value', DataArray) IF OleStatus() THEN GOTO HadError NEXT Column NEXT LineCnt range = OleGetProperty( xlSht, 'Range','B1:':RangeColumn:'1') OlePutProperty( range, 'WrapText', xlTrue) IF OleStatus() THEN GOTO HadError RangeColumn = eXcelCols<1,ColCnt> range = OleGetProperty( xlSht, 'Range','A1:':RangeColumn:LineCnt) Void = OleCallMethod( range, 'AutoFormat', xlRangeAutoFormatClassic1 ) * Void = OleCallMethod( xlWkb, 'SaveAs','C:\OIReports\GM Report1.CSV', xlCSVWindows ) Void = OleCallMethod( xlWkb, 'SaveAs',Environment_Services('GetReportsRootPath') : '\GM Report1.CSV', xlCSVWindows ) IF OleStatus() THEN GOTO HadError RETURN * * * * * * * HadError: * * * * * * * debug xlChart = '' Charts = '' range = '' xlSht = '' xlWkb='' xlWorkBooks = '' x = OleCallMethod(xlApp, 'Quit') RETURN /* end of code */