void _bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            // 讀取課程
            _CourseRecord = K12.Data.Course.SelectByID(PrimaryKey);

            // 讀取班級
            _ClassIDNameDict.Clear();
            _ClassNameIDDict.Clear();
            List<K12.Data.ClassRecord> crList = K12.Data.Class.SelectAll();
            foreach (K12.Data.ClassRecord cr in crList)
            {
                _ClassIDNameDict.Add(cr.ID, cr.Name);
                _ClassNameIDDict.Add(cr.Name, cr.ID);
            }

            // 讀取教師
            _TeacherIDNameDict.Clear();
            _TeacherNameIDDict.Clear();
            List<K12.Data.TeacherRecord> trList = K12.Data.Teacher.SelectAll();
            foreach(K12.Data.TeacherRecord tr in trList)
            {
                string trName=tr.Name;
                if (!string.IsNullOrEmpty(tr.Nickname))
                    trName += "(" + tr.Nickname + ")";

                _TeacherIDNameDict.Add(tr.ID, tr.Name);
                if (!_TeacherNameIDDict.ContainsKey(trName))
                    _TeacherNameIDDict.Add(trName, tr.ID);
            }

            // 依課程ID 讀取授課教師
            _TCInstructRecordList.Clear();
            _TCInstructRecordList = GetTCInstructRecordByCourseID(PrimaryKey);
        }
