2021-08-09导出表

铁水质量导出表开发过程

首先,熟读业务需求,调研数据,制定开发计划

(一)前端

一.  页面,即 . aspx文件:

1.  指定模板页是哪个

<%@ Page Title="" Language="C#" MasterPageFile="~/PageMaster.master" AutoEventWireup="true" CodeFile="AIronMakeReport.aspx.cs" Inherits="QDC_AIronMakeReport" %>

2. 在<asp></asp>标签中,写我们要展示的内容

<asp:Content ID="Content1" ContentPlaceHolderID="BodyContentPlaceHolder" runat="Server">

</asp:Content>

3.页面最上边,展示供客户使用的查询条件按钮

<div id="searchDataForm" class="flow_data_form flow_data_form_search">
        <label>
            <span>工作时间: </span>
            <input id="workDateInput" type="text" property="SampleNoTime" dataformat="Y-M-D" datatype="date" class="data_input date_picker" compare=">=" />
            <span>至: </span>
            <input id="workDateEndInput" type="text" property="SampleNoTime" dataformat="Y-M-D" datatype="date" class="data_input date_picker" compare="<" adddates="1" />
        </label>
        <label>
            <span>炉座号:</span>
            <input id="stoveNo" type="text" class="data_input" property="StoveNo" compare="like" comparevalue="'%?%'" />
        </label>
        <label>
            <span>班次:</span>
            <input id="workingShift" type="text" class="data_input" property="TeamNo" compare="like" comparevalue="'%?%'" />
        </label>
        <div>
            <input id="searchBtn" type="button" value="查询" class="button" />
            <input id="expBtn" type="button" value="导出" class="button" />
            <input id="manageBtn" type="button" style="width: auto" value="批量处理" class="button" />
        </div>
        <div>
            <input type="reset" class="button" id="button" value="重置" />
        </div>
    </div>

4.页面展示的table表格

<table class="grid_panel" id="ironReport" datastore="reportDataStore" exportable="false">
        <tr>
            <th checkbox="true" datamember="Id" dataalign="center" width="20">
                <input class="data_check_all" type="checkbox" />
            </th>
            <th rownumber="true" dataalign="center" width="40">序号</th>
            <th datamember="SampleNoTime" dataformat="Y-M-D" dataalign="center" summarytype="custom" sortable="false" render="renderWorkTimeColumn">工作时间</th>
            <th datamember="StoveNo" dataalign="center"summarytype="custom" sortable="false" render="renderStoveNoColumn">炉座号</th>
            <th datamember="TeamNo" dataalign="center" summarytype="custom" sortable="false" render="renderTeamNoColumn">班次</th>
            <th datamember="Times" dataalign="center" summarytype="custom" sortable="false" render="renderTimesColumn">铁次</th>
            <th datamember="PackageNum" dataalign="center" summarytype="custom" sortable="false" render="renderPackageNumColumn">包号</th>
            <th datamember="SampleCode" dataalign="center" summarytype="custom" sortable="false" render="renderSampleCodeColumn">样品编码</th>
            <th datamember="S" dataalign="center" summarytype="custom" sortable="false" render="renderSColumn">S</th>
            <th datamember="Si" dataalign="center" sortable="false">Si</th>
            <th datamember="DecideResult" dataalign="center" sortable="false" summarytype="custom" render="renderDecideResultColumn">判定结果</th>
            <th datamember="IronWeight" dataalign="center" sortable="false">铁重(t)</th>
            <th datamember="EliminateName" dataalign="center" sortable="false">是否剔除</th>
            <th datamember="WeedOoutReason" dataalign="center">剔除原因</th>
        </tr>
    </table>

5. 用户点击【批量处理】按钮后,弹出的对话框

<div id="addEditDialog" class="nst_dialog nst_dialog_out" width="80%" height="90%">
        <div class="nst_dialog_body">
            <table class="grid_panel" id="manageGridPanel" datastore="manageDataStore" pagingtoolbar="false" nowrap="true" maxpanelheight="330" sortable="false">
                <tr>
                    <th rownumber="true" dataalign="center">序号</th>
                    <th datamember="SampleNoTime" dataalign="left" dataformat="Y-M-D">日期</th>
                    <th datamember="StoveNo" dataalign="center">炉座号</th>
                    <th datamember="TeamNo" dataalign="center">班次</th>
                    <th datamember="Times" dataalign="center">铁次</th>
                    <th datamember="PackageNum" dataalign="center">包号</th>
                    <th datamember="SampleCode" dataalign="center">样品编码</th>
                    <th datamember="S" dataalign="center">S</th>
                    <th datamember="Si" dataalign="center">Si</th>
                    <th datamember="DecideResult" dataalign="center" >判定结果</th>
                    <th datamember="IronWeight" dataalign="center" render="renderIronColumn">铁重(t)</th>
                    <th datamember="EliminateId" dataalign="center" render="renderEliminateIdColumn">是否剔除</th>
                    <th datamember="WeedOoutReason" dataalign="right" render="renderReasonColumn">剔除原因</th>
                </tr>
            </table>
        </div>
        <div class="nst_dialog_action_bar">
            <input id="saveBtn" type="button" value="保存" class="button" />
            <input id="cancelBtn" type="button" value="取消" class="button" />
        </div>
    </div>

6. <iframe>标签:被用来在当前 HTML 中嵌入另一个文档

<iframe id="expIframe"></iframe>

二. 前端JavaScript 即 .js中的文件 

1. “数据源”和“按钮”(包括弹框内的)

