>>>*************************************************************************** >>>*!* Method: ProjMetrics >>>*!* Purpose: Calc some simple project metrics >>>*!* Author: bxk 11.11.03 >>>*!* Parameters: >>>*!* Returns: >>>*!* Modifications: >>>*************************************************************************** >>>LPARAMETERS tcProjectName >>> >>>ASSERT !EMPTY(tcProjectName) .AND. VARTYPE(tcProjectName) = 'C' ; >>> MESSAGE 'A project name is required' >>> >>>ASSERT EMPTY(JUSTEXT(tcProjectName)) .OR. UPPER(JUSTEXT(tcProjectName)) = 'PJX' ; >>> MESSAGE 'A _PROJECT_ name is required' >>> >>>CLOS ALL >>>CLOS DATA ALL >>>SET CENTURY ON >>> >>>LOCAL lnClassCount, lnFormCount, lnLibCount, lnLineCount, lnRptCount, ; >>> lnDBFCount, lnProgCount, lcOut, lnLines, lcProjName, lcFileName, lnViewCount, ; >>> lnTableCount >>> >>>STORE 0 TO lnClassCount, lnFormCount, lnLibCount, lnLineCount, ; >>> lnRptCount, lnDBFCount, lnProgCount, lnViewCount, lnTableCount >>> >>>STORE "" TO lcOut >>> >>>#DEFINE CRLF CHR(13) + CHR(10) >>> >>>IF ! ('.' $ tcProjectName) >>> lcProjName = tcProjectName + '.PJX' >>>ELSE >>> lcProjName = tcProjectName >>>ENDIF >>> >>>USE (lcProjName) in 0 ALIAS metProject >>>SELECT metProject >>>SCAN FOR !DELETED() >>> lcType = ALLTRIM(metProject.type) >>> >>> && Handle project objects implemented as tables >>> IF lcType $ 'M,V,K,R,d' >>> lcObj = ALLTRIM(metProject.name) >>> USE IN SELECT ('metObject') >>> USE (lcObj) IN 0 AGAIN ALIAS metObject >>> SELECT metObject >>> >>> DO CASE >>> CASE lcType = 'M' && Menus >>> SCAN FOR !EMPTY(metObject.procedure) >>> lnLines = ALINES(laLines, metObject.procedure) >>> lnLineCount = lnLineCount + GetLineCount(@laLines) >>> ENDSCAN >>> >>> CASE lcType = 'V' && ClassLibs >>> COUNT TO lnCount FOR !EMPTY(class) >>> lnClassCount = lnClassCount + lnCount >>> lnLibCount = lnLibCount + 1 >>> >>> SCAN FOR !EMPTY(methods) >>> lnLines = ALINES(laLines, metObject.methods) >>> lnLineCount = lnLineCount + GetLineCount(@laLines) >>> ENDSCAN >>> >>> CASE lcType = 'K' && Forms >>> lnFormCount = lnFormCount + 1 >>> SCAN FOR !EMPTY(metObject.methods) >>> lnLines = ALINES(laLines, metObject.methods) >>> lnLineCount = lnLineCount + GetLineCount(@laLines) >>> ENDSCAN >>> >>> CASE lcType = 'R' && Reports >>> lnRptCount = lnRptCount + 1 >>> SCAN FOR !EMPTY(metObject.expr) >>> lnLines = ALINES(laLines, metObject.expr) >>> lnLineCount = lnLineCount + GetLineCount(@laLines) >>> ENDSCAN >>> >>> CASE lcType = 'd' >>> SCAN FOR !DELETED() >>> DO CASE >>> CASE objecttype = 'View' >>> lnViewCount = lnViewCount + 1 >>> >>> CASE objecttype = 'Table' >>> lnTableCount = lnTableCount + 1 >>> >>> ENDCASE >>> ENDSCAN >>> >>> ENDCASE >>> >>> ELSE >>> IF lcType = 'D' && Tables >>> lnDBFCount = lnDBFCount + 1 >>> ELSE >>> IF lcType = 'P' && Programs >>> lnProgCount = lnProgCount + 1 >>> lcProg = ALLTRIM(metProject.name) >>> lcLines = FILETOSTR(lcProg) >>> lnLines = ALINES(laLines, lcLines) >>> lnLineCount = lnLineCount + GetLineCount(@laLines) >>> ENDIF >>> ENDIF >>> >>> ENDIF >>> >>>ENDSCAN >>> >>>lcOut = lcOut + CRLF + CRLF >>>lcOut = lcOut + DTOC(DATE()) >>>lcOut = lcOut + CRLF + CRLF >>>lcOut = lcOut + + 'Project metrics for: ' + lcProjName + CRLF + CRLF >>>lcOut = lcOut + 'Class Count = ' + TRAN(lnClassCount) + CRLF >>>lcOut = lcOut + 'Lib Count = ' + TRAN(lnLibCount) + CRLF >>>lcOut = lcOut + 'Form Count = ' + TRAN(lnFormCount) + CRLF >>>lcOut = lcOut + 'Line Count = ' + TRAN(lnLineCount) + CRLF >>>lcOut = lcOut + 'Report Count = ' + TRAN(lnRptCount) + CRLF >>>lcOut = lcOut + 'Lookup Count = ' + TRAN(lnDBFCount) + CRLF >>>lcOut = lcOut + 'Program Count = ' + TRAN(lnProgCount) + CRLF >>>lcOut = lcOut + 'Data Table Count = ' + TRAN(lnTableCount) + CRLF >>>lcOut = lcOut + 'Data View Count = ' + TRAN(lnViewCount) + CRLF >>> >>>lcFileName = JUSTSTEM(lcProjName) + 'Metrics.txt' >>>StrToFile(lcOut, lcFileName) >>> >>>MESSAGEBOX(lcFileName + ' Created') >>> >>>CLOS DATA ALL >>> >>> >>>RETURN >>> >>>*************************************************************************** >>>*!* Method: GetLineCount >>>*!* Purpose: Returns lines of code in a Method, Prg. Ignore comments >>>*!* white space. >>>*!* Author: bxk >>>*!* Parameters: >>>*!* Returns: >>>*!* Modifications: >>>*************************************************************************** >>>FUNCTION GetLineCount >>>LPARAMETERS taLines >>> >>>LOCAL lnCount, lnLines >>>STORE 0 TO lnCount, lnLines >>> >>>lnLines = ALEN(taLines) >>>FOR li = 1 TO lnLines >>> IF EMPTY(taLines[li]) .OR. LEFT(ALLTRIM(taLines[li]), 1) $ '&*' >>> >>> ELSE >>> lnCount = lnCount + 1 >>> >>> ENDIF >>>ENDFOR >>> >>>RETURN lnCount >>>