Beispiel #2
0
        /*  當開始列印時:
         *      1. 對於每一個被選取的班級
         *          1.1 對於每一個被選取的科目:
         *              1.1.1 如果該科目是屬於該班級的課程,就取回該課程該次考試的全班分數。
         *          1.2. 對於該班的每一位學生:
         *              1.2.1 填上座號姓名
         *              1.2.2 對於每一被選取科目:
         *                  1.2.2.1    找出該學生在該課程的分數,並填上
         *              1.2.3 填上總分、平均、加權總分、加權平均、及排名的 Excel 公式。
         *
         * */

        private void btnPrint_Click(object sender, EventArgs e)
        {
            if (cboExams.SelectedItem == null)
            {
                return;
            }

            //Create a workbook
            Workbook book = new Workbook();

            book.Worksheets.Clear();
            book.Open(new MemoryStream(JHSchool.Permrec.Properties.Resources.班級定期評量));

            Style style = book.Worksheets["template"].Cells[4, 0].Style;

            for (byte b = 0; b < book.Worksheets["template2"].Cells.MaxColumn; b++)
            {
                book.Worksheets[0].Cells.CopyColumn(book.Worksheets["template2"].Cells, b, b);
            }

            string examID   = (cboExams.SelectedItem as K12.Data.ExamRecord).ID;
            string examName = (cboExams.SelectedItem as K12.Data.ExamRecord).Name;
            //0. 找出使用者選取的科目清單
            List <string> selectedSubjects = new List <string>();

            foreach (ListViewItem lvi in this.listViewEx1.CheckedItems)
            {
                selectedSubjects.Add(lvi.Text);
            }

            int rowNo = 0;

            //1. 對於每一個被選取的班級
            foreach (K12.Data.ClassRecord cls in K12.Data.Class.SelectByIDs(JHSchool.Class.Instance.SelectedKeys))
            {
                Range _Range1 = book.Worksheets["template"].Cells.CreateRange(0, 2, false);
                Range _Range2 = book.Worksheets["template"].Cells.CreateRange(2, 2, false);
                Range _Range3 = book.Worksheets["template"].Cells.CreateRange(4, 1, false);
                Range _Range4 = book.Worksheets["template"].Cells.CreateRange(5, 6, false);
                Range _Range6 = book.Worksheets["template"].Cells.CreateRange(11, 1, false);

                book.Worksheets[0].Cells.CreateRange(rowNo, 2, false).Copy(_Range1);
                book.Worksheets[0].Cells.CreateRange(rowNo + 2, 2, false).Copy(_Range2);
                book.Worksheets[0].Cells.CreateRange(rowNo + 4, 1, false).Copy(_Range3);


                //1.0 列印該班名稱及學生清單
                string className = cls.Name; //班級名稱

                //int rowNo = 4;
                book.Worksheets[0].Cells[rowNo, 0].PutValue(className + "  班級成績單");
                book.Worksheets[0].Cells[rowNo + 1, 0].PutValue(examName);
                rowNo += 5;
                book.Worksheets[0].Cells[rowNo - 1, 0].PutValue("學分數");

                int classTopRow = rowNo;  //開始填入第一筆資料的列數

                foreach (K12.Data.StudentRecord stud in cls.Students)
                {
                    //列印學生清單
                    book.Worksheets[0].Cells[rowNo, 0].PutValue(stud.SeatNo);
                    book.Worksheets[0].Cells[rowNo, 0].Style = style;
                    book.Worksheets[0].Cells[rowNo, 1].PutValue(stud.Name);
                    book.Worksheets[0].Cells[rowNo, 1].Style = style;

                    rowNo += 1;
                }


                List <string> selectedCourseIDs = new List <string>();
                //1.1 對於該班的課程中

                if (classCourses.Count != 0)
                {
                    foreach (K12.Data.CourseRecord course in this.classCourses[cls.ID])
                    {
                        //找出符合使用者有選取科目的課程清單
                        if (selectedSubjects.Contains(course.Subject))
                        {
                            selectedCourseIDs.Add(course.ID);
                        }
                    }
                }


                //取回這些課程的所有學生,在指定評量的成績
                List <JHSchool.Data.JHSCETakeRecord> scores = JHSchool.Data.JHSCETake.SelectByCourseAndExam(selectedCourseIDs, examID);
                //將所有成績物件轉換成 <CourseID-StudentID, Score> 的Dictionary物件,以便後續查詢
                Dictionary <string, string> allScores = new Dictionary <string, string>();
                foreach (JHSchool.Data.JHSCETakeRecord score in scores)
                {
                    allScores.Add(score.RefCourseID + "-" + score.RefStudentID, score.Score.ToString());
                }

                //Dictionary<string, decimal> studentSum = new Dictionary<string, decimal>();


                int colIndex = 2;
                //列印該班每個課程的成績
                foreach (string courseID in selectedCourseIDs)
                {
                    K12.Data.CourseRecord course = K12.Data.Course.SelectByID(courseID);

                    rowNo = classTopRow;

                    book.Worksheets[0].Cells[rowNo - 3, colIndex].PutValue(course.Subject);                                                                                                  //科目名稱
                    book.Worksheets[0].Cells[rowNo - 1, colIndex].PutValue(course.Credit == null ? Framework.Decimal.GetString(course.Period) : Framework.Decimal.GetString(course.Credit)); //學分數

                    foreach (K12.Data.StudentRecord stud in cls.Students)
                    {
                        string score = "";
                        if (allScores.ContainsKey(courseID + "-" + stud.ID))
                        {
                            score = allScores[courseID + "-" + stud.ID];
                        }

                        if (!string.IsNullOrEmpty(score))
                        {
                            book.Worksheets[0].Cells[rowNo, colIndex].PutValue(double.Parse(score));    //填分數
                            book.Worksheets[0].Cells[rowNo, colIndex].Style = style;
                        }
                        rowNo += 1;
                    }

                    rowNo += 1;

                    book.Worksheets[0].Cells[rowNo, 0].PutValue("各科平均");
                    string colName             = ((char)(65 + colIndex)).ToString();
                    string averageRangeFormula = string.Format("=AVERAGE({0}{1}:{0}{2})", colName, (classTopRow + 1).ToString(), (rowNo - 1).ToString());
                    //book.Worksheets[0].Cells[rowNo, colIndex].IsFormula = true;
                    book.Worksheets[0].Cells[rowNo, colIndex].Formula = averageRangeFormula;


                    colIndex += 1;
                }

                //填入加權平均和排名,如果使用Excel公式,會很複雜,所以在程式中算出來
                book.Worksheets[0].Cells[classTopRow - 3, colIndex].PutValue("加權平均");
                book.Worksheets[0].Cells[classTopRow - 3, colIndex + 1].PutValue("排名");
                int row = classTopRow;
                foreach (K12.Data.StudentRecord stud in cls.Students)
                {
                    int   totalCredit      = 0;
                    float totalWeightScore = 0f;
                    for (int col = 2; col < colIndex; col++)
                    {
                        if (book.Worksheets[0].Cells[row, col].StringValue != "")
                        {
                            int credit = Framework.Int.Parse(book.Worksheets[0].Cells[classTopRow - 1, col].StringValue);
                            totalCredit      += credit;
                            totalWeightScore += book.Worksheets[0].Cells[row, col].FloatValue * credit;
                        }
                    }
                    float weightAverageScore = (totalCredit == 0) ? 0f : (totalWeightScore / totalCredit);
                    book.Worksheets[0].Cells[row, colIndex].PutValue(weightAverageScore);   //加權平均
                    book.Worksheets[0].Cells[row, colIndex].Style = style;

                    //排名,Excel公式單純,交給Excel去算。
                    string colName     = ((char)(65 + colIndex)).ToString();
                    string rankFormula = string.Format("=RANK({0}{1}, ${0}${2}:${0}${3})", colName, (row + 1).ToString(), (classTopRow + 1).ToString(), (rowNo - 1).ToString());
                    book.Worksheets[0].Cells[row, colIndex + 1].Formula = rankFormula;   //排名
                    book.Worksheets[0].Cells[row, colIndex + 1].Style   = style;
                    row += 1;
                }



                //加入頁尾
                book.Worksheets[0].Cells.CreateRange(rowNo + 1, 6, false).Copy(_Range4);

                book.Worksheets[0].Cells.CreateRange(rowNo + 7, 1, false).Copy(_Range6);
                book.Worksheets[0].Cells[rowNo + 7, 0].PutValue("列印日期:" + DateTime.Now.Date.ToShortDateString());
                rowNo += 8;

                book.Worksheets[0].HPageBreaks.Add(rowNo, 100);

                book.Worksheets["template"].IsVisible  = false;
                book.Worksheets["template2"].IsVisible = false;
            }

            book.Worksheets.ActiveSheetIndex = 0;

            #region
            try
            {
                SmartSchool.Customization.PlugIn.Global.SetStatusBarMessage("請選擇儲存位置", 100);

                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.Filter   = "Excel (*.xls)|*.xls|所有檔案 (*.*)|*.*";
                saveFileDialog.FileName = "班級考試成績單";
                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    book.Save(saveFileDialog.FileName);

                    if (saveFileDialog.ShowDialog() == DialogResult.Yes)
                    {
                        Process.Start(saveFileDialog.FileName);
                    }
                }
                else
                {
                    FISCA.Presentation.Controls.MsgBox.Show("檔案尚未儲存");
                }
            }
            catch
            {
                FISCA.Presentation.Controls.MsgBox.Show("檔案儲存錯誤,請檢查檔案是否開啟中!!");
            }

            SmartSchool.Customization.PlugIn.Global.SetStatusBarMessage("已完成");
        }