$(function () {

    //定义页面数据源
    new DataStore({
        id: "reportDataStore",
        dataSource: "RFN.BM.QDC.AIronMakeExperimentInfo",
        idProperty: "Id",
        sort: "SampleNoTime DESC",
        pageSize: 15,
        dataHandler: "RFN.BL.QDC.AIronMakeExperiment.Handler",
    }).setData([]);

    //定义弹窗数据源
    new DataStore({
        id: "manageDataStore",
        dataSource: "RFN.BM.QDC.AIronMakeExperimentInfo",
        //idProperty: "Id",
        sort: "ExperimentTime DESC",
        pageSize: 15,
        dataHandler: "RFN.BL.QDC.AIronMakeExperiment.Handler",
    }).setData([]);

    //【是否剔除】数据源
    new DataStore({
        id: "eliminateDataStore",
        idProperty: 'Id',
        dataSource: "RFN.BM.HRM.DataDictInfo",
        constraint: "[ParentCode]=?",
        values: ["true_or_false"],
        sort: "Sort ASC"
    }).load();

    //查找按钮;
    $("#searchBtn").click(clickSearchBtn);
    $("#searchBtn").click();

    //点击批量处理  触发按钮
    $("#manageBtn").click(clickManageBtn);

    //点击(弹窗界面中的)保存  触发按钮
    $("#saveBtn").click(clickSaveBtn);

    //点击(弹窗界面中的)取消  触发按钮
    $("#cancelBtn").click(clickCancelBtn);

    //导出 按钮
    $("#expBtn").click(clickExpBtn);
})

2.点击【查询】按钮时,所执行的方法

//点击【查找】按钮  所执行的方法 
function clickSearchBtn() {
    //constraint 是调用那些,自动生成的查询方法使用的;  而 sqlConstraint 是调用自己写的方法时,拼接SQL语句时使用的
    var searchData = { sqlConstraint: " 1=1 ", constraint: "1=1", values: [] };

    //查询条件:样品编码的字符串,下标为9的数值等于1,符合该条件就是'铁水'
    searchData.constraint += " AND substr([SampleNo],9,1) = '1' ";
    searchData.sqlConstraint += " AND substr(T.SAMPLE_NO,9,1) = '1' ";

    //通过id,获得 工作开始时间 和 工作结束时间 的值
    var workDateInput = DatePickerMgr.get("workDateInput").getValue();
    var workDateEndInput = DatePickerMgr.get("workDateEndInput").getValue();
    //设置 工作开始结束 时间 的格式
    var workDateInput1 = Nst.formatDate(workDateInput, "Y-M-D");
    var workDateEndInput1 = Nst.formatDate(workDateEndInput, "Y-M-D");

    //获得 炉座号 和 班次
    var stoveNo = $("#stoveNo").val();
    var workingShift = $("#workingShift").val();

    //如果有工作的开始和结束时间,拼接 SQL 语句
    if (workDateInput) {
        searchData.constraint += " AND [SampleNoTime]>=?";
        searchData.values.push(workDateInput);

        searchData.sqlConstraint += " and to_char(t.SAMPLE_NO_TIME,'yyyy-mm-dd') >=  '" + workDateInput1 + "'";
    }
    if (workDateEndInput) {
        searchData.constraint += " AND [SampleNoTime]< ?";
        searchData.values.push(workDateEndInput);

        searchData.sqlConstraint += " and to_char(t.SAMPLE_NO_TIME,'yyyy-mm-dd') <  '" + workDateEndInput1 + "'";
    }

    //炉座号 模糊查询
    if (stoveNo) {
        searchData.constraint += " AND [StoveNo] LIKE '%?%'";
        searchData.values.push(stoveNo);
        searchData.sqlConstraint += " AND T.STOVE_NO LIKE '%'|| '" + stoveNo + "' ||'%'";
    }

    //班次 模糊查询
    if (workingShift) {
        searchData.constraint += " AND [TeamNo] LIKE '%?%'";
        searchData.values.push(workingShift);
        searchData.sqlConstraint += " AND T.TEAM_NO LIKE '%'|| '" + workingShift + "' ||'%'";
    }
    //var searchData = FlowDataFormMgr.get("searchDataForm").getSearchData();
    //searchData.constraint = (searchData.constraint ? searchData.constraint + " AND  " : "") + "substr([SampleNo],9,1) = '1' ";
    DataStoreMgr.get("reportDataStore").load(searchData);
}

3. 点击【批量处理】时,弹出对话框

//点击【批量处理】按钮,弹出对话框
function clickManageBtn() {

    //获取勾选的数据
    var checkedDatas = GridPanelMgr.get("ironReport").getCheckedDatas();

    //如果没勾选,弹出提示
    if (checkedDatas.length == 0) {
        alert("请勾选需要处理的数据")
        return;
    }

    //把勾选的数据,装到弹窗的table里
    DataStoreMgr.get("manageDataStore").setData(checkedDatas);

    //弹窗放在一个div里,根据获取该div
    var dialog = NstDialogMgr.get("addEditDialog");
    dialog.setTitle("批量处理");
    dialog.show();
}

4. 弹窗内展示的内容

//弹窗内:客户输入【铁重】列的展现内容
function renderIronColumn(cell, value, record, column) {
    $(cell).html("");
    var dataInput = document.createElement("input");
    dataInput.className = "dataInput";
    $(dataInput).attr("property", "IronWeight");
    $(dataInput).attr("datatype", "float");
    $(dataInput).attr("nullable", "false");
    $(dataInput).attr("label", "铁重");
    $(dataInput).val(value);

    dataInput.onkeydown = function () {
        $(this).attr("oldValue", $(this).val());
    }.bind(dataInput);

    dataInput.onkeyup = function (entity) {
        var value = $(this).val();
        if ($(this).attr("oldValue") == value) return;

        //声明一个正则表达式对象
        var regExp = /^(?:0|[1-9]+\d*)(?:\.\d+)?$/;

        var result = regExp.test(value);

        var iron = (regExp.test(value) ? parseFloat(value) : 0);

        $("#deductTheScore_label_" + entity.DutyId).html(iron);

    }.bind(dataInput, record);

    $(cell).html("");
    $(cell).append(dataInput);
}

//弹窗内:用户选择【是否剔除】列的展现内容,默认选择 "否"
function renderEliminateIdColumn(cell, value, record, column) {

    var input = document.createElement("input");
    var $input = $(input);
    $input.attr("type", "text");
    $input.attr("class", "combo_box dataInput");
    $input.attr("property", "EliminateId");
    $input.attr("datastore", "eliminateDataStore");
    $input.attr("valuemember", "Id");
    $input.attr("textmember", "Name");
    $input.attr("defaultvalue", "{value:'-1',text:'请选择……'}");

    //获取 下拉框 里的内容
    var comboBox = new ComboBox(input);

    //如果有内容,原来的内容 就继续放在下拉框里
    if (value != null) {
        comboBox.setValue(value);
    }
    //如果没有内容,就 通过 eliminateId 来获取,该参数是页面  CodeFile="AIronMakeReport.aspx.cs" 的类里传过来的
    else {
        comboBox.setValue(eliminateId);
    }

    $(cell).html("");
    $(cell).append(input);
}

