* EES * Project Analysis * CJR - June 2010 * $INSERT ICEMATE_COMMON OLE_TABLE=@WINDOW:".OLE_TABLE" COMMON /PROJECT_ANALYSIS/ ColumnList, ColumnTotals BEGIN CASE CASE MESSAGE="CREATE" ;GOSUB CREATE CASE MESSAGE="VIEW_CODE" ;GOSUB VIEW_CODE CASE MESSAGE="CLOSE" ;GOSUB CLOSE CASE MESSAGE="OK" ;GOSUB OK CASE MESSAGE="SAVEAS" ;GOSUB OK CASE MESSAGE="CANCEL" ;GOSUB CANCEL CASE MESSAGE="DELETE" ;GOSUB DELETE CASE MESSAGE="DISPLAY" ;GOSUB DISPLAY CASE MESSAGE="PROPERTIES" ;GOSUB PROPERTIES CASE MESSAGE="TOGGLE_PREVIEW" ;GOSUB TOGGLE_PREVIEW CASE MESSAGE="COLLAPSE" ;GOSUB COLLAPSE CASE MESSAGE="EXPAND" ;GOSUB EXPAND CASE MESSAGE="PRINT" ;GOSUB REPORT CASE MESSAGE="EXPORT" ;GOSUB REPORT END CASE RETURN 1 CREATE: CALL UTILITY("CURSOR","H") Buttons="" Buttons<1,-1>=1 ;Buttons<2,-1>="BUTTON_OK" ;Buttons<3,-1>="Save|View" ;Buttons<5,-1>="Save View" Buttons<1,-1>=1 ;Buttons<2,-1>="BUTTON_SAVEAS" ;Buttons<3,-1>="Save As" ;Buttons<5,-1>="Save As..." Buttons<1,-1>=16 ;Buttons<2,-1>="BUTTON_CANCEL" ;Buttons<3,-1>="Cancel" ;Buttons<5,-1>="Cancel View" Buttons<1,-1>=25 ;Buttons<2,-1>="BUTTON_DELETE" ;Buttons<3,-1>="Delete|View" ;Buttons<5,-1>="Delete View" Buttons<1,-1>=0 ;Buttons<2,-1>="SPACE_1" ;Buttons<3,-1>=" " ;Buttons<5,-1>=" " Buttons<1,-1>=48 ;Buttons<2,-1>="BUTTON_DISPLAY" ;Buttons<3,-1>="Refresh|Display" ;Buttons<5,-1>="Refresh Display" Buttons<1,-1>=34 ;Buttons<2,-1>="BUTTON_PROPERTIES" ;Buttons<3,-1>="Item|Properties" ;Buttons<5,-1>="Item Properties" Buttons<1,-1>=42 ;Buttons<2,-1>="BUTTON_PREVIEW" ;Buttons<3,-1>="Toggle|Preview" ;Buttons<5,-1>="Toggle Preview" Buttons<1,-1>=13 ;Buttons<2,-1>="BUTTON_COLLAPSE" ;Buttons<3,-1>="Collapse" ;Buttons<5,-1>="Collapse" Buttons<1,-1>=12 ;Buttons<2,-1>="BUTTON_EXPAND" ;Buttons<3,-1>="Expand" ;Buttons<5,-1>="Expand" Buttons<1,-1>=0 ;Buttons<2,-1>="SPACE_2" ;Buttons<3,-1>=" " ;Buttons<5,-1>=" " Buttons<1,-1>=4 ;Buttons<2,-1>="BUTTON_PRINT" ;Buttons<3,-1>="Print|Report" ;Buttons<5,-1>="Print Report" Buttons<1,-1>=9 ;Buttons<2,-1>="BUTTON_EXCEL" ;Buttons<3,-1>="Export|Excel" ;Buttons<5,-1>="Export to Excel" Qualifier=1:@FM:"2*ICEMATE*OLE*":OLE_TABLE Call Send_Message(OLE_TABLE,"QUALIFY_EVENT","ALL_OLES",Qualifier) VIEW_ITEM="" GOSUB CANCEL GOSUB VIEW_LIST .VIEW_CODE->TEXT="DEFAULT" GOSUB CREATE_VIEW CALL SET_WINDOW(@WINDOW,"C","",Buttons) RETURN VIEW_LIST: LIST="DEFAULT" EOF=0 SELECT VIEWS LOOP UNTIL EOF DO READNEXT VIEW_ID THEN IF FIELD(VIEW_ID,"*",1)="PSUM" THEN CODE=FIELD(VIEW_ID,"*",2) LOCATE CODE IN LIST USING @FM SETTING TEMP ELSE LIST<-1>=CODE END END ELSE EOF=1 REPEAT .VIEW_CODE->LIST=LIST RETURN VIEW_CODE: VIEW_CODE=.VIEW_CODE->TEXT OrigCode=.VIEW_CODE->GOTFOCUS_VALUE IF VIEW_CODE=OrigCode THEN RETURN VIEW_ID="PSUM*":VIEW_CODE READ VIEW_ITEM FROM VIEWS,VIEW_ID ELSE VIEW_ITEM="" .VIEW_DESC->TEXT=VIEW_ITEM<1> .VIEW_CODE->GOTFOCUS_VALUE=VIEW_CODE .BUTTON_OK->ENABLED=1 .BUTTON_CANCEL->ENABLED=1 .BUTTON_DELETE->ENABLED=1 GOSUB CREATE_VIEW RETURN CLOSE: CALL STD_SUBROUTINES("SAVE_SCREENPOS","","") RETURN OK: IF MESSAGE="SAVEAS" THEN STD_SAVEAS="" CALL DIALOG_BOX("STD_SAVE_AS",@WINDOW,"PROJECT_SUMMARY":@FM:20) IF STD_SAVEAS="" THEN RETURN VIEW_CODE=STD_SAVEAS MESSAGE="OK" END ELSE VIEW_CODE=.VIEW_CODE->TEXT END ColumnOrder=Get_Property(OLE_TABLE,"OLE.ColumnOrder") CONVERT @FM TO @VM IN ColumnOrder ColumnList =Get_Property(OLE_TABLE,"OLE.ColumnList") ColumnList =SRP_Rotate_Array(ColumnList) GroupOrder=Get_Property(OLE_TABLE,"OLE.GroupOrder") CONVERT @FM TO @VM IN GroupOrder VIEW_ID="PSUM*":VIEW_CODE VIEW_ITEM="" VIEW_ITEM<1>=.VIEW_DESC->TEXT VIEW_ITEM<2>="" VIEW_ITEM<3>=GroupOrder VIEW_ITEM<11>=ColumnList<1> VIEW_ITEM<12>=ColumnList<3> VIEW_ITEM<13>=ColumnList<8> FOR I=1 TO DCOUNT(ColumnList<1>,@VM) ColPos=Get_Property(OLE_TABLE,"OLE.ColumnPosition[":I:"]") VIEW_ITEM<2,-1>=ColPos NEXT I CALL FILE_UPDATE(VIEWS,VIEW_ID,VIEW_ITEM,"W","") GOSUB VIEW_LIST IF MESSAGE="OK" THEN .VIEW_CODE->TEXT=VIEW_CODE END ELSE GOSUB CANCEL END RETURN CANCEL: VIEW_CODE="DEFAULT" VIEW_ID="PSUM*":VIEW_CODE READ VIEW_ITEM FROM VIEWS,VIEW_ID ELSE VIEW_ITEM="" .VIEW_DESC->TEXT=VIEW_ITEM<1> .VIEW_CODE->TEXT=VIEW_CODE .VIEW_CODE->GOTFOCUS_VALUE=VIEW_CODE GOSUB CREATE_VIEW RETURN DELETE: VIEW_CODE=.VIEW_CODE->TEXT TYPE="YN" CALL BUILD_MSG(@WINDOW,"OK to delete view?",TYPE) IF TYPE<2>=1 THEN VIEW_ID="PSUM*":VIEW_CODE CALL FILE_UPDATE(VIEWS,VIEW_ID,"","D","") GOSUB VIEW_LIST GOSUB CANCEL END RETURN CREATE_VIEW: ColumnList="" ColumnList<-1>="Id" :@VM:"Number" :@VM:"50" :@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:@VM:"Left":@VM:@VM:"#" ColumnList<-1>="Group" :@VM:"Text" :@VM:"100":@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:@VM:"Left" ColumnList<-1>="Process" :@VM:"Text" :@VM:"120":@VM:0:@VM:1:@VM:0:@VM:1:@VM:1:@VM:@VM:"Left" ColumnList<-1>="Process Description" :@VM:"Text" :@VM:"200":@VM:0:@VM:1:@VM:0:@VM:1:@VM:1:@VM:@VM:"Left" ColumnList<-1>="Process Code/Description" :@VM:"Text" :@VM:"200":@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:@VM:"Left" ColumnList<-1>="Element" :@VM:"Text" :@VM:"100":@VM:0:@VM:1:@VM:0:@VM:1:@VM:1:@VM:@VM:"Left" ColumnList<-1>="Element Description" :@VM:"Text" :@VM:"200":@VM:0:@VM:1:@VM:0:@VM:1:@VM:1:@VM:@VM:"Left" ColumnList<-1>="Element Code/Description" :@VM:"Text" :@VM:"200":@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:@VM:"Left" ColumnList<-1>="Element Trade" :@VM:"Text" :@VM:"100":@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:@VM:"Left" ColumnList<-1>="Main Heading" :@VM:"Text" :@VM:"200":@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:@VM:"Left" ColumnList<-1>="Sub Heading 1" :@VM:"Text" :@VM:"200":@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:@VM:"Left" ColumnList<-1>="Sub Heading 2" :@VM:"Text" :@VM:"200":@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:@VM:"Left" ColumnList<-1>="Sub Heading 3" :@VM:"Text" :@VM:"200":@VM:0:@VM:1:@VM:0:@VM:1:@VM:0:@VM:@VM:"Left" ColumnList<-1>="Item Description" :@VM:"Text" :@VM:"200":@VM:1:@VM:1:@VM:0:@VM:1:@VM:0:@VM:@VM:"Left" ColumnList<-1>="Unit" :@VM:"Text" :@VM:"70" :@VM:1:@VM:1:@VM:0:@VM:1:@VM:1:@VM:@VM:"Center" ColumnList<-1>="Quantity" :@VM:"Number" :@VM:"70" :@VM:1:@VM:1:@VM:0:@VM:1:@VM:1:@VM:@VM:"Right":@VM:@VM:"#.000" ColumnList<-1>="Estimated Rate" :@VM:"Number" :@VM:"100":@VM:0:@VM:1:@VM:0:@VM:1:@VM:1:@VM:@VM:"Right":@VM:@VM:"#,##0.00" ColumnList<-1>="Estimated Price" :@VM:"Number" :@VM:"100":@VM:0:@VM:1:@VM:0:@VM:1:@VM:1:@VM:@VM:"Right":@VM:@VM:"#,##0.00" IF CARBON_MODULE THEN ColumnList<-1>="Carbon Mass" :@VM:"Number" :@VM:"100":@VM:0:@VM:1:@VM:0:@VM:1:@VM:1:@VM:@VM:"Right":@VM:@VM:"#,##0.0000" ColumnList<-1>="Carbon Price" :@VM:"Number" :@VM:"100":@VM:0:@VM:1:@VM:0:@VM:1:@VM:1:@VM:@VM:"Right":@VM:@VM:"#,##0.0000" END ColumnList<-1>="Complete Description" :@VM:"Preview" :@VM:"0" :@VM:1:@VM:0:@VM:0:@VM:0:@VM:1 LAST_AQ=PROJECT_ITEM<45> IF LAST_AQ THEN ColumnList<1,8>=1 END ELSE .BUTTON_PROPERTIES->ENABLED=0 .BUTTON_PREVIEW->ENABLED=0 END IF VIEW_ITEM THEN For Column=1 TO DCOUNT(ColumnList,@FM) ColName=ColumnList Width =ColumnList Visible=0 LOCATE ColName IN VIEW_ITEM<11> USING @VM SETTING POS THEN Width =VIEW_ITEM<12,POS> Visible=VIEW_ITEM<13,POS> ColumnList=Width ColumnList=Visible END NEXT Column END GroupOrder=VIEW_ITEM<3> CONVERT @VM TO @FM IN GroupOrder ColumnTotals="" For Column=1 TO DCOUNT(ColumnList,@FM) ColName=ColumnList BEGIN CASE CASE ColName="Estimated Price" ;ColumnTotals<-1>=Column CASE ColName="Carbon Mass" ;ColumnTotals<-1>=Column CASE ColName="Carbon Price" ;ColumnTotals<-1>=Column END CASE NEXT Column BackColour="PowderBlue" CALL Set_Property(OLE_TABLE,"OLE.ColumnList",ColumnList) CALL Set_Property(OLE_TABLE,"OLE.SortOrder",GroupOrder) CALL Set_Property(OLE_TABLE,"OLE.GroupPanelVisible",1) CALL Set_Property(OLE_TABLE,"OLE.GroupOrder",GroupOrder) CALL Set_Property(OLE_TABLE,"OLE.GroupRowsShaded",1) CALL Set_Property(OLE_TABLE,"OLE.FooterVisible",1) CALL Set_Property(OLE_TABLE,"OLE.HeaderVisible",1) CALL Set_Property(OLE_TABLE,"OLE.PreviewMode",1) CALL Set_Property(OLE_TABLE,"OLE.MultiSelect",1) CALL Set_Property(OLE_TABLE,"OLE.VerticalGridStyle","Solid") CALL Set_Property(OLE_TABLE,"OLE.HorizontalGridStyle","DotSmall") CALL Set_Property(OLE_TABLE,"OLE.HorizontalScroll",1) CALL Set_Property(OLE_TABLE,"OLE.BackColor",BackColour) CALL Set_Property(OLE_TABLE,"OLE.GroupRowContextMenuEnabled",0) CALL Set_Property(OLE_TABLE,"OLE.PreviewMode",0) IF VIEW_ITEM<2> THEN ColumnOrder=VIEW_ITEM<2> FOR I=1 TO DCOUNT(ColumnOrder,@VM) Position=ColumnOrder<1,I> CALL Send_Message(OLE_TABLE,"OLE.MoveColumn",I,Position) NEXT I END For I=1 TO DCOUNT(ColumnTotals,@FM) Col=ColumnTotals CALL Set_Property(OLE_TABLE,"OLE.ColumnFormula[":Col:"]","SUM") CALL Set_Property(OLE_TABLE,"OLE.ColumnFooterAlignment[":Col:"]","R") NEXT I RETURN DISPLAY: CALL UTILITY("CURSOR","H") ColAQID=0 ColGroup=0 ColProcess=0 ColProcessDesc=0 ColProcessCodeDesc=0 ColElement=0 ColElementDesc=0 ColElementCodeDesc=0 ColElementTrade=0 ColMH=0 ColSH1=0 ColSH2=0 ColSH3=0 ColFD=0 ColDesc=0 ColUnit=0 ColQuantity=0 ColEstRate=0 ColEstPrice=0 ColCarbMass=0 ColCarbPrice=0 ColComplete=0 ColumnList=Get_Property(OLE_TABLE,"OLE.ColumnList") FOR Column=1 TO DCOUNT(ColumnList,@FM) ColName=ColumnList BEGIN CASE CASE ColName="Id" ;ColAQID=Column CASE ColName="Group" ;ColGroup=Column CASE ColName="Process" ;ColProcess=Column CASE ColName="Process Description" ;ColProcessDesc=Column CASE ColName="Process Code/Description" ;ColProcessCodeDesc=Column CASE ColName="Element" ;ColElement=Column CASE ColName="Element Description" ;ColElementDesc=Column CASE ColName="Element Code/Description" ;ColElementCodeDesc=Column CASE ColName="Element Trade" ;ColElementTrade=Column CASE ColName="Main Heading" ;ColMH=Column CASE ColName="Sub Heading 1" ;ColSH1=Column CASE ColName="Sub Heading 2" ;ColSH2=Column CASE ColName="Sub Heading 3" ;ColSH3=Column CASE ColName="Item Description" ;ColFD=Column CASE ColName="Unit" ;ColUnit=Column CASE ColName="Quantity" ;ColQuantity=Column CASE ColName="Estimated Rate" ;ColEstRate=Column CASE ColName="Estimated Price" ;ColEstPrice=Column CASE ColName="Carbon Mass" ;ColCarbMass=Column CASE ColName="Carbon Price" ;ColCarbPrice=Column CASE ColName="Complete Description" ;ColComplete=Column END CASE NEXT Column CALL Set_Property(OLE_TABLE,"OLE.List","") ARRAY="" GOSUB BUILD_TABLE CALL Set_Property(OLE_TABLE,"OLE.List",Array) CALL UTILITY("CURSOR","A") RETURN BUILD_TABLE: ProjCode=PROJECT_CODE ProjItem=PROJECT_ITEM CALL PROCESS_STRUCTURE(ProjCode,ProjItem,ProcessStructure) ProcessList="" FOR APOS=1 TO COUNT(ProcessStructure<1>,@VM)+1 FOR GPOS=1 TO DCOUNT(ProcessStructure<3,APOS>,@SVM) DATA=ProcessStructure<5,APOS,GPOS> CONVERT @TM:@STM:"," TO @FM:@VM:@SVM IN DATA FOR PPOS=1 TO DCOUNT(DATA<1>,@VM) ProcessCode=DATA<1,PPOS> ProcessList<1,-1>=ProcessCode FOR CPOS=1 TO DCOUNT(DATA<3,PPOS>,@SVM) ProcessCode=DATA<3,PPOS,CPOS> ProcessList<1,-1>=ProcessCode NEXT CPOS NEXT PPOS NEXT GPOS NEXT APOS NO_PROCESSES=DCOUNT(ProcessList,@VM) CREATEPARAM="" CREATEPARAM<1,4>=1 CREATEPARAM<1,5>=0 CALL CREATE_DIALOG("STD_PROCESS",@WINDOW,0,CREATEPARAM) ITEM_COUNT=0 STD_PROCESS=0 PCENT_PROCESSED=0 TOTAL_ITEMS=NO_PROCESSES STD_PROCESS.STATUS->TEXT="Calculating" VALUES="" FOR J=1 TO NO_PROCESSES ProcessCode=ProcessList<1,J> LOCATE ProcessCode IN ProjItem<50> USING @VM SETTING POS THEN ProcessCost=ProjItem<51,POS> END ELSE ProcessCost="" END PP_ID=ProjCode:"*":ProcessCode CP_ID=ProjCode:"*":ProcessCode PY_ID=ProjCode:"*":ProcessCode READ PP_ITEM FROM PROJECT_PARTS,PP_ID ELSE PP_ITEM="" READ CP_ITEM FROM COST_PLANS,CP_ID ELSE CP_ITEM="" READ PY_ITEM FROM PROJECT_YARDSTICKS,PY_ID ELSE PY_ITEM="" ProcessDesc =PP_ITEM<1> ProcessGroup=PP_ITEM<9> ProcessMass =PP_ITEM<102> ProcessCarb =PP_ITEM<104> CONVERT @LOWER_CASE TO @UPPER_CASE IN ProcessDesc IF COUNT(ProcessDesc,"(FOR INFORMATION ONLY)") THEN ProcessCost=0 IF PP_ITEM<84> THEN ProcessCost=0 IF PP_ITEM<85> THEN GOTO SKIP_PROCESS NO_ELEMENTS=DCOUNT(CP_ITEM<5>,@VM) IF CP_ITEM="" THEN LINE="" IF ColAQID THEN LINE<1,ColAQID> ="" IF ColGroup THEN LINE<1,ColGroup> =ProcessGroup IF ColProcess THEN LINE<1,ColProcess> =ProcessCode IF ColProcessDesc THEN LINE<1,ColProcessDesc> =ProcessDesc IF ColProcessCodeDesc THEN LINE<1,ColProcessCodeDesc> =ProcessCode:" - ":ProcessDesc IF ColUnit THEN LINE<1,ColUnit> =PP_ITEM<4> IF ColQuantity THEN LINE<1,ColQuantity> =OCONV(PY_ITEM<17>,"MD34") IF ColElement THEN LINE<1,ColElement> ="" IF ColElementDesc THEN LINE<1,ColElementDesc> ="" IF ColElementCodeDesc THEN LINE<1,ColElementCodeDesc> ="" IF ColElementTrade THEN LINE<1,ColElementCodeDesc> ="" IF ColEstRate THEN LINE<1,ColEstRate> ="" IF ColEstPrice THEN LINE<1,ColEstPrice> =OCONV(ProcessCost,"MD24") IF ColCarbMass THEN LINE<1,ColCarbMass> =OCONV(ProcessMass,"MD48") IF ColCarbPrice THEN LINE<1,ColCarbPrice> =OCONV(ProcessCarb,"MD48") IF ColComplete THEN LINE<1,ColComplete> ="" ARRAY<-1>=LINE END ELSE FOR D=1 TO NO_ELEMENTS ElemCode=CP_ITEM<5,D> ElemQty =CP_ITEM<6,D> ElemCost=CP_ITEM<8,D> ElemMass=CP_ITEM<12,D> ElemCarb=CP_ITEM<14,D> CPD_ID=ProjCode:"*":ProcessCode:"*":ElemCode READ CPD_ITEM FROM COST_PLAN_DIMS,CPD_ID ELSE CPD_ITEM="" ElementTrade=CPD_ITEM<42> ElemCode=FIELD(ElemCode,InstanceDelim,1) ELEM_ID=ELEM_SET:"*":ElemCode READ ELEM_ITEM FROM ELEMENTS,ELEM_ID ELSE ELEM_ITEM="" IF ElementTrade="" THEN ElementTrade=ELEM_ITEM<26> AQI_ID=ProjCode:"*":ProcessCode:"*":ElemCode READ INDEX_ITEM FROM AQ_INDEX,AQI_ID ELSE INDEX_ITEM="" IF INDEX_ITEM<1>="" THEN LINE="" IF ColAQID THEN LINE<1,ColAQID> ="" IF ColGroup THEN LINE<1,ColGroup> =ProcessGroup IF ColProcess THEN LINE<1,ColProcess> =ProcessCode IF ColProcessDesc THEN LINE<1,ColProcessDesc> =ProcessDesc IF ColProcessCodeDesc THEN LINE<1,ColProcessCodeDesc> =ProcessCode:" - ":ProcessDesc IF ColUnit THEN LINE<1,ColUnit> =ELEM_ITEM<3> IF ColQuantity THEN LINE<1,ColQuantity> =OCONV(ElemQty,"MD34") IF ColElement THEN LINE<1,ColElement> =ElemCode IF ColElementDesc THEN LINE<1,ColElementDesc> =ELEM_ITEM<1> IF ColElementCodeDesc THEN LINE<1,ColElementCodeDesc> =ElemCode:" - ":ELEM_ITEM<1> IF ColElementTrade THEN LINE<1,ColElementTrade> =ElementTrade IF ColEstRate THEN LINE<1,ColEstRate> ="" IF ColEstPrice THEN LINE<1,ColEstPrice> =OCONV(ElemCost,"MD24") IF ColCarbMass THEN LINE<1,ColCarbMass> =OCONV(ElemMass,"MD48") IF ColCarbPrice THEN LINE<1,ColCarbPrice> =OCONV(ElemCarb,"MD48") IF ColComplete THEN LINE<1,ColComplete> ="" ARRAY<-1>=LINE END ELSE NO_AQS=COUNT(INDEX_ITEM<1>,@VM)+1 FOR A=1 TO NO_AQS AQ_NUM=INDEX_ITEM<1,A> IF ReverseID THEN AQ_ID=AQ_NUM:"*":ProjCode END ELSE AQ_ID=ProjCode:"*":AQ_NUM END READ AQ_ITEM FROM AQ,AQ_ID ELSE AQ_ITEM="" IF AQ_ITEM<11> THEN FULL_DESC="" IF AQ_ITEM<5> THEN FULL_DESC<-1>=AQ_ITEM<5> IF AQ_ITEM<6> THEN FULL_DESC<-1>=AQ_ITEM<6> IF AQ_ITEM<7> THEN FULL_DESC<-1>=AQ_ITEM<7> IF AQ_ITEM<8> THEN FULL_DESC<-1>=AQ_ITEM<8> IF AQ_ITEM<9> THEN FULL_DESC<-1>=AQ_ITEM<9> SWAP @FM WITH @TM IN FULL_DESC LINE="" IF ColAQID THEN LINE<1,ColAQID> =AQ_NUM IF ColGroup THEN LINE<1,ColGroup> =ProcessGroup IF ColProcess THEN LINE<1,ColProcess> =ProcessCode IF ColProcessDesc THEN LINE<1,ColProcessDesc> =ProcessDesc IF ColProcessCodeDesc THEN LINE<1,ColProcessCodeDesc> =ProcessCode:" - ":ProcessDesc IF ColUnit THEN LINE<1,ColUnit> =AQ_ITEM<10> IF ColQuantity THEN LINE<1,ColQuantity> =OCONV(AQ_ITEM<11>,"MD34") IF ColElement THEN LINE<1,ColElement> =ElemCode IF ColElementDesc THEN LINE<1,ColElementDesc> =ELEM_ITEM<1> IF ColElementCodeDesc THEN LINE<1,ColElementCodeDesc> =ElemCode:" - ":ELEM_ITEM<1> IF ColElementTrade THEN LINE<1,ColElementTrade> =ElementTrade IF ColMH THEN LINE<1,ColMH> =AQ_ITEM<5> IF ColSH1 THEN LINE<1,ColSH1> =AQ_ITEM<6> IF ColSH2 THEN LINE<1,ColSH2> =AQ_ITEM<7> IF ColSH3 THEN LINE<1,ColSH3> =AQ_ITEM<8> IF ColFD THEN LINE<1,ColFD> =AQ_ITEM<9> IF ColEstRate THEN LINE<1,ColEstRate> =OCONV(AQ_ITEM<12>,"MD24") IF ColEstPrice THEN LINE<1,ColEstPrice> =OCONV(AQ_ITEM<13>,"MD24") IF ColCarbMass THEN LINE<1,ColCarbMass> =OCONV(AQ_ITEM<71>,"MD48") IF ColCarbPrice THEN LINE<1,ColCarbPrice> =OCONV(AQ_ITEM<73>,"MD48") IF ColComplete THEN LINE<1,ColComplete> =FULL_DESC ARRAY<-1>=LINE END NEXT A END NEXT D END SKIP_PROCESS: ITEM_COUNT+=1 GOSUB UPDATE_STATUS NEXT J CALL END_DIALOG("STD_PROCESS") RETURN PROPERTIES: SelList=Get_Property(OLE_TABLE,"OLE.SelList") AQ_ID=SelList<1,1> IF AQ_ID THEN CREATEPARAM="" CREATEPARAM<1>=AQ_ID CREATEPARAM<2>="" CALL START_WINDOW("AQ_MEAS","",CREATEPARAM) END RETURN TOGGLE_PREVIEW: PreviewMode=Get_Property(OLE_TABLE,"OLE.PreviewMode") PreviewMode=NOT(PreviewMode) CALL Set_Property(OLE_TABLE,"OLE.PreviewMode",PreviewMode) RETURN COLLAPSE: Call Send_Message(OLE_TABLE,"OLE.CollapseAll") RETURN EXPAND: Call Send_Message(OLE_TABLE,"OLE.ExpandAll") RETURN REPORT: CALL UTILITY("CURSOR","H") GroupOrder =Get_Property(OLE_TABLE,"OLE.GroupOrder") ColumnOrder =Get_Property(OLE_TABLE,"OLE.ColumnOrder") ResultsTable=Get_Property(OLE_TABLE,"OLE.ListExFormatted") SWAP 0:@SVM WITH "" IN ResultsTable SWAP 1:@SVM WITH "" IN ResultsTable TotalCols=DCOUNT(ColumnTotals,@FM) NO_ROWS=DCOUNT(ResultsTable,@FM) NO_COLS=DCOUNT(ColumnOrder,@FM) COLOURS="" COLOURS<1>="{{C;":12320699:"}}" COLOURS<2>="{{C;":16769400:"}}" COLOURS<3>="{{C;":16769455:"}}" GrandTotals="" ReportTable="" Row=0 * * Group Order * GroupCount=DCOUNT(GroupOrder,@FM) FOR J=1 TO GroupCount COL=GroupOrder Head=ColumnList GroupOrder=Head NEXT J IF COUNT(ResultsTable,@VM) THEN GOSUB REPORT_DATA END ELSE GOSUB REPORT_TOTALS END * * Format * ReportTable=SRP_Rotate_Array(ReportTable) STRUCTURE="" TABLE="" FOR C=1 TO NO_COLS COL=ColumnOrder TABLE=ReportTable Width =Get_Property(OLE_TABLE,"OLE.ColumnWidth[":COL:"]") Align =Get_Property(OLE_TABLE,"OLE.ColumnAlignment[":COL:"]") Header=Get_Property(OLE_TABLE,"OLE.ColumnHeaderText[":COL:"]") Width=Width*100 STRUCTURE="COL":C STRUCTURE=Header STRUCTURE=Align[1,1] STRUCTURE=Width NEXT C REP_PARAMS="" REP_PARAMS<7>="COL" REP_PARAMS<8>=NO_COLS IF MESSAGE="EXCEL" THEN REP_PARAMS<1>="EXCEL" END ELSE REP_PARAMS<1>="PREVIEW" END CALL UTILITY("CURSOR","A") CALL REPORTER("PROJECT_ANALYSIS",STRUCTURE,TABLE,REP_PARAMS) RETURN REPORT_TOTALS: MERGE="{{M;":NO_COLS-2:"}}" NO_ROWS=DCOUNT(ResultsTable,@FM) FOR I=1 TO NO_ROWS LINE=ResultsTable HEAD=FIELD(LINE,":",1) LOCATE HEAD IN GroupOrder USING @FM SETTING THISLEVEL ELSE THISLEVEL=0 FOR CT=1 TO TotalCols Col=ColumnTotals DELIM="[":COL-1:"]" SWAP DELIM WITH @FM:COL:@VM IN LINE NEXT CT TotalLine="" TotalLine<1>=LINE<1> FOR CT=1 TO TotalCols Col =LINE Value=LINE Value=ICONV(Value,"MD4") TotalLine<1,Col>=OCONV(Value,"MD24,") IF THISLEVEL=1 THEN GrandTotals<1,Col>=GrandTotals<1,Col>+Value END NEXT CT Row+=1 ReportTable=MERGE:TotalLine NEXT I TotalLine="" FOR CT=1 TO TotalCols COL=ColumnTotals TotalLine<1,COL>=COLOURS<1>:OCONV(GrandTotals<1,COL>,"MD24,") NEXT CT Row+=1 ReportTable=MERGE:TotalLine RETURN REPORT_DATA: MERGE="{{M;":NO_COLS-1:"}}" * * Add total lines * NO_ROWS=DCOUNT(ResultsTable,@FM) FOR I=NO_ROWS TO 2 STEP -1 LINE=ResultsTable IF COUNT(LINE,@VM)=0 THEN Type="Head" ELSE Type="Data" THISLEVEL=0 PREVLEVEL=0 IF Type="Head" THEN HEAD=FIELD(LINE,":",1) LOCATE HEAD IN GroupOrder USING @FM SETTING THISLEVEL ELSE THISLEVEL=0 PREV=ResultsTable HEAD=FIELD(PREV,":",1) LOCATE HEAD IN GroupOrder USING @FM SETTING PREVLEVEL ELSE PREVLEVEL=0 END BEGIN CASE CASE Type="Data" CASE Type="Head" AND THISLEVEL=0 CASE Type="Head" AND THISLEVEL AND PREVLEVEL CASE Type="Head" AND THISLEVEL>1 FOR GC=THISLEVEL TO GroupCount CODE="TOT":GC ResultsTable=INSERT(ResultsTable,I,0,0,CODE) NEXT GC CASE Type="Head" AND THISLEVEL=1 FOR GC=1 TO GroupCount CODE="TOT":GC ResultsTable=INSERT(ResultsTable,I,0,0,CODE) NEXT GC END CASE NEXT I FOR GC=GroupCount TO 1 STEP -1 ResultsTable<-1>="TOT":GC NEXT GC * * Add total lines * Totals="" NO_ROWS=DCOUNT(ResultsTable,@FM) FOR I=1 TO NO_ROWS LINE=ResultsTable BEGIN CASE CASE COUNT(LINE,@VM) Row+=1 ReportTable=LINE FOR CT=1 TO TotalCols Col=ColumnTotals Value=LINE<1,Col> Value=ICONV(Value,"MD4") FOR J=1 TO GroupCount Totals=Totals+Value NEXT J GrandTotals<1,Col>=GrandTotals<1,Col>+Value NEXT CT CASE LINE[1,3]="TOT" Level=LINE[4,1] TotalLine="" FOR CT=1 TO TotalCols COL=ColumnTotals TotalLine<1,COL>=COLOURS<2>:OCONV(Totals,"MD24,") NEXT CT Row+=1 ReportTable=TotalLine FOR GC=Level TO GroupCount Totals="" NEXT GC CASE 1 Row+=1 ReportTable=MERGE:LINE<1> END CASE NEXT I IF GroupCount THEN TotalLine="" FOR CT=1 TO TotalCols COL=ColumnTotals TotalLine<1,COL>=COLOURS<1>:OCONV(GrandTotals<1,COL>,"MD24,") NEXT CT Row+=1 ReportTable=TotalLine END RETURN UPDATE_STATUS: IF TOTAL_ITEMS THEN PERCENT=INT((ITEM_COUNT/TOTAL_ITEMS)*100) END ELSE PERCENT=0 END IF PERCENT#PCENT_PROCESSED THEN PCENT_PROCESSED=PERCENT CALL SEND_EVENT("STD_PROCESS","OMNIEVENT",PERCENT) END CALL YIELD() CANCEL=STD_PROCESS RETURN