>>>>*************************************************************************** >>>>*!* 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 >>>>