//弹窗内:用户输入【剔除原因】列的展现内容
function renderReasonColumn(cell, value, record, column) {                  //cell 单元格     record  记录    colunm 列;栏
    $(cell).html("");
    var causeInput = document.createElement("input");
    causeInput.className = "dataInput";
    $(causeInput).attr("property", "WeedOoutReason");                        //property  属性   后边应该,对应到,实体类的属性   
    // $(dataInput).attr("nullable", "false");                                 //null lable  空标签    为false的话,就是不允许有空标签
    $(causeInput).attr("label", "剔除原因");                                 //如果 lable标签 为空, 则弹窗内容显示【剔除原因】
    $(causeInput).val(value);                                                //设置 值为 value

    causeInput.onkeydown = function () {                                     //当按下一个按键时,触发方法
        $(this).attr("oldValue", $(this).val());
    }.bind(causeInput);

    causeInput.onkeyup = function (entity) {                                 //当抬起一个按键时,触发方法
        var value = $(this).val();
        if ($(this).attr("oldValue") == value) return;

    }.bind(causeInput, record);                                              //bind里边可以定义多个点击方法,或鼠标移出移入事件

    $(cell).html("");
    $(cell).append(causeInput);                                              //在该单元格添加 causeInput
}

//弹窗内:点击【保存】按钮 所执行的方法
function clickSaveBtn() {

    //先获取当前行的数据
    var result = GridPanelMgr.get("manageGridPanel").getRecords();
    
    //用户输入的内容放在集合里
    var aIronMakeExperimentInfos = result.records;

    //如果【是否剔除】选"是",且没写剔除原因,就提示用户写剔除原因; 如果【是否剔除】选"否",则不用写剔除原因。该判断交给BL处理,调BL的方法,把该集合传给BL
    Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.UpdateAIronMakeExperimentInfo", [aIronMakeExperimentInfos], function (res) {
        //如果没获取到 BL的判断结果,就return掉
        if (!Nst.Ajax.checkResult(res)) return;

        //关闭弹窗
        clickCancelBtn();
        
        //更新页面数据
        location.reload();
    });
}

//弹窗内:点击【取消】按钮 所执行的方法
function clickCancelBtn() {

    //关闭包含弹窗的div
    NstDialogMgr.get("addEditDialog").close();
}

5. 为了使页面最后一行 显示汇总功能,table表格中的列 使用了 render 属性 自定义展示

//自定义列表【工作时间】列的展现内容。//最后一行展示【总产量】
function renderWorkTimeColumn(cell, value, record, column, summary) {    //summary  总结

    //页面对应列有 summarytype="custom" 这个属性,所以每行先进 if 判断一下有没有 summary ,如果没有,就走else
    if (summary) {
        $(cell).html("计算中...");

        //获取当前数据源
        var report = DataStoreMgr.get("reportDataStore");

        if (report.options.sqlConstraint) {

            Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.GetIronAmount", [sqlConstraint = report.options.sqlConstraint], {
                mask: false, callback: function (res) {
                    if (!Nst.Ajax.checkResult(res)) return;

                    //如果保留两位小数,可以使用 round 函数   ("产量:" + Nst.round(res.value, 2))
                    $(cell).html("总产量: " + res.value)
                }
            });
        }
    }
    //从新写当前列的展示内容,如果有日期,注意设置日期格式
    else {
        var label = document.createElement("label");
        var sampleNoTime = record["SampleNoTime"];
        $(label).html(Nst.formatDate(sampleNoTime, "Y-M-D"));

        $(cell).html("");
        $(cell).append(label);
    }
}

//自定义列表【炉座号】列的展现内容。//最后一行展示【合格产量】
function renderStoveNoColumn(cell, value, record, column, summary) {

    if (summary) {
        $(cell).html("计算中...");

        //获取当前数据源
        var report = DataStoreMgr.get("reportDataStore");

        if (report.options.sqlConstraint) {

            Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.GetQualifiedAmount", [sqlConstraint = report.options.sqlConstraint], {
                mask: false, callback: function (res) {
                    if (!Nst.Ajax.checkResult(res)) return;

                    $(cell).html("合格产量: " + res.value)
                }
            });
        }
    }
    else {
        var label = document.createElement("label");
        var StoveNo = record["StoveNo"];
        //不用写格式的,就直接把该对象传过来就行了
        $(label).html(StoveNo);

        $(cell).html("");
        $(cell).append(label);
    }
}

//自定义列表【班次】列的展现内容。//最后一行展示【优质产量】
function renderTeamNoColumn(cell, value, record, column, summary) {

    if (summary) {
        $(cell).html("计算中...");

        //获取当前数据源
        var report = DataStoreMgr.get("reportDataStore");

        if (report.options.sqlConstraint) {

            Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.GetExcellentAmount", [sqlConstraint = report.options.sqlConstraint], {
                mask: false, callback: function (res) {
                    if (!Nst.Ajax.checkResult(res)) return;

                    $(cell).html("优质产量: " + res.value)
                }
            });
        }
    }
    else {
        var label = document.createElement("label");
        var TeamNo = record["TeamNo"];
        
        $(label).html(TeamNo);

        $(cell).html("");
        $(cell).append(label);
    }
}

//自定义列表【铁次】列的展现内容。//最后一行展示【无样产量】
function renderTimesColumn(cell, value, record, column, summary) {

    if (summary) {
        $(cell).html("计算中...");

        //获取当前数据源
        var report = DataStoreMgr.get("reportDataStore");

        if (report.options.sqlConstraint) {

            Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.GetNullSpecimenAmount", [sqlConstraint = report.options.sqlConstraint], {
                mask: false, callback: function (res) {
                    if (!Nst.Ajax.checkResult(res)) return;

                    $(cell).html("无样产量: " + res.value)
                }
            });
        }
    }
    else {
        var label = document.createElement("label");
        var Times = record["Times"];

        $(label).html(Times);

        $(cell).html("");
        $(cell).append(label);
    }
}