Beispiel #3
0
        private void Worker_DoWork(object sender, DoWorkEventArgs e)
        {
            _worker.ReportProgress(0);

            // 以下補考邏輯 仿 原高中成績系統  SmartSchool.Evaluation 處理方式
            #region 取得所有學生以及補考資訊

            AccessHelper         helper      = new AccessHelper();
            List <StudentRecord> allStudents = new List <StudentRecord>();
            List <ClassRecord>   allClasses  = helper.ClassHelper.GetClass(_classIDList);

            //WearyDogComputer computer = new WearyDogComputer();

            Utility utility = new Utility();

            double currentClass = 1;
            double totalClasses = allClasses.Count;

            foreach (ClassRecord aClass in allClasses)
            {
                List <StudentRecord> classStudents = aClass.Students;
                //computer.FillSemesterSubjectScoreInfoWithResit(helper, true, classStudents);

                utility.FillSemesterSubjectScoreInfoWithResit(helper, true, classStudents);

                allStudents.AddRange(classStudents);

                // 填上學生的修課紀錄
                helper.StudentHelper.FillAttendCourse(int.Parse(_schoolYear), int.Parse(_semester), classStudents);

                _worker.ReportProgress((int)(currentClass++ *60.0 / totalClasses));
            }

            double currentStudent = 1;
            double totalStudents  = allStudents.Count;

            #endregion


            #region 取得課程資訊 (授課教師)

            List <K12.Data.CourseRecord> courseList = K12.Data.Course.SelectBySchoolYearAndSemester(int.Parse(_schoolYear), int.Parse(_semester));

            #endregion

            Dictionary <string, Dictionary <string, string> >         subjectInfo        = new Dictionary <string, Dictionary <string, string> >();
            Dictionary <string, List <Dictionary <string, string> > > subjectStudentList = new Dictionary <string, List <Dictionary <string, string> > >();

            // 補考群組Dict <課程名稱 +"_"+ 科目() +"_"+ 級別()+"_"+ 學分() +"_"+ "課程系統編號()" , UDT_MakeUpGroup>
            Dictionary <string, UDT_MakeUpGroup> makeUpGroupDict = new Dictionary <string, UDT_MakeUpGroup>();

            // 補考資料 List
            List <UDT_MakeUpData> UDT_MakeUpDataList = new List <UDT_MakeUpData>();

            // 整理 補考群組 補考資料
            foreach (StudentRecord aStudent in allStudents)
            {
                List <StudentAttendCourseRecord> scattendList = aStudent.AttendCourseList;

                string className     = aStudent.RefClass.ClassName;
                string seatNo        = aStudent.SeatNo;
                string studentName   = aStudent.StudentName;
                string studentNumber = aStudent.StudentNumber;

                foreach (SemesterSubjectScoreInfo info in aStudent.SemesterSubjectScoreList)
                {
                    if ("" + info.SchoolYear == _schoolYear && "" + info.Semester == _semester && !info.Pass)
                    {
                        StudentAttendCourseRecord scaRecord = scattendList.Find(sc => sc.Subject == info.Subject && sc.SubjectLevel == info.Level && sc.Credit == info.CreditDec());

                        string makeUpGroupKey = "";

                        // 是否為課程群組分類, 若其分數未取得學分(!info.Pass)、且補考標準, isCourseGroup 為 True
                        bool isCourseGroup = false;

                        if (info.Detail.GetAttribute("達補考標準") == "是" && scaRecord != null)
                        {
                            isCourseGroup = true;
                            //string makeUpGroupKey = scaRecord.CourseName + "_科目(" + scaRecord.Subject + ")_級別(" + scaRecord.SubjectLevel + ")_學分(" + scaRecord.Credit + ")_課程系統編號(" + scaRecord.CourseID + ")";
                            //makeUpGroupKey = scaRecord.CourseName + "_課程系統編號(" + scaRecord.CourseID + ")";

                            // 2019/04/26 穎驊與恩正確認, 同一學期的 課程名稱 在系統中是唯一值, 因此不必擔心重覆的問題,捨棄上面舊的補考群組名稱。
                            makeUpGroupKey = scaRecord.CourseName;
                        }
                        else if (info.Detail.GetAttribute("達補考標準") == "否" && scaRecord != null)
                        {
                            // 2019/04/26 穎驊與恩正確認, 不同課程的未達標準分開建立
                            makeUpGroupKey = scaRecord.CourseName + "_" + "未達補考標準群組";
                        }
                        else
                        {
                            // 不論有沒有達補考標準 該學期找不到 修課紀錄 通通分到未分群組
                            makeUpGroupKey = "未分群組";
                        }

                        if (!makeUpGroupDict.ContainsKey(makeUpGroupKey))
                        {
                            UDT_MakeUpGroup makeUpGroupRecord = new UDT_MakeUpGroup();

                            makeUpGroupRecord.MakeUp_Group = makeUpGroupKey;

                            makeUpGroupRecord.Description = "";

                            makeUpGroupRecord.MakeUp_Date = "";

                            makeUpGroupRecord.MakeUp_Time = "";

                            makeUpGroupRecord.MakeUp_Place = "";

                            makeUpGroupRecord.Ref_MakeUp_Batch_ID = _batch.UID;


                            // 只有課程群組 才會有 預設的 閱卷老師
                            // 授課教師 要另外對照出來(原本 smart school API 沒支援),目前這邊會先抓教師一
                            if (isCourseGroup)
                            {
                                K12.Data.CourseRecord courseRecord = courseList.Find(cr => cr.ID == "" + scaRecord.CourseID);
                                makeUpGroupRecord.Ref_Teacher_ID = courseRecord != null ? courseRecord.MajorTeacherID : "";
                            }
                            else
                            {
                                makeUpGroupRecord.Ref_Teacher_ID = "";
                            }


                            makeUpGroupDict.Add(makeUpGroupKey, makeUpGroupRecord);
                        }

                        UDT_MakeUpData makeUpData = new UDT_MakeUpData();

                        // 參考補考梯次ID
                        makeUpData.Ref_MakeUp_Batch_ID = _batch.UID;

                        // 參考補考群組ID (這個時候還不會有 因為補考群組也正要新增)
                        //makeUpData.Ref_MakeUp_Group_ID = "";

                        makeUpData.Ref_MakeUp_Group_Name = makeUpGroupKey;

                        // 參考學生系統編號
                        makeUpData.Ref_Student_ID = aStudent.StudentID;

                        // 科別
                        makeUpData.Department = "";

                        // 科目
                        makeUpData.Subject = info.Subject;

                        // 級別
                        makeUpData.Level = info.Level;

                        // 學分
                        makeUpData.Credit = "" + info.CreditDec();

                        // 校部定
                        makeUpData.C_Is_Required_By = info.Detail.HasAttribute("修課校部訂") ? info.Detail.GetAttribute("修課校部訂") : "";

                        // 必選修
                        makeUpData.C_Is_Required = info.Detail.HasAttribute("修課必選修") ? info.Detail.GetAttribute("修課必選修") : "";

                        // 原始成績
                        makeUpData.Score = info.Detail.HasAttribute("原始成績") ? info.Detail.GetAttribute("原始成績") : "";

                        // 補考成績
                        makeUpData.MakeUp_Score = info.Detail.HasAttribute("補考成績") ? info.Detail.GetAttribute("補考成績") : "";

                        // 及格標準
                        makeUpData.Pass_Standard = info.Detail.HasAttribute("及格標準") ? info.Detail.GetAttribute("及格標準") : "";

                        // 補考標準
                        makeUpData.MakeUp_Standard = info.Detail.HasAttribute("補考標準") ? info.Detail.GetAttribute("補考標準") : "";

                        // 輸入小數位數限制
                        makeUpData.DecimalNumber = info.Detail.HasAttribute("位數限制") ? info.Detail.GetAttribute("位數限制") : "";

                        // 成績身分
                        makeUpData.CalRole = info.Detail.HasAttribute("成績身分") ? info.Detail.GetAttribute("成績身分") : "";

                        UDT_MakeUpDataList.Add(makeUpData);
                    }
                }
                _worker.ReportProgress(60 + (int)(currentStudent++ *20.0 / totalStudents));
            }


            // LOG 資訊
            string _actor       = DSAServices.UserAccount;;
            string _client_info = ClientInfo.GetCurrentClientInfo().OutputResult().OuterXml;

            //  拚 SQL
            List <string> makeUpGroupDataList = new List <string>();

            foreach (string groupKey in makeUpGroupDict.Keys)
            {
                UDT_MakeUpGroup makeUpGroupRecord = makeUpGroupDict[groupKey];

                string data = string.Format(@"
                SELECT
                    '{0}'::TEXT AS ref_makeup_batch_id
                    ,'{1}'::TEXT AS makeup_group
                    ,'{2}'::TEXT AS ref_teacher_id
                    ,'{3}'::TEXT AS description                                   
                    ,'{4}'::TEXT AS makeup_date    
                    ,'{5}'::TEXT AS makeup_time
                    ,'{6}'::TEXT AS makeup_place
                ", makeUpGroupRecord.Ref_MakeUp_Batch_ID, makeUpGroupRecord.MakeUp_Group, makeUpGroupRecord.Ref_Teacher_ID, makeUpGroupRecord.Description, makeUpGroupRecord.MakeUp_Date, makeUpGroupRecord.MakeUp_Time, makeUpGroupRecord.MakeUp_Place);

                makeUpGroupDataList.Add(data);
            }

            string makeUpGroupDataString = string.Join(" UNION ALL", makeUpGroupDataList);

            List <string> UDT_MakeUpDataDataList = new List <string>();


            foreach (UDT_MakeUpData makeUpData in UDT_MakeUpDataList)
            {
                string data = string.Format(@"
                SELECT
                    '{0}'::TEXT AS ref_makeup_batch_id
                    ,'{1}'::TEXT AS ref_makeup_group_name
                    ,'{2}'::TEXT AS ref_student_id
                    ,'{3}'::TEXT AS subject                                   
                    ,'{4}'::TEXT AS level                                   
                    ,'{5}'::TEXT AS credit                                   
                    ,'{6}'::TEXT AS c_is_required_by                                   
                    ,'{7}'::TEXT AS c_is_required                                   
                    ,'{8}'::TEXT AS score                                   
                    ,'{9}'::TEXT AS makeup_score                                   
                    ,'{10}'::TEXT AS pass_standard                                                                              
                    ,'{11}'::TEXT AS makeup_standard      
                    ,'{12}'::TEXT AS decimalnumber   
                    ,'{13}'::TEXT AS calrole  
                ", makeUpData.Ref_MakeUp_Batch_ID, makeUpData.Ref_MakeUp_Group_Name, makeUpData.Ref_Student_ID, makeUpData.Subject, makeUpData.Level, makeUpData.Credit, makeUpData.C_Is_Required_By, makeUpData.C_Is_Required, makeUpData.Score, makeUpData.MakeUp_Score, makeUpData.Pass_Standard, makeUpData.MakeUp_Standard, makeUpData.DecimalNumber, makeUpData.CalRole);

                UDT_MakeUpDataDataList.Add(data);
            }

            string makeUpDataDataString = string.Join(" UNION ALL", UDT_MakeUpDataDataList);


            string sql = string.Format(@"
WITH makeUpGroupData_row AS(			 
        {0}     
)
,makeUpDataData_row AS(
        {1}
)
,insert_makeUpGroupData AS (
INSERT INTO $make.up.group(
	ref_makeup_batch_id	
	,makeup_group
    ,ref_teacher_id
	,description	
    ,makeup_date	
    ,makeup_time	
    ,makeup_place	
)
SELECT 
	makeUpGroupData_row.ref_makeup_batch_id::TEXT AS ref_makeup_batch_id	
	,makeUpGroupData_row.makeup_group::TEXT AS makeup_group	
    ,makeUpGroupData_row.ref_teacher_id::TEXT AS ref_teacher_id	
	,makeUpGroupData_row.description::TEXT AS description		
    ,makeUpGroupData_row.makeup_date::TEXT AS makeup_date		
    ,makeUpGroupData_row.makeup_time::TEXT AS makeup_time		
    ,makeUpGroupData_row.makeup_place::TEXT AS makeup_place		
FROM
	makeUpGroupData_row
RETURNING $make.up.group.*
)
,insert_makeUpDataData AS(
INSERT INTO $make.up.data(
	ref_makeup_batch_id	
    ,ref_makeup_group_id
    ,ref_student_id
	,subject
    ,level
	,credit	
    ,c_is_required_by	
    ,c_is_required	
    ,score
    ,makeup_score
    ,pass_standard    
    ,makeup_standard
    ,decimalnumber
    ,calrole
)
SELECT 
	makeUpDataData_row.ref_makeup_batch_id::TEXT AS ref_makeup_batch_id	
	,insert_makeUpGroupData.uid::TEXT AS ref_makeup_group_id	
    ,makeUpDataData_row.ref_student_id::TEXT AS ref_student_id	
	,makeUpDataData_row.subject::TEXT AS subject		
    ,makeUpDataData_row.level::TEXT AS level    
    ,makeUpDataData_row.credit::TEXT AS credit
    ,makeUpDataData_row.c_is_required_by::TEXT AS c_is_required_by
    ,makeUpDataData_row.c_is_required::TEXT AS c_is_required
    ,makeUpDataData_row.score::TEXT AS score
    ,makeUpDataData_row.makeup_score::TEXT AS makeup_score
    ,makeUpDataData_row.pass_standard::TEXT AS pass_standard
    ,makeUpDataData_row.makeup_standard::TEXT AS makeup_standard
    ,makeUpDataData_row.decimalnumber::TEXT AS decimalnumber
    ,makeUpDataData_row.calrole::TEXT AS calrole
FROM
	makeUpDataData_row
LEFT JOIN insert_makeUpGroupData ON insert_makeUpGroupData.makeup_group = makeUpDataData_row.ref_makeup_group_name
)
,insert_makeUpGroupData_Log AS (
INSERT INTO log(
	actor
	, action_type
	, action
	, target_category
	, target_id
	, server_time
	, client_info
	, action_by
	, description
)
SELECT 
	'{2}'::TEXT AS actor
	, 'Record' AS action_type
	, '高中補考群組新增' AS action
	, ''::TEXT AS target_category
	, '' AS target_id
	, now() AS server_time
	, '{3}' AS client_info
	, '高中補考群組新增'AS action_by   
	, ' 高中補考 學年度「'|| makeUpGroupData_row_Log.school_year||'」,學期「'|| makeUpGroupData_row_Log.semester||'」, 補考梯次「'|| makeUpGroupData_row_Log.makeup_batch||'」,新增補考群組 「'|| makeUpGroupData_row_Log.makeup_group ||'」,閱卷老師 「'|| COALESCE(makeUpGroupData_row_Log.teacher_name,'')  ||'」。' AS description 
FROM
(   
    SELECT
        $make.up.batch.school_year AS school_year
        ,$make.up.batch.semester AS semester
        ,$make.up.batch.makeup_batch AS makeup_batch
        ,makeUpGroupData_row.makeup_group AS makeup_group
        ,teacher.teacher_name AS teacher_name    
    FROM makeUpGroupData_row
    LEFT JOIN $make.up.batch ON $make.up.batch.uid :: TEXT = makeUpGroupData_row.ref_makeup_batch_id 
    LEFT JOIN teacher ON teacher.id :: TEXT = makeUpGroupData_row.ref_teacher_id 
) AS makeUpGroupData_row_Log
)
,insert_makeUpDataData_Log AS (
INSERT INTO log(
	actor
	, action_type
	, action
	, target_category
	, target_id
	, server_time
	, client_info
	, action_by
	, description
)
SELECT 
	'{2}'::TEXT AS actor
	, 'Record' AS action_type
	, '高中補考資料新增' AS action
	, ''::TEXT AS target_category
	, '' AS target_id
	, now() AS server_time
	, '{3}' AS client_info
	, '高中補考資料新增'AS action_by   
	, ' 高中補考 學年度「'|| makeUpDataData_row_Log.school_year||'」,學期「'|| makeUpDataData_row_Log.semester||'」, 補考梯次「'|| makeUpDataData_row_Log.makeup_batch||'」,補考群組 「'|| makeUpDataData_row_Log.makeup_group ||'」,閱卷老師 「'|| COALESCE(makeUpDataData_row_Log.teacher_name,'')  ||'」
    新增 補考資料 學生系統編號 「'|| makeUpDataData_row_Log.ref_student_id||'」 ,學號 「'|| makeUpDataData_row_Log.student_number||'」,學生姓名 「'|| makeUpDataData_row_Log.student_name||'」 
    ,科目 「'|| makeUpDataData_row_Log.subject||'」,級別 「'|| makeUpDataData_row_Log.level||'」,學分 「'|| makeUpDataData_row_Log.credit||'」,校部定 「'|| makeUpDataData_row_Log.c_is_required_by||'」,必選修 「'|| makeUpDataData_row_Log.c_is_required||'」      
    ,分數 「'|| makeUpDataData_row_Log.score||'」 ,補考分數 「'|| makeUpDataData_row_Log.makeup_score||'」 ,及格標準 「'|| makeUpDataData_row_Log.pass_standard||'」,補考標準 「'|| makeUpDataData_row_Log.makeup_standard||'」' AS description 
FROM
(   
    SELECT
        $make.up.batch.school_year AS school_year
        ,$make.up.batch.semester AS semester
        ,$make.up.batch.makeup_batch AS makeup_batch
        ,insert_makeUpGroupData.makeup_group AS makeup_group
        ,teacher.teacher_name AS teacher_name
        ,student.id AS ref_student_id
        ,student.student_number AS student_number
        ,student.name AS student_name
        ,makeUpDataData_row.subject AS subject
        ,makeUpDataData_row.level AS level
        ,makeUpDataData_row.credit AS credit
        ,makeUpDataData_row.credit AS c_is_required_by
        ,makeUpDataData_row.credit AS c_is_required
        ,makeUpDataData_row.score AS score
        ,makeUpDataData_row.makeup_score AS makeup_score
        ,makeUpDataData_row.pass_standard AS pass_standard
        ,makeUpDataData_row.makeup_standard AS makeup_standard
    FROM makeUpDataData_row
    LEFT JOIN insert_makeUpGroupData ON insert_makeUpGroupData.makeup_group = makeUpDataData_row.ref_makeup_group_name
    LEFT JOIN $make.up.batch ON $make.up.batch.uid :: TEXT = insert_makeUpGroupData.ref_makeup_batch_id 
    LEFT JOIN teacher ON teacher.id :: TEXT = insert_makeUpGroupData.ref_teacher_id 
    LEFT JOIN student ON student.id :: TEXT = makeUpDataData_row.ref_student_id 
) AS makeUpDataData_row_Log
)
SELECT 0


", makeUpGroupDataString, makeUpDataDataString, _actor, _client_info);


            //K12.Data.UpdateHelper uh = new K12.Data.UpdateHelper();

            ////執行sql
            //uh.Execute(sql);

            FISCA.Data.QueryHelper qh = new FISCA.Data.QueryHelper();

            //執行sql

            // 有補考群組才執行SQL
            if (makeUpGroupDataList.Count > 0)
            {
                qh.Select(sql);
            }
            else
            {
                MsgBox.Show("本梯次班級沒有任何學生需要補考,故本梯次沒有任何補考群組。", "提醒", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }