using mschart
dlls
copy /y mschrt20.ocx C:\WINDOWS\system32\mschrt20.ocx
regsvr32 mschrt20.ocx
regs:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Licenses\12B142A4-BD51-11d1-8C08-0000F8754DA1]
@="aadhgafabafajhchnbchehfambfbbachmfmb"
HKEY_CLASSES_ROOT\Licenses = Licensing: Copying the keys may be a violation of established copyrights.
// MSCHART license key
HKEY_CLASSES_ROOT\Licenses\7C35CA30-D112-11cf-8E72-00A0C90F26F8 = whmhmhohmhiorhkouimhihihwiwinhlosmsl
http://blogs.msdn.com/b/askie/archive/2009/02/20/certain-vb-controls-no-longer-display-on-web-pages-after-installing-kb960715.aspx
Just to give some background information, when a control is kill-bitted, the value of the Compatibility Flags DWORD under the following registry hive gets set to 0x00000400. if set to 0x2020, then Ok
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\<CLSID of the ActiveX control>
examples:
<html>
<head>
<title>Pareto Chart of Lot Defect</title>
<HTA:APPLICATION ID="oLotDefectParetoChart" APPLICATIONNAME="LotDefectParetoChart" SHOWINTASKBAR="yes"/>
<script type="text/javascript">
//*********************Global constants**************************
// For file operation.
var FOR_READ = 1;
var FOR_WRITE = 2;
//***************************************************************
//*********************Global variables**************************
var g_aoLotFileData = new Array();
var g_nLotCount = 0;
var g_aoLotDefectData = new Array();
//***************************************************************
//*********************General functions*************************
function normalizeString(str)
{
str = str.replace(/^\s+/, "");
str = str.replace(/\s+$/, "");
return str;
}
function isUnsignedInteger(input)
{
return (input.toString().search(/^[0-9]+$/) == 0);
}
//***************************************************************
//*********************Data structures***************************
function FileData(path, dateLastModified, parentFolderName)
{
this.path = path;
this.dateLastModified = dateLastModified;
this.parentFolderName = parentFolderName;
}
function DefectData(defect, module, count)
{
this.defect = defect;
this.module = module;
this.count = count;
}
function ParetoChartData(x, yColumn, yLine)
{
this.x = x;
this.yColumn = yColumn;
this.yLine = yLine;
}
//***************************************************************
//*******************Pareto Chart functions**********************
function pushFileData(sLotDataDir, sDefectCountFileName, aoFileData)
{
var oFileSys = new ActiveXObject("Scripting.FileSystemObject");
if (!oFileSys.FolderExists(sLotDataDir))
{
alert(sLotDataDir + " does not exist.");
return false;
}
var oFolder = oFileSys.GetFolder(sLotDataDir);
var oSubFolderPointer = new Enumerator(oFolder.SubFolders);
for (; !oSubFolderPointer.atEnd(); oSubFolderPointer.moveNext())
{
var sSubFolderPath = oSubFolderPointer.item().Path.toString();
var sXMLFilePath = sSubFolderPath + "\\" + sDefectCountFileName;
if (oFileSys.FileExists(sXMLFilePath))
{
aoFileData.push(new FileData(sXMLFilePath, oFileSys.GetFile(sXMLFilePath).DateLastModified, oSubFolderPointer.item().Name.toString()));
}
}
aoFileData.sort(function(a, b){return b.dateLastModified - a.dateLastModified;});
return true;
}
function coreExtractLotDefectData(oFileData, aoLotDefectData)
{
var oXMLDoc = new ActiveXObject("MSXML2.DOMDocument.4.0");
oXMLDoc.async = false;
oXMLDoc.load(oFileData.path);
var aoItemNodes = oXMLDoc.selectNodes("/SESSION/ITEM[count(FDNAME)=1]");
var sLotID = oFileData.parentFolderName;
var sDefect = "";
var sModule = "";
var nCount = 0;
for (var i = 0; i < aoItemNodes.length; i++)
{
var sFDName = aoItemNodes[i].selectNodes("FDNAME")[0].text;
if (sFDName.slice(0, 3) == "---")
{
sModule = sFDName.replace(/---/g, "");
}
else
{
sDefect = sFDName;
nCount = parseInt(aoItemNodes[i].selectNodes("FDALLDEFCONTENT")[0].text);
if (aoLotDefectData[sLotID] == null)
{
aoLotDefectData[sLotID] = new Array();
}
aoLotDefectData[sLotID].push(new DefectData(sDefect, sModule, nCount));
}
}
}
function extractLotDefectData(sLotDataDir, sDefectCountFileName, nNumOfLots, aoLotDefectData)
{
var oFileSys = new ActiveXObject("Scripting.FileSystemObject");
var aoFileData = new Array();
if (!pushFileData(sLotDataDir, sDefectCountFileName, aoFileData))
return false;
if (nNumOfLots > aoFileData.length)
nNumOfLots = aoFileData.length;
for (var i = 0; i < nNumOfLots; ++i)
{
coreExtractLotDefectData(aoFileData[i], aoLotDefectData);
g_aoLotFileData[aoFileData[i].parentFolderName] = aoFileData[i];
}
for (var key in g_aoLotFileData)
++g_nLotCount;
return true;
}
function computeTotalNumOfDefects(aoParetoChartData)
{
var nTotalNumOfDefects = 0;
for (var i = 0; i < aoParetoChartData.length; ++i)
{
nTotalNumOfDefects += aoParetoChartData[i].yColumn;
}
return nTotalNumOfDefects;
}
function computeYLine(aoParetoChartData)
{
var nTotalNumOfDefects = computeTotalNumOfDefects(aoParetoChartData);
// No need to compute yLine if total number of defects is 0.
if (nTotalNumOfDefects == 0)
return;
aoParetoChartData[0].yLine = aoParetoChartData[0].yColumn / nTotalNumOfDefects * 100;
for (var i = 1; i < aoParetoChartData.length; ++i)
{
aoParetoChartData[i].yLine = aoParetoChartData[i].yColumn / nTotalNumOfDefects * 100;
aoParetoChartData[i].yLine += aoParetoChartData[i-1].yLine;
}
}
function computeParetoChartData(aoLotDefectData, aoParetoChartData)
{
var oIt = new Enumerator(aoLotDefectData);
var aoDefectData = oIt.item();
// There is no lot at all.
if (aoDefectData == null)
{
alert("No lot is found or selected.");
return false;
}
for (var i = 0; i < aoDefectData.length; ++i)
{
aoParetoChartData.push(new ParetoChartData(aoDefectData[i].defect, aoDefectData[i].count, 0));
}
oIt.moveNext();
for (; !oIt.atEnd(); oIt.moveNext())
{
aoDefectData = oIt.item();
for (var i = 0; i < aoDefectData.length; ++i)
{
var bIsFound = false;
for (var j = 0; j < aoParetoChartData.length; ++j)
{
if (aoParetoChartData[j].x.toLowerCase() == aoDefectData[i].defect.toLowerCase())
{
aoParetoChartData[j].yColumn += aoDefectData[i].count;
bIsFound = true;
break;
}
}
// New entry.
if (!bIsFound)
{
aoParetoChartData.push(new ParetoChartData(aoDefectData[i].defect, aoDefectData[i].count, 0));
}
}
}
aoParetoChartData.sort(function(a, b){return b.yColumn - a.yColumn;});
var nSpliceIndex = 0;
for (var i = 0; i < aoParetoChartData.length; ++i)
{
nSpliceIndex = i;
if (aoParetoChartData[i].yColumn == 0)
break;
}
aoParetoChartData.splice(nSpliceIndex, aoParetoChartData.length - nSpliceIndex);
computeYLine(aoParetoChartData);
return true;
}
function plotPartoChart(aoParetoChartData)
{
var oChart = document.getElementById("MSChart1");
oChart.style.visibility = "hidden";
if (aoParetoChartData.length == 0)
{
alert("Total number of defects is zero.");
return;
}
oChart.chartType = 9;
//oChart.Title.Text = "Pareto Chart of Lot Defect";
oChart.Legend.Location.LocationType = 1;
oChart.ShowLegend = true;
oChart.ColumnCount = 2;
oChart.RowCount = aoParetoChartData.length;
for (var i = 0; i < aoParetoChartData.length; ++i)
{
oChart.DataGrid.RowLabel(i + 1, 1) = aoParetoChartData[i].x;
oChart.DataGrid.SetData(i + 1, 1, aoParetoChartData[i].yColumn, 0);
oChart.DataGrid.SetData(i + 1, 2, aoParetoChartData[i].yLine, 0);
}
oChart.Plot.xGap = 0.1;
oChart.Plot.SeriesCollection(1).SeriesType = 1;
oChart.Plot.SeriesCollection(1).LegendText = "Defect Frequency";
oChart.Plot.SeriesCollection(1).DataPoints(-1).Brush.FillColor.Set(0, 0, 255);
oChart.Plot.SeriesCollection(1).SecondaryAxis = false;
oChart.Plot.SeriesCollection(1).DataPoints(-1).DataPointLabel.LocationType = 3;
oChart.Plot.SeriesCollection(1).DataPoints(-1).DataPointLabel.VtFont.VtColor.Set(255, 255, 0);
oChart.Plot.SeriesCollection(2).SeriesType = 6;
oChart.Plot.SeriesCollection(2).LegendText = "Cumulative Percentage";
oChart.Plot.SeriesCollection(2).DataPoints(-1).Brush.FillColor.Set(255, 0, 0);
oChart.Plot.SeriesCollection(2).SeriesMarker.Auto = false;
oChart.Plot.SeriesCollection(2).SeriesMarker.Show = true;
oChart.Plot.SeriesCollection(2).DataPoints(-1).Marker.Size = 50;
oChart.Plot.SeriesCollection(2).DataPoints(-1).Marker.Style = 6;
oChart.Plot.SeriesCollection(2).DataPoints(-1).Marker.Pen.VtColor.Set(255, 0, 0);
oChart.Plot.SeriesCollection(2).DataPoints(-1).Marker.Visible = true;
oChart.Plot.SeriesCollection(2).SecondaryAxis = true;
oChart.Plot.SeriesCollection(2).Pen.Width = 2;
oChart.Plot.Axis(0).AxisTitle.Text = "Defect";
oChart.Plot.Axis(0).AxisGrid.MajorPen.Style = 0;
oChart.Plot.Axis(1).AxisTitle.Text = "Defect Frequency";
oChart.Plot.Axis(1).AxisGrid.MajorPen.Style = 3;
oChart.Plot.Axis(1).ValueScale.Auto = false;
oChart.Plot.Axis(1).ValueScale.Maximum = aoParetoChartData[0].yColumn / aoParetoChartData[0].yLine * 100;
oChart.Plot.Axis(1).ValueScale.Minimum = 0;
oChart.Plot.Axis(1).ValueScale.MajorDivision = 10;
oChart.Plot.Axis(2).AxisTitle.Text = "Cumulative Percentage";
oChart.Plot.Axis(2).AxisGrid.MajorPen.Style = 3;
oChart.Plot.Axis(2).ValueScale.Auto = false;
oChart.Plot.Axis(2).ValueScale.Maximum = 100;
oChart.Plot.Axis(2).ValueScale.Minimum = 0;
oChart.Plot.Axis(2).ValueScale.MajorDivision = 10;
oChart.style.visibility = "visible";
}
function refreshParetoChart()
{
var oChart = document.getElementById("MSChart1");
oChart.style.visibility = "hidden";
var aoLotDefectData = new Array();
var aoParetoChartData = new Array();
for (var key in g_aoLotDefectData)
{
if (document.getElementById(key + "CheckBox").checked)
{
aoLotDefectData[key] = g_aoLotDefectData[key];
}
}
if (computeParetoChartData(aoLotDefectData, aoParetoChartData))
plotPartoChart(aoParetoChartData);
}
function selectAllLots()
{
for (var key in g_aoLotDefectData)
{
document.getElementById(key + "CheckBox").checked = true;
}
}
function unSelectAllLots()
{
for (var key in g_aoLotDefectData)
{
document.getElementById(key + "CheckBox").checked = false;
}
}
function appendControlButtons()
{
var oDiv = document.getElementById("lotSelectionArea");
var oInput = document.createElement("Input");
// Refresh button
var oInputCell = oInput.cloneNode(false);
oInputCell.type = "button";
oInputCell.value = "Refresh Chart";
oInputCell.onclick = refreshParetoChart;
oInputCell.width = "150";
oDiv.appendChild(oInputCell);
// Select All button
var oInputCell = oInput.cloneNode(false);
oInputCell.type = "button";
oInputCell.value = "Select All Lots";
oInputCell.onclick = selectAllLots;
oInputCell.width = "150";
oDiv.appendChild(oInputCell);
// Unselect All button
var oInputCell = oInput.cloneNode(false);
oInputCell.type = "button";
oInputCell.value = "Unselect All Lots";
oInputCell.onclick = unSelectAllLots;
oInputCell.width = "150";
oDiv.appendChild(oInputCell);
}
function appendLotInfoTable(aoLotDefectData, nDataStart, nDataEnd, oTable)
{
var oThead = document.createElement("THead");
var oTbody = document.createElement("TBody");
var oTd = document.createElement("TD");
var oTr = document.createElement("TR");
var oTh = document.createElement("TH");
var oInput = document.createElement("Input");
// thead
var oRow = oTr.cloneNode(false);
var oCell = oTh.cloneNode(false);
oCell.appendChild(document.createTextNode("Select"));
oRow.appendChild(oCell);
var oCell = oTh.cloneNode(false);
oCell.appendChild(document.createTextNode("Lot ID"));
oRow.appendChild(oCell);
var oCell = oTh.cloneNode(false);
oCell.appendChild(document.createTextNode("Date Modified"));
oRow.appendChild(oCell);
oThead.appendChild(oRow);
// tbody
var nIndex = 0;
for (var key in aoLotDefectData)
{
if (nIndex < nDataStart)
{
++nIndex;
continue;
}
else if (nIndex > nDataEnd)
break;
var oRow = oTr.cloneNode(false);
var oInputCell = oInput.cloneNode(false);
oInputCell.type = "checkbox";
oInputCell.defaultChecked = true;
oInputCell.id = key + "CheckBox";
oInputCell.height = "10";
var oCell = oTd.cloneNode(false);
oCell.appendChild(oInputCell);
oRow.appendChild(oCell);
var oCell = oTd.cloneNode(false);
oCell.appendChild(document.createTextNode(key));
oRow.appendChild(oCell);
var oCell = oTd.cloneNode(false);
var dDate = new Date(g_aoLotFileData[key].dateLastModified);
oCell.appendChild(document.createTextNode(dDate.toLocaleString().replace(/^.*day, /, "")));
oRow.appendChild(oCell);
oTbody.appendChild(oRow);
++nIndex;
}
// table
oTable.appendChild(oThead);
oTable.appendChild(oTbody);
}
function appendLotInfoTableEx(aoLotDefectData)
{
var oDiv = document.getElementById("lotSelectionArea");
var oTable = document.createElement("Table");
var oTbody = document.createElement("TBody");
var oTd = document.createElement("TD");
var oTr = document.createElement("TR");
var nDataStart = 0;
var nDataEnd = g_nLotCount - 1;
if (g_nLotCount > 20)
{
var oTableLeft = oTable.cloneNode(false);
nDataEnd = Math.ceil(g_nLotCount / 2) - 1;
appendLotInfoTable(aoLotDefectData, nDataStart, nDataEnd, oTableLeft);
var oTableRight = oTable.cloneNode(false);
nDataStart = nDataEnd + 1;
nDataEnd = g_nLotCount - 1;
appendLotInfoTable(aoLotDefectData, nDataStart, nDataEnd, oTableRight);
var oRow = oTr.cloneNode(false);
var oCell = oTd.cloneNode(false);
oCell.appendChild(oTableLeft);
oRow.appendChild(oCell);
var oCell = oTd.cloneNode(false);
oCell.appendChild(oTableRight);
oRow.appendChild(oCell);
oTbody.appendChild(oRow);
oTable.appendChild(oTbody);
}
else
{
appendLotInfoTable(aoLotDefectData, nDataStart, nDataEnd, oTable);
}
oDiv.appendChild(oTable);
}
function fillLotSelectionAreaContent(aoLotDefectData)
{
appendControlButtons();
appendLotInfoTableEx(aoLotDefectData);
}
function main()
{
var oChart = document.getElementById("MSChart1");
if (!oChart.Plot)
{
alert("Please install MSChart first.");
return;
}
// Format of command line:
// mshta.exe "[Position of LotDataParetoChart.hta]" "[Directory of Lot Data]" "[Name of Data File (in XML)]" "[Number of Lots]".
var asArguments = oLotDefectParetoChart.commandLine.split("\"");
var sLotDataDir = (asArguments[3] != null) ? asArguments[3] : null;
var sDefectCountFileName = (asArguments[5] != null) ? asArguments[5] : null;
var nNumOfLots = (asArguments[7] != null) ? asArguments[7] : 30;
if (sLotDataDir == null || sDefectCountFileName == null)
{
alert("Invalid arguments!");
return;
}
if (!extractLotDefectData(sLotDataDir, sDefectCountFileName, nNumOfLots, g_aoLotDefectData))
{
return;
}
// From now on, g_aoLotFileData, g_nLotCount and g_aoLotDefectData are read-only.
var aoParetoChartData = new Array();
if (computeParetoChartData(g_aoLotDefectData, aoParetoChartData))
{
plotPartoChart(aoParetoChartData);
fillLotSelectionAreaContent(g_aoLotDefectData);
}
}
//***************************************************************
</script>
<style type="text/css">
table {
font: Icon;
border: 1px Solid ThreeDShadow;
background: Window;
color: WindowText;
background-color: WhiteSmoke;
margin-left: 3px;
}
thead {
background: ButtonFace;
}
td {
padding: 1px 5px 1px 5px;
font-size: 11px;
border-left: 1px solid silver;
border-bottom: 1px solid silver;
text-align: center;
color: black;
}
.sort-arrow {
0px;
height: 0px;
background-position: center center;
}
.sort-arrow.descending {
8px;
height: 8px;
background-image: url("C:/WinEagle/System/Report/InspectionReport/Result_files/images/downsimple.png");
}
.sort-arrow.ascending {
8px;
height: 8px;
background-image: url("C:/WinEagle/System/Report/InspectionReport/Result_files/images/upsimple.png");
}
body {
font-family: Verdana, Helvetica, Arial, Sans-Serif;
font: Message-Box;
}
a {
color: Olive;
font-size: 12px;
cursor: hand;
}
a:link {color: #FF0000}
a:visited {color: #00FF00}
a:hover {color: #FF00FF}
a:active {color: #0000FF}
button {
100%;
}
.MSChart {
HEIGHT: 52%;
WIDTH: 100%;
position: fixed;
top: 0px;
right: 0px ;
background-color: #B7B7B7;
}
</style>
</head>
<body id="content">
<OBJECT class="MSChart" classid="clsid:3A2B370C-BA0A-11D1-B137-0000F8753F5D" id="MSChart1" CODEBASE="mschart.cab" VIEWASTEXT></OBJECT>
<div id="lotSelectionArea" />
</body>
</html>