//自定义列表【包号】列的展现内容。//最后一行展示【合格率】
function renderPackageNumColumn(cell, value, record, column, summary) {

    if (summary) {
        $(cell).html("计算中...");

        //获取当前数据源
        var report = DataStoreMgr.get("reportDataStore");

        if (report.options.sqlConstraint) {

            Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.PercentOfPass", [sqlConstraint = report.options.sqlConstraint], {
                mask: false, callback: function (res) {
                    if (!Nst.Ajax.checkResult(res)) return;

                    $(cell).html("合格率: " + res.value + "%")
                }
            });
        }  
    }
    else {
        var label = document.createElement("label");
        var PackageNum = record["PackageNum"];

        $(label).html(PackageNum);

        $(cell).html("");
        $(cell).append(label);
    }
}

//自定义列表【样品编码】列的展现内容。//最后一行展示【优质率】
function renderSampleCodeColumn(cell, value, record, column, summary) {

    if (summary) {
        $(cell).html("计算中...");

        //获取当前数据源
        var report = DataStoreMgr.get("reportDataStore");

        if (report.options.sqlConstraint) {

            Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.PercentOfExcellent", [sqlConstraint = report.options.sqlConstraint], {
                mask: false, callback: function (res) {
                    if (!Nst.Ajax.checkResult(res)) return;

                    $(cell).html("优质率: " + res.value + "%")
                }
            });
        }
    }
    else {
        var label = document.createElement("label");
        var SampleCode = record["SampleCode"];

        $(label).html(SampleCode);

        $(cell).html("");
        $(cell).append(label);
    }
}

//自定义列表【S】列的展现内容。//最后一行展示【炉温稳定率】
function renderSColumn(cell, value, record, column, summary) {

    if (summary) {
        $(cell).html("计算中...");

        //获取当前数据源
        var report = DataStoreMgr.get("reportDataStore");

        if (report.options.sqlConstraint) {

            Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.PercentOfStabilization", [sqlConstraint = report.options.sqlConstraint], {
                mask: false, callback: function (res) {
                    if (!Nst.Ajax.checkResult(res)) return;

                    $(cell).html("炉温稳定率: " + res.value + "%")
                }
            });
        }
    }
    else {
        var label = document.createElement("label");
        var S = record["S"];

        $(label).html(S);

        $(cell).html("");
        $(cell).append(label);
    }
}

//自定义列表【Si】列的展现内容。//最后一行展示【一般质量事故】
function renderSiColumn(cell, value, record, column, summary) {

    if (summary) {
        $(cell).html("计算中...");

        //获取当前数据源
        var report = DataStoreMgr.get("reportDataStore");

        if (report.options.sqlConstraint) {

            Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.GeneralQualityAccident", [sqlConstraint = report.options.sqlConstraint], {
                mask: false, callback: function (res) {
                    if (!Nst.Ajax.checkResult(res)) return;

                    $(cell).html("一般质量事故: " + res.value)
                }
            });
        }
    }
    else {
        var label = document.createElement("label");
        var Si = record["Si"];

        $(label).html(Si);

        $(cell).html("");
        $(cell).append(label);
    }
}


//自定义列表【铁重(t)】列的展现内容。//最后一行展示【重大质量事故】
function renderIronWeightColumn(cell, value, record, column, summary) {

    if (summary) {
        $(cell).html("计算中...");

        //获取当前数据源
        var report = DataStoreMgr.get("reportDataStore");

        if (report.options.sqlConstraint) {

            Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.ImportantQualityAccident", [sqlConstraint = report.options.sqlConstraint], {
                mask: false, callback: function (res) {
                    if (!Nst.Ajax.checkResult(res)) return;

                    $(cell).html("重大质量事故: " + res.value)
                }
            });
        }
    }
    else {
        var label = document.createElement("label");
        var IronWeight = record["IronWeight"];

        $(label).html(IronWeight);

        $(cell).html("");
        $(cell).append(label);
    }
}

//自定义列表【是否剔除】列的展现内容。//最后一行展示【特大质量事故】
function renderEliminateNameColumn(cell, value, record, column, summary) {

    if (summary) {
        $(cell).html("计算中...");

        //获取当前数据源
        var report = DataStoreMgr.get("reportDataStore");

        if (report.options.sqlConstraint) {

            Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.VeryBigQualityAccident", [sqlConstraint = report.options.sqlConstraint], {
                mask: false, callback: function (res) {
                    if (!Nst.Ajax.checkResult(res)) return;

                    $(cell).html("特大质量事故: " + res.value)
                }
            });
        }
    }
    else {
        var label = document.createElement("label");
        var Eliminate = record["EliminateName"];

        $(label).html(Eliminate);

        $(cell).html("");
        $(cell).append(label);
    }
}

      也是自定义列表里的方法——“标红出格品”

//自定义列表【判定结果】列的展现内容,并把"出格品"------标红------。 //最后一行展示【严重质量事故】
function renderDecideResultColumn(cell, value, record, column, summary) {

    if (summary) {
        
        $(cell).html("计算中...");

        //获取当前数据源
        var report = DataStoreMgr.get("reportDataStore");

        if (report.options.sqlConstraint) {
            
            Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.SeverityQualityAccident", [sqlConstraint = report.options.sqlConstraint], {
                mask: false, callback: function (res) {
                    if (!Nst.Ajax.checkResult(res)) return;

                    $(cell).html("严重质量事故: " + res.value)
                }
            });
        }
    }
    else {
        //使用js在页面创建一个 span
        var span = document.createElement("span");
        var DecideResult = record["DecideResult"];

        $(span).html(DecideResult);

        $(span).val(value);
        $(span).html(value);

        $(cell).html("");
        $(cell).append(span);

        //变色
        if (DecideResult == "出格品") {
            $(cell).addClass("red");
        } else {
            $(cell).removeClass("red");
        }
    } 
}

6. 点击【导出】所执行的方法

//点击【导出】按钮。
function clickExpBtn() {

    //先获取数据源,因为 查询按钮 所执行的查询条件,是在该数据源中查询的
    var reportDataStore = DataStoreMgr.get("reportDataStore");
    
    //根据数据源,获取当前页面的查询条件的SQL语句,该sql语句,在业务逻辑层BL中,自动生成的 查询方法,会拼接该 SQL语句,再去数据库查询,
    //然后再用  $.toJSON 压缩成json数组
    var jsonData = $.toJSON({
        //C#的数据字典 是这样的:Dictionary<[key], [value]>  //有点类似于java中的Map  //冒号 左边是 key, 右边是 value 
        constraint: reportDataStore.options.constraint,
        values: reportDataStore.options.values
    });

    //也是根据数据源,获取SQL语句,只不过该SQL语句,是用来,在BL中拼接,我们自己写的方法中的SQL语句
    var jsonSql = $.toJSON({sql: reportDataStore.options.sqlConstraint,  values: reportDataStore.options.values});
    
    //通过 iframe标签,嵌入到指定路径的页面,并以get请求方式,把上面获取到的 SQL语句,传给指定路径的页面
    $("#expIframe").attr("src", "/QDC/Excel/AIronMakeReport.aspx?jsonData=" + jsonData + "&jsonSql=" + jsonSql);
    
}

三. 前端的样式,即 .css文件

.red *{
    background: #F6CECE;
    color: red !important;
}

#expIframe {
    display: none;
}

四. 页面CodeFile里的内容

这里边是为了让【是否剔除】默认选”否“,用到了另一个表的字段

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

//在打开当前页面的时候,就会自动执行该类中的方法
public partial class QDC_AIronMakeReport : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //连接数据库
        using (NetStar.Orm.DataContext.OpenDataAccess())
        {
            //new一个数据字典对象,这里其实是new了另一个业务处理BL的类,调该类的方法查询另一个表的内容
            var dataDict = new RFN.BL.HRM.DataDict();

            //从数据字典获取 "否"
            var eliminateInfo = dataDict.SelectSingleBy("[ParentCode]=? AND [Code]=? AND [Enabled]=?", null, "true_or_false", "false", true);

            //获取到 "否" 以后,通过这种形式,传给页面对应的 .js文件
            NetStar.Ajax.AjaxCore.RegisterJavaScript(this, new Dictionary<string, object>
            {
                {"eliminateId", eliminateInfo.Id}
            });
        }
    }
}

五. 导出用的页面

1. 创建一个同名的页面,也是 .aspx后缀的文件,页面内容不用动

2. 导出Excel功能在该页面CodeFile对应的文件里写

using Aspose.Cells;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class QDC_Excel_AIronMakeReport : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //获取 .js 文件 传过来带有 sql 语句的 json数组
        var jsonData = this.Request["jsonData"];
        var jsonSql = this.Request["jsonSql"];

        //把json数组 转换成数据字典Dictionary,它的结构是这样的:Dictionary<[key], [value]>,类似于java中的查找表Map
        var dict = (Dictionary<string, object>)NetStar.Json.JsonConverter.FromJson<Dictionary<string, object>>(jsonData);
        var jictSql = (Dictionary<string, object>)NetStar.Json.JsonConverter.FromJson<Dictionary<string, object>>(jsonSql);

        using (var dataAccess = NetStar.Orm.DataContext.OpenDataAccess())
        {
            //Workbook对象是一个Microsoft Excel工作簿
            var workbook = new Workbook();
            var worksheet = workbook.Worksheets[0];

            //在第一行设置所有的列, [行数,列数]
            worksheet.Cells[0, 0].PutValue("序号");
            worksheet.Cells[0, 1].PutValue("工作时间");
            worksheet.Cells[0, 2].PutValue("炉座号");
            worksheet.Cells[0, 3].PutValue("班次");
            worksheet.Cells[0, 4].PutValue("铁次");
            worksheet.Cells[0, 5].PutValue("包号");
            worksheet.Cells[0, 6].PutValue("样品编码");
            worksheet.Cells[0, 7].PutValue("S");
            worksheet.Cells[0, 8].PutValue("Si");
            worksheet.Cells[0, 9].PutValue("判定结果");
            worksheet.Cells[0, 10].PutValue("铁重(t)");
            worksheet.Cells[0, 11].PutValue("是否剔除");
            worksheet.Cells[0, 12].PutValue("剔除原因");
            
            //new一个业务逻辑层BL的对象
            var aIronMakeExperiment = new RFN.BL.QDC.AIronMakeExperiment();

            //调BL中自动生成的,带参数的,查询方法,从数据库中查数据,参数是从 .js文件中传过来的,框架中的 ORDER BY 排序里多个Id,所以在这里加个 [Id]
            var irons = aIronMakeExperiment.SelectBy((string)dict["constraint"], "[SampleNoTime] DESC,[Id]", (object[])dict["values"]);

            //查出来的许多条数据,需要一行一行的写在Excel表中,所以使用for循环来写
            for (int i = 0; i < irons.Count; i++)
            {
                int row = i + 1;
                
                var iron = irons[i];
                
                //按需求,把 S 和 Si 保留指定位数的小数
                double S = Math.Round(Convert.ToSingle(iron.SActual == null ? "0" : iron.SActual), 3);//保留3位小数
                double Si = Math.Round(Convert.ToSingle(iron.SiActual ?? "0"), 2);//保留2位小数

                //声明一个判定结果的字符串
                string result = "";
                if (S == 0 || Si == 0)
                {
                    result = "无样";
                }
                else if (S <= 0.03 && 0.2 <= Si && Si <= 0.6)
                {
                    result = "优质品";
                }
                else if (S <= 0.07 && Si <= 0.8)
                {
                    result = "合格品";
                }
                else if (S > 0.07 || Si > 0.8)
                {
                    result = "出格品";
                }
                
                worksheet.Cells[row, 0].PutValue(row);//序号
                worksheet.Cells[row, 1].PutValue(iron.SampleNoTime.ToString("yyyy-MM-dd"));//工作时间,需要注意格式的转换
                worksheet.Cells[row, 2].PutValue(iron.StoveNo);//炉座号
                worksheet.Cells[row, 3].PutValue(iron.TeamNo);//班次
                worksheet.Cells[row, 4].PutValue(iron.Times);//铁次
                worksheet.Cells[row, 5].PutValue(iron.PackageNum);//包号
                worksheet.Cells[row, 6].PutValue(iron.SampleCode);//样品编码
                worksheet.Cells[row, 7].PutValue(S);//硫
                worksheet.Cells[row, 8].PutValue(Si);//硅
                worksheet.Cells[row, 9].PutValue(result);//判定结果
                worksheet.Cells[row, 10].PutValue(iron.IronWeight);//铁重(t)
                worksheet.Cells[row, 11].PutValue(iron.EliminateName);//是否剔除
                worksheet.Cells[row, 12].PutValue(iron.WeedOoutReason);//剔除原因
            }
            //循环写完后,irons.Count + 1 就是最下边的行
            worksheet.Cells[irons.Count + 1, 0].PutValue("汇总");
            //调用BL中,自己写的方法。参数也是从 .js文件传过来的,这里 ["  "] 中写的是 key 值
            worksheet.Cells[irons.Count + 1, 1].PutValue("总产量:" + aIronMakeExperiment.GetIronAmount((string)jictSql["sql"]));
            worksheet.Cells[irons.Count + 1, 2].PutValue("合格产量:" + aIronMakeExperiment.GetQualifiedAmount((string)jictSql["sql"]));
            worksheet.Cells[irons.Count + 1, 3].PutValue("优质产量:" + aIronMakeExperiment.GetExcellentAmount((string)jictSql["sql"]));
            worksheet.Cells[irons.Count + 1, 4].PutValue("无样产量:" + aIronMakeExperiment.GetNullSpecimenAmount((string)jictSql["sql"]));
            worksheet.Cells[irons.Count + 1, 5].PutValue("合格率:" + aIronMakeExperiment.PercentOfPass((string)jictSql["sql"]) + " %");
            worksheet.Cells[irons.Count + 1, 6].PutValue("优质率:" + aIronMakeExperiment.PercentOfExcellent((string)jictSql["sql"]) + " %");
            worksheet.Cells[irons.Count + 1, 7].PutValue("炉温稳定率:" + aIronMakeExperiment.PercentOfStabilization((string)jictSql["sql"]) + " %");
            //worksheet.Cells[irons.Count + 1, 8].PutValue("一般事故:" + 0);
            //worksheet.Cells[irons.Count + 1, 9].PutValue("严重事故:" + 0);
            //worksheet.Cells[irons.Count + 1, 10].PutValue("重大事故:" + 0);
            //worksheet.Cells[irons.Count + 1, 11].PutValue("特大事故:" + 0);


            //最后保存导出,至此,导出按钮所触发的功能实现完成
            workbook.Save(this.Response, HttpUtility.UrlEncode("铁水质量报表.xls"), ContentDisposition.Attachment, new XlsSaveOptions(SaveFormat.Excel97To2003));
        }
    }
}

(二)后端

1.自动生成的实体类 .BM文件中,添加了三个属性

namespace RFN.BM.QDC
{
    /// <summary>
    /// 一炼铁化学实验业务实体类。
    /// </summary>
    [NetStar.Log.DataLog("一炼铁化学实验")]
    [NetStar.Orm.Table("T_QDC_A_IRONMAKE_EXPERIMENT", "T0")]
    public partial class AIronMakeExperimentInfo
    {
        #region Constructor

        /// <summary>
        /// 构造函数。
        /// </summary>
        public AIronMakeExperimentInfo()
        {
        }

        #endregion

        #region Entity Properties
        /// <summary>
        /// 获取或设置铁重。
        /// </summary>
        [NetStar.Log.DataLog("铁重")]
        [NetStar.Orm.Column("T0.IRON_WEIGHT")]
        public virtual decimal? IronWeight { get; set; }

        /// <summary>
        /// 获取或设置是否剔除。
        /// </summary>
        [NetStar.Log.DataLog("是否剔除")]
        [NetStar.Orm.Column("T0.ELIMINATE_ID")]
        public virtual string EliminateId { get; set; }

        /// <summary>
        /// 获取或设置剔除原因。
        /// </summary>
        [NetStar.Log.DataLog("剔除原因")]
        [NetStar.Orm.Column("T0.WEED_OUT_REASON")]
        public virtual string WeedOoutReason { get; set; }
    }
}

2. 创建一个同名的实体类,即部分类,便于在前端展示数据

using System;

namespace RFN.BM.QDC
{
    [NetStar.Orm.Join(@"   LEFT JOIN T_STM_DATA_DICT T1 ON T0.ELIMINATE_ID = T1.ID ")]
    public partial class AIronMakeExperimentInfo
    {
        /// <summary>
        /// 获取或设置是否剔除。    //让该属性获得 T1 (数据字典)表 NAME 的值,别名为 ELIMINATE_NAME
        /// </summary>
        [NetStar.Orm.Column("T1.NAME", "ELIMINATE_NAME", false)]
        public virtual string EliminateName { get; set; }

        /// <summary>
        /// 获取或设置判定结果。
        /// </summary>
        public virtual string DecideResult { get; set; }

        /// <summary>
        /// 获取或设置S实际值。
        /// </summary>
        public virtual double S { get; set; }

        /// <summary>
        /// 获取或设置Si实际值。
        /// </summary>
        public virtual double Si { get; set; }
    }
}

3. 自动生成的业务逻辑层BL中,添加Handler和其它我们需要的的方法,其中要求Handler必须是void

namespace RFN.BL.QDC
{
    /// <summary>
    /// 一炼铁化学实验业务处理类。
    /// </summary>
    [NetStar.Ajax.AjaxClass]
    public partial class AIronMakeExperiment : NetStar.App.DataContext
    {
        /// <summary>
        /// 总产量 = 当前数据源中,铁水产量总和,包含剔除的重量
        /// </summary>
        /// <param name="aIronMakeExperimentInfo">实体类对象</param>
        [NetStar.Ajax.AjaxMethod]
        [NetStar.App.DataAccess(true)]
        public virtual decimal GetIronAmount(string sqlConstraint)
        {
            decimal result = 0;

            if (sqlConstraint != null)
            {
                //下边的SQL查询语句,是所有的"铁重"求和,包括【剔除】和【无样】的重量
                var sql = "select sum(nvl(t.Iron_Weight,0)) from T_QDC_A_IRONMAKE_EXPERIMENT t " + " where " + sqlConstraint;

                var ironAmount = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sql);

                result = ironAmount == DBNull.Value ? 0 : (decimal)ironAmount;
            }

            return result;
        }

        /// <summary>
        /// 合格产量 = 当前数据源中,根据质量判定为合格的产量,不包含剔除的重量 也不包含无样
        /// </summary>
        /// <param name="aIronMakeExperimentInfo">实体类对象</param>
        [NetStar.Ajax.AjaxMethod]
        [NetStar.App.DataAccess(true)]
        public virtual decimal GetQualifiedAmount(string sqlConstraint)
        {
            decimal result = 0;

            if (sqlConstraint != null)
            {
                //不包含 无样,也 不包含 剔除的重量
                var sql = "select sum(nvl(t.Iron_Weight,0)) from T_QDC_A_IRONMAKE_EXPERIMENT t LEFT JOIN T_STM_DATA_DICT T1 ON T.ELIMINATE_ID = T1.ID " + " where " + sqlConstraint + "and t1.code != 'true' and t.s_actual <= 0.07  and t.Si_Actual <= 0.8 and t.s_actual is not null and t.s_actual != 0 and t.Si_actual is not null and t.Si_actual != 0";

                var qualifiedAmount = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sql);

                result = qualifiedAmount == DBNull.Value ? 0 : (decimal)qualifiedAmount;
            }
            return result;
        }

        /// <summary>
        /// 优质产量,根据质量判定为优质的产量,不包括剔除重量
        /// </summary>
        /// <param name="aIronMakeExperimentInfo">实体类对象</param>
        [NetStar.Ajax.AjaxMethod]
        [NetStar.App.DataAccess(true)]
        public virtual decimal GetExcellentAmount(string sqlConstraint)
        {
            decimal result = 0;

            if (sqlConstraint != null)
            {
                var sql = "select sum(nvl(t.Iron_Weight,0)) from T_QDC_A_IRONMAKE_EXPERIMENT t LEFT JOIN T_STM_DATA_DICT T1 ON T.ELIMINATE_ID = T1.ID " + " where " + sqlConstraint + "and t1.code != 'true' and t.s_actual <= 0.03 and 0.2 <= t.Si_Actual and t.Si_Actual <= 0.6 and t.s_actual is not null and t.s_actual != 0 and t.Si_actual is not null and t.Si_actual != 0";

                var excellentAmount = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sql);

                result = excellentAmount == DBNull.Value ? 0 : (decimal)excellentAmount;
            }

            return result;
        }

        /// <summary>
        /// 无样产量,取不到样品的重量,即 S 和 Si 的值为 0 或为空的重量,不包括剔除重量
        /// </summary>
        /// <param name="aIronMakeExperimentInfo">实体类对象</param>
        [NetStar.Ajax.AjaxMethod]
        [NetStar.App.DataAccess(true)]
        public virtual decimal GetNullSpecimenAmount(string sqlConstraint)
        {
            decimal result = 0;

            if (sqlConstraint != null)
            {
                var sql = "select sum(nvl(t.Iron_Weight,0)) from T_QDC_A_IRONMAKE_EXPERIMENT t LEFT JOIN T_STM_DATA_DICT T1 ON T.ELIMINATE_ID = T1.ID " + " where " + sqlConstraint + "and t1.code != 'true' and ((t.S_actual is null and t.Si_actual is null) or (t.S_actual = 0 and t.Si_actual = 0) or (t.s_actual is null and t.Si_actual = 0) or (t.S_actual = 0 and t.Si_actual is null))";

                var noneSpecimen = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sql);

                result = noneSpecimen == DBNull.Value ? 0 : (decimal)noneSpecimen;
            }

            return result;
        }

        /// <summary>
        /// 合格率 = 合格产量/总产量
        /// </summary>
        /// <param name="aIronMakeExperimentInfo">实体类对象</param>
        [NetStar.Ajax.AjaxMethod]
        [NetStar.App.DataAccess(true)]
        public virtual decimal PercentOfPass(string sqlConstraint)
        {
            decimal pass = GetQualifiedAmount(sqlConstraint);
            decimal all = GetIronAmount(sqlConstraint);
            if (all == 0)
            {
                return 0;
            }
            decimal result = Math.Round((pass / all) * 100, 2);
            return result;
        }

        /// <summary>
        /// 优质率 = 优质重量/(总产量-无样重量)
        /// </summary>
        /// <param name="aIronMakeExperimentInfo">实体类对象</param>
        [NetStar.Ajax.AjaxMethod]
        [NetStar.App.DataAccess(true)]
        public virtual decimal PercentOfExcellent(string sqlConstraint)
        {
            decimal excellent = GetExcellentAmount(sqlConstraint);//优质重量
            decimal all = GetIronAmount(sqlConstraint);           //总产量
            decimal none = GetNullSpecimenAmount(sqlConstraint);  //无样重量
            if ((all - none) == 0)
            {
                return 0;
            }
            decimal result = Math.Round((excellent / (all - none)) * 100, 2);

            return result;
        }
        

        /// <summary>
        /// 炉温稳定率 = 取值范围内的 Si个数 / Si 总个数
        /// </summary>
        /// <param name="aIronMakeExperimentInfo">实体类对象</param>
        [NetStar.Ajax.AjaxMethod]
        [NetStar.App.DataAccess(true)]
        public virtual decimal PercentOfStabilization(string sqlConstraint)
        {
            decimal Si = 0;
            decimal SiAll = 0;
            if (sqlConstraint != null)
            {
                var sqlCountSi = "select count(t.Si_Actual) from T_QDC_A_IRONMAKE_EXPERIMENT t " + " where " + sqlConstraint + " and 0.2 <= t.Si_Actual and t.Si_Actual <= 0.6";
                var sqlCountSiAll = "select count(*) from T_QDC_A_IRONMAKE_EXPERIMENT t " + " where " + sqlConstraint;

                var countSi = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sqlCountSi);
                var countSiAll = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sqlCountSiAll);

                Si = countSi == DBNull.Value ? 0 : (decimal)countSi;
                SiAll = countSiAll == DBNull.Value ? 0 : (decimal)countSiAll;
            }
            
            //处理分母可能为 0 的情况
            if (SiAll == 0)
            {
                return 0;
            }

            decimal result = Math.Round((Si / SiAll) * 100, 2);
            return result;
        }

        /// <summary>
        /// 一般质量事故:同一炉座,连续的2个铁次的出格铁,或24小时内累计出现4-7个铁次的出格铁
        /// </summary>
        /// <param name="aIronMakeExperimentInfo">实体类对象</param>
        [NetStar.Ajax.AjaxMethod]
        [NetStar.App.DataAccess(true)]
        public virtual decimal GeneralQualityAccident(string sqlConstraint)
        {
            return 0;
        }

        /// <summary>
        /// 单独查包号:出格品的“包号”哈希表(id,包号),返回
        /// </summary>
        /// <param name="aIronMakeExperimentInfo">实体类对象</param>
        [NetStar.Ajax.AjaxMethod]
        [NetStar.App.DataAccess(true)]
        public virtual Hashtable PackageNum(string sqlConstraint)
        {
            Hashtable ht = new Hashtable();
            decimal idResult = 0;
            decimal packageResult = 0;
            if (sqlConstraint != null)
            {
                var sqlId = "select t.id from t_qdc_a_ironmake_experiment t " + " where " + sqlConstraint + " and (t.s_Actual > 0.07 or t.Si_Actual > 0.8)";
                var sqlPackage = "select t.package_num from t_qdc_a_ironmake_experiment t " + " where " + sqlConstraint + " and (t.s_Actual > 0.07 or t.Si_Actual > 0.8)";
                //var dataSet = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteQuery(sql);

                var id = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sqlId);
                var package = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sqlPackage);

                idResult = id == DBNull.Value ? -1 : (decimal)id;
                packageResult = package == DBNull.Value ? -1 : (decimal)package;
            }
            ht.Add(idResult, packageResult);
            return ht;
        }

        /// <summary>
        /// 单独查铁次:出格品的“铁次”哈希表(id,铁次)
        /// </summary>
        /// <param name="aIronMakeExperimentInfo">实体类对象</param>
        [NetStar.Ajax.AjaxMethod]
        [NetStar.App.DataAccess(true)]
        public virtual Hashtable IronTimes(string sqlConstraint)
        {
            Hashtable ht = new Hashtable();
            decimal idResult = 0;
            decimal ironTimesResult = 0;
            if (sqlConstraint != null)
            {
                var sqlId = "select t.id from t_qdc_a_ironmake_experiment t " + " where " + sqlConstraint + " and (t.s_Actual > 0.07 or t.Si_Actual > 0.8)";
                var sqlPackage = "select t.times from t_qdc_a_ironmake_experiment t " + " where " + sqlConstraint + " and (t.s_Actual > 0.07 or t.Si_Actual > 0.8)";
                //var dataSet = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteQuery(sql);

                var id = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sqlId);
                var package = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sqlPackage);

                idResult = id == DBNull.Value ? 0 : (decimal)id;
                ironTimesResult = package == DBNull.Value ? 0 : (decimal)package;
            }
            ht.Add(idResult, ironTimesResult);
            return ht;
        }

        /// <summary>
        /// 严重质量事故:同一炉座,连续的3-4个铁次的出格铁,或24小时内累计出现8-11个铁次的出格铁
        /// </summary>
        /// <param name="aIronMakeExperimentInfo">实体类对象</param>
        [NetStar.Ajax.AjaxMethod]
        [NetStar.App.DataAccess(true)]
        public virtual decimal SeverityQualityAccident(string sqlConstraint)
        {
            return 0;
        }

        /// <summary>
        /// 重大质量事故:同一炉座,连续的5-6个铁次的出格铁,或24小时内累计出现12个铁次的出格铁
        /// </summary>
        /// <param name="aIronMakeExperimentInfo">实体类对象</param>
        [NetStar.Ajax.AjaxMethod]
        [NetStar.App.DataAccess(true)]
        public virtual decimal ImportantQualityAccident(string sqlConstraint)
        { 
            return 0;
        }

        /// <summary>
        /// 特大质量事故:同一炉座,连续的7个
        /// </summary>
        /// <param name="aIronMakeExperimentInfo">实体类对象</param>
        [NetStar.Ajax.AjaxMethod]
        [NetStar.App.DataAccess(true)]
        public virtual decimal VeryBigQualityAccident(string sqlConstraint)
        {
            decimal result = 0;

            return result;
        }

        /// <summary>
        /// Handler : 事件处理器。当前Handler的作用是处理判定结果,并把结果赋值给同名实体类的属性,顺便把S和Si保留小数
        /// </summary>
        /// <param name="aIronMakeExperimentInfo">参数</param>
        /// <returns> void 无返回值,采用赋值的形式,赋值给同名实体类的属性上</returns>
        public virtual void Handler(RFN.BM.QDC.AIronMakeExperimentInfo aIronMakeExperimentInfo)
        {
            float s_f = Convert.ToSingle(aIronMakeExperimentInfo.SActual == null ? "0" : aIronMakeExperimentInfo.SActual);
            
            //字符串转成double类型,再使用 Math.Round 函数保留小数
            double S = Math.Round(s_f, 3);//保留3位小数
            double Si = Math.Round(Convert.ToDouble(aIronMakeExperimentInfo.SiActual == null ? "0" : aIronMakeExperimentInfo.SiActual), 2);//保留2位小数
            
            //判断是否合格
            string result = "";
            if (S == 0 || Si == 0)
            {
                result = "无样";
            }
            else if (S <= 0.03 && 0.2 <= Si && Si <= 0.6)
            {
                result = "优质品";
            }
            else if (S <= 0.07 && Si <= 0.8)
            {
                result = "合格品";
            }
            else if (S > 0.07 || Si > 0.8)
            {
                result = "出格品";
            }

            //把判断结果,赋值给同名实体类的属性上
            aIronMakeExperimentInfo.DecideResult = result;
            aIronMakeExperimentInfo.S = S;
            aIronMakeExperimentInfo.Si = Si;
        }
        #endregion
    }
}

(三)Oracle数据库

添加了3个字段

1. 铁重

alter table T_QDC_A_IronMake_Experiment add Iron_Weight number(15,4);

2. 是否剔除,这个存的是对应另一个表的“true_or_false”的ID,回显的时候使用了两表联查。

alter table T_QDC_A_IronMake_Experiment add Eliminate number;

3. 剔除原因

alter table T_QDC_A_IronMake_Experiment add Weed_Out_Reason varchar2(500);

你已经落后身边的同学太多了,不付出比他人更努力的代价,是不可能脱颖而出的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值