// グリッドビュー上のボタン押下時、モジュールフォームを閲覧モードで開く、デレゲートあり private void dgvBoxId_CellContentClick(object sender, DataGridViewCellEventArgs e) { int currentRow = int.Parse(e.RowIndex.ToString()); if (dgvTray.Columns[e.ColumnIndex] == openTray && currentRow >= 0) { //既にfrmModuleInTray が開かれている場合は、それを閉じるよう促す if (TfGeneral.checkOpenFormExists("frmModuleInTray")) { MessageBox.Show("Please close the currently open form.", "Notice", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2); return; } string trayId = dgvTray["tray_id", currentRow].Value.ToString(); DateTime trayDate = (DateTime)dgvTray["register_date", currentRow].Value; string shift = VBS.Right(trayId, 3); bool canceled = !String.IsNullOrEmpty(dgvTray["cl_dept", currentRow].Value.ToString()); bool packed = !String.IsNullOrEmpty(dgvTray["pack_id", currentRow].Value.ToString()); // モジュールテキストボックスが空でない、かつチェックボックスがオン、かつ検索結果が1行の場合のみ、再プリントモードを有効 bool reprintMode = (txtModuleId.Text.Length != 0 && cbxModuleId.Checked && dtTray.Rows.Count == 1); frmModuleInTray fM = new frmModuleInTray(); //子イベントをキャッチして、データグリッドを更新する fM.RefreshEvent += delegate(object sndr, EventArgs excp) { updateDataGridViews(dtTray, ref dgvTray, false); this.Focus(); }; fM.updateControls(trayId, trayDate, userId, txtLoginName.Text, txtLoginDept.Text, userRole, shift, false, false, canceled, packed, 1, false, reprintMode); fM.Show(); } }
// サブプロシージャ: テスター用WHERE句の作成 private string makeSqlWhereClause(string criteria) { string sql = " where "; foreach (string c in criteria.Split(',')) { sql += "c.process_cd like " + VBS.Left(c, c.Length - 1) + "%' or "; } ; sql = VBS.Left(sql, sql.Length - 3); System.Diagnostics.Debug.Print(sql); return(sql); }
// サブプロシージャ: テスター用SELECTケース句の作成 private string makeSqlCaseClause(string criteria) { string sql = " case "; foreach (string c in criteria.Split(',')) { sql += "when c.process_cd like " + VBS.Left(c, c.Length - 1) + "%' then " + c + " "; } ; sql += "else c.process_cd end as tester_id "; System.Diagnostics.Debug.Print(sql); return(sql); }
// サブプロシージャ:ロット集計グリッドビューを更新し、数量の最も多いロット番号を返す public string updateLotSummary(DataTable dt) { if (dt.Rows.Count <= 0) { dtLot = new DataTable(); dgvLotSummary.DataSource = dtLot; return(string.Empty); } // 一時テーブルに、ロット集計を格納する string sql1 = "select lot, count(lot) as qty from t_module where tray_id in ("; string sql2 = string.Empty; var query1 = dt.AsEnumerable() .Select(row => new { tray_id = row.Field <string>("tray_id") }); foreach (var q in query1) { sql2 += "'" + q.tray_id + "', "; } string sql3 = sql1 + VBS.Left(sql2, sql2.Length - 2) + ") group by lot order by qty desc, lot"; System.Diagnostics.Debug.Print(sql3); DataTable dtTemp = new DataTable(); TfSQL tf = new TfSQL(); tf.sqlDataAdapterFillDatatableFromTrayGuardDb(sql3, ref dtTemp); // ロット集計表示テーブルに、一時テーブルの情報を移す dgvLotSummary.DataSource = null; dgvLotSummary.Refresh(); dtLot = new DataTable(); var query2 = dtTemp.AsEnumerable().Select(r => new { lot = r.Field <string>("lot"), qty = r.Field <Int64>("qty") }); // 列の追加 foreach (var q in query2) { dtLot.Columns.Add(q.lot, typeof(int)); } dtLot.Columns.Add("total", typeof(int)); // 行の追加 dtLot.Rows.Add(); foreach (var q in query2) { dtLot.Rows[0][q.lot] = q.qty; } dtLot.Rows[0]["total"] = query2.Sum(a => a.qty); dgvLotSummary.DataSource = dtLot; return(query2.First().lot); }
// QAのスーパーユーザーは、トレーの一部モジュールのキャンセルができる private void btnPartiallyCancel_Click(object sender, EventArgs e) { if (dtTray.Rows.Count == 0) { return; } // セルの選択範囲が2列以上の場合は、メッセージの表示のみでプロシージャを抜ける if (dgvTray.Columns.GetColumnCount(DataGridViewElementStates.Selected) >= 2 || dgvTray.Rows.GetRowCount(DataGridViewElementStates.Selected) >= 2 || dgvTray.CurrentCell.ColumnIndex != 0) { MessageBox.Show("Please select only one tray id.", "Notice", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2); return; } //既にfrmModuleInTray が開かれている場合は、それを閉じるよう促す if (TfGeneral.checkOpenFormExists("frmModuleInTray")) { MessageBox.Show("Please close the currently open form.", "Notice", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } int currentRow = dgvTray.CurrentCell.RowIndex; string trayId = dgvTray["tray_id", currentRow].Value.ToString(); DateTime trayDate = (DateTime)dgvTray["register_date", currentRow].Value; string shift = VBS.Right(trayId, 3); bool canceled = !String.IsNullOrEmpty(dgvTray["cl_dept", currentRow].Value.ToString()); bool packed = !String.IsNullOrEmpty(dgvTray["pack_id", currentRow].Value.ToString()); if (canceled || packed) { MessageBox.Show("The tray id is already canceled or packed.", "Notice", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } frmModuleInTray fM = new frmModuleInTray(); //子イベントをキャッチして、データグリッドを更新する fM.RefreshEvent += delegate(object sndr, EventArgs excp) { updateDataGridViews(dtTray, ref dgvTray, false); this.Focus(); }; fM.updateControls(trayId, trayDate, userId, txtLoginName.Text, txtLoginDept.Text, userRole, shift, false, false, canceled, packed, 1, true, false); fM.Show(); }
// ディープキャンセル対象のカートンを、デスクトップのCSVをインポートして選択する private void btnImportForDeepCancel_Click(object sender, EventArgs e) { string sql1 = "select carton_id, lot, l_cnt, m_qty, batch, register_date, rg_user, cancel_date, cl_user, pallet_id from t_carton where carton_id in ( "; string sql2 = string.Empty; //クラスTfImportを使用し、SQL文を作成する List <TfImport> cartonList = TfImport.loadCartonListFromDesktopCsv( System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\CartonList.csv"); foreach (var carton in cartonList) { sql2 += "'" + carton.CartonNumber + "', "; } string sql3 = sql1 + VBS.Left(sql2, sql2.Length - 2) + ") order by carton_id"; System.Diagnostics.Debug.Print(sql3); // SQL結果を、DTAATABLEへ格納 dtCarton.Clear(); TfSQL tf = new TfSQL(); tf.sqlDataAdapterFillDatatableFromTrayGuardDb(sql3, ref dtCarton); // データグリットビューへDTAATABLEを格納 dgvCarton.DataSource = dtCarton; //行ヘッダーに行番号を表示する for (int i = 0; i < dgvCarton.Rows.Count; i++) { dgvCarton.Rows[i].HeaderCell.Value = (i + 1).ToString(); } //行ヘッダーの幅を自動調節する dgvCarton.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); // 一番下の行を表示する if (dgvCarton.Rows.Count != 0) { dgvCarton.FirstDisplayedScrollingRowIndex = dgvCarton.Rows.Count - 1; } }
//トレーグリッドビュー上のボタンのクリックで、formModuleInTrayを呼び出し、対応するモジュールを表示する(デレゲートなし) private void dgvTray_CellContentClick(object sender, DataGridViewCellEventArgs e) { int currentRow = int.Parse(e.RowIndex.ToString()); if (dgvTray.Columns[e.ColumnIndex] == openTray && currentRow >= 0) { //既にfrmModuleInTray が開かれている場合は、それを閉じるよう促す if (TfGeneral.checkOpenFormExists("frmModuleInTray")) { MessageBox.Show("Please close the currently open form.", "Notice", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2); return; } string trayId = dgvTray["tray_id", currentRow].Value.ToString(); string line = VBS.Right(trayId, 1); DateTime trayDate = (DateTime)dgvTray["register_date", currentRow].Value; //デレゲートなし。当トレーフォームのフォーム位置が2の場合は、モジュールフォームの位置は3。それ以外は2。 frmModuleInTray fM = new frmModuleInTray(); fM.updateControls(trayId, trayDate, "", txtLoginName.Text, txtLoginDept.Text, userRole, line, false, false, true, true, 4, false, false); fM.Show(); } }
// 一時テーブルの選択された複数レコードを、一括消去させる private void btnDeleteSelection_Click(object sender, EventArgs e) { if (dtModule.Rows.Count <= 0) { return; } // セルの選択範囲が2列以上の場合は、メッセージの表示のみでプロシージャを抜ける if (dgvModule.Columns.GetColumnCount(DataGridViewElementStates.Selected) >= 2) { MessageBox.Show("Please select range with only one column.", "Notice", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2); return; } // 部分キャンセルモードでない時は、通常処理(モジュールデータテーブルの選択行削除) if (!formPartialCancelMode) { DialogResult result = MessageBox.Show("Do you really want to delete the selected rows?", "Notice", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); if (result == DialogResult.No) { return; } foreach (DataGridViewCell cell in dgvModule.SelectedCells) { dtModule.Rows[cell.RowIndex].Delete(); } dtModule.AcceptChanges(); updateDataGridViews(dtModule, ref dgvModule); txtModuleId.Focus(); txtModuleId.SelectAll(); } // 部分キャンセルモードの時は、DBモジュールテーブルの行削除 else if (formPartialCancelMode) { if (dgvModule.SelectedCells.Count == dtModule.Rows.Count) { MessageBox.Show("If you wish to delete all modules, please cancel the tray.", "Notice", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2); return; } DialogResult result = MessageBox.Show("Do you really want to delete the selected rows?", "Notice", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); if (result == DialogResult.No) { return; } btnDeleteSelection.Enabled = false; string sql1 = "delete from t_module where module_id in ('"; string sql2 = string.Empty; foreach (DataGridViewCell cell in dgvModule.SelectedCells) { sql2 += dtModule.Rows[cell.RowIndex]["module_id"].ToString() + "','"; dtModule.Rows[cell.RowIndex].Delete(); } string sql3 = sql1 + VBS.Left(sql2, sql2.Length - 2) + ")"; TfSQL tf = new TfSQL(); bool res = tf.sqlExecuteNonQuery(sql3, false); if (res) { dtModule.AcceptChanges(); updateDataGridViews(dtModule, ref dgvModule); string updateTime = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); string sql4 = "update t_tray set update_date = '" + updateTime + "', up_dept = '" + txtLoginDept.Text + "', " + "up_user = '******', lot = '" + dtLot.Columns[0].ColumnName + "', " + "qty = '" + dtLot.Rows[0]["total"].ToString() + "', multi_lot = '" + (dtLot.Columns.Count >= 3 ? "T" : "F") + "' " + "where tray_id = '" + txtTrayId.Text + "'"; System.Diagnostics.Debug.Print(sql4); tf.sqlExecuteNonQuery(sql4, false); //親フォームfrmTrayのデータグリットビューを更新するため、デレゲートイベントを発生させる this.RefreshEvent(this, new EventArgs()); this.Focus(); MessageBox.Show("Partial cancel was successful.", "Result", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2); } else { MessageBox.Show("Partial cancel failed.", "Result", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2); } } }
// サブプロシージャ:モジュールの登録、通常モード private void registerModuleNormalMode() { // 2016.08.10 FUJII トレーIDの新規採番プロシージャ「GetNewTrayId」を、トランザクション処理バージョンへ変更 //トレーIDの新規採番 //string trayNew = getNewTrayId(txtLoginDept.Text, txtLoginName.Text, VBS.Mid(maxLot, 8, 1), cmbBinShift.Text); TfSQL tf = new TfSQL(); string trayNew = tf.sqlGetNewTrayId(txtLoginDept.Text, txtLoginName.Text, VBS.Mid(maxLot, 8, 1), cmbBinShift.Text, maxLot, dtLot, ref registerDate); if (trayNew == string.Empty) { MessageBox.Show("An error happened in the tray id issuing process.", "Process Result", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } //モジュールテーブルへ、データテーブルのレコードを一括登録する bool res = tf.sqlMultipleInsertModule(dtModule, trayNew); if (res) { //ラベルのプリントアウト TfSato tfs = new TfSato(); tfs.printStart("tray", trayNew, dtLot, string.Empty, dtpRegisterDate.Value, string.Empty, string.Empty, 1, string.Empty); //登録済みの状態を表示 txtTrayId.Text = trayNew; dtpRegisterDate.Value = registerDate; //親フォームfrmTrayのデータグリットビューを更新するため、デレゲートイベントを発生させる this.RefreshEvent(this, new EventArgs()); this.Focus(); MessageBox.Show("Tray ID: " + trayNew + Environment.NewLine + "and its modules were registered.", "Process Result", MessageBoxButtons.OK, MessageBoxIcon.Information); //ユーザーによるメッセージボックス確認後の処理 txtTrayId.Text = String.Empty; txtModuleId.Text = String.Empty; dtModule.Clear(); capacity = 24; updateDataGridViews(dtModule, ref dgvModule); } }
// サブプロシージャ:シリアルの構成要素のパターンが適正か、ユーザーデスクトップの設定ファイルを使用して確認する private string matchSerialNumberingPattern(string serial) { string result = string.Empty; // 設定ファイル LINE = XXX の場合は、検証しない // if (line == "XXX") return string.Empty; if (!plant.Equals("XXX") && VBS.Mid(serial, 1, 3) != plant) { return("Plant '" + VBS.Mid(serial, 1, 3) + "'"); } else if (!year.Equals("XXX") && VBS.Mid(serial, 4, 1) != year) { return("Year '" + VBS.Mid(serial, 4, 1) + "'"); } else if (!week.Equals("XXX") && VBS.Mid(serial, 5, 2) != week) { return("Week '" + VBS.Mid(serial, 5, 2) + "'"); } else if (!day.Equals("XXX") && VBS.Mid(serial, 7, 1) != day) { return("Day '" + VBS.Mid(serial, 7, 1) + "'"); } else if (!line.Equals("XXX") && VBS.Mid(serial, 8, 1) != line) { return("Line '" + VBS.Mid(serial, 8, 1) + "'"); } else if (!eeee.Equals("XXX") && VBS.Mid(serial, 12, 4) != eeee) { return("4E '" + VBS.Mid(serial, 12, 4) + "'"); } else if (!revision.Equals("XXX") && VBS.Mid(serial, 16, 1) != revision) { return("Revision '" + VBS.Mid(serial, 16, 1) + "'"); } else if (!mass.Equals("XXX") && VBS.Mid(serial, 19, 1) != mass) { return("Mass '" + VBS.Mid(serial, 19, 1) + "'"); } else if (!flexure.Equals("XXX") && VBS.Mid(serial, 20, 1) != flexure) { return("Flexure '" + VBS.Mid(serial, 20, 1) + "'"); } else if (!cover_base.Equals("XXX") && VBS.Mid(serial, 21, 1) != cover_base) { return("Cover/base '" + VBS.Mid(serial, 21, 1) + "'"); } else if (!dframe.Equals("XXX") && VBS.Mid(serial, 22, 1) != dframe) { return("D-Frame '" + VBS.Mid(serial, 22, 1) + "'"); } else if (!fpc.Equals("XXX") && VBS.Mid(serial, 23, 1) != fpc) { return("FPC '" + VBS.Mid(serial, 23, 1) + "'"); } else if (!shift.Equals("XXX") && VBS.Mid(serial, 24, 1) != shift) { return("Shift '" + VBS.Mid(serial, 24, 1) + "'"); } else { return(string.Empty); } }
// シリアルがスキャンされた時の処理 private void txtModuleId_KeyDown(object sender, KeyEventArgs e) { // エンターキーの場合、テキストボックスの桁数が17桁または24桁の場合のみ、処理を行う if (e.KeyCode != Keys.Enter) { return; } if (txtModuleId.Text.Length != 17 && txtModuleId.Text.Length != 24) { return; } // BASEシリアルからHOOPシリアルを取得し(ステップ1)、両方のシリアルに該当する、テスト結果・プロセス名・テスト日時を取得する(ステップ2、ステップ3) TfSQL tf = new TfSQL(); DataTable dt = new DataTable(); string log = string.Empty; string module = txtModuleId.Text; string mdlShort = VBS.Left(module, 17); string mdlNtrs = string.Empty; string mdlOK2ShipResult = string.Empty; // 2016.08.18 FUJIKI FORCED NG CHECK を追加 string mdlForcedNGResult = string.Empty; // 2016.08.18 FUJIKI FORCED NG CHECK を追加 string scanTime = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); string displayAll = string.Empty; // ログ用 DataRow dr = dtModule.NewRow(); string textResult = "PASS"; string mdlSerialBin = string.Empty; string textSelectBin = string.Empty; // 2016.08.18 FUJIKI FORCED NG CHECK を追加 if (forcedNGSwitch == "ON" && OK2ShipCheckSwitch == "ON") { string sql0 = "select serial from forceddata where serial = '" + mdlShort + "' and result = 1"; mdlForcedNGResult = tf.sqlExecuteScalarStringOK2Ship(sql0); if (!string.IsNullOrEmpty(mdlForcedNGResult)) { textResult = "NG"; displayAll = "NG SERIAL"; } else { // Short Factory Serial No の検索 string sql1 = "select received_result from data where serial = '" + mdlShort + "' and received_result = '0'"; mdlOK2ShipResult = tf.sqlExecuteScalarStringOK2Ship(sql1); // ビン情報を検索 if (string.IsNullOrEmpty(mdlOK2ShipResult)) { mdlOK2ShipResult = "NG"; textResult = "NG"; } else { mdlOK2ShipResult = "OK"; } displayAll = displayAll + "OK2:" + mdlOK2ShipResult; } } else { mdlOK2ShipResult = string.Empty; textResult = "n/a"; displayAll = "test function off"; } // 2017.03.08 FUJII シリアル構成要素のチェックをオフ //トレーIDの新規採番 // 先ずは、シリアルの構成要素のパターンが適正か、ユーザーデスクトップの設定ファイルを使用して確認する string matchResult = string.Empty; //string matchResult = matchSerialNumberingPattern(module); if (matchResult != string.Empty) { MessageBox.Show(matchResult + " does not match with desktop file's setting.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } // メモリ上のテーブルにレコードを追加 dr["module_id"] = module; dr["lot"] = VBS.Left(module, 8); dr["bin"] = mdlSerialBin; dr["tester_id"] = displayAll; dr["test_result"] = textResult; dr["test_date"] = DateTime.ParseExact(scanTime, "yyyy/MM/dd HH:mm:ss", CultureInfo.InvariantCulture);; dr["r_mode"] = formReturnMode ? "T" : "F"; dtModule.Rows.Add(dr); // アプリケーションフォルダに、日付とテスト結果のログを付ける log = Environment.NewLine + scanTime + "," + module + "," + displayAll + ":" + textResult; // log = Environment.NewLine + earlyTime + "," + module + "," + displayAll; // 同日日付のファイルが存在する場合は追記し、存在しない場合はファイルを作成追記する try { string outFile = outPath + DateTime.Today.ToString("yyyyMMdd") + ".txt"; System.IO.File.AppendAllText(outFile, log, System.Text.Encoding.GetEncoding("UTF-8")); } catch (Exception ex) { MessageBox.Show(ex.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); } // データグリットビューの更新 updateDataGridViews(dtModule, ref dgvModule); }
// サブプロシージャ:データグリットビューの更新 public void updateDataGridViews(DataTable dt, ref DataGridView dgv, bool load) { DateTime registerDateFrom = dtpRegsterDateFrom.Value; DateTime registerDateTo = dtpRegisterDateTo.Value.AddDays(1); string invoiceNo = txtInvoiceNo.Text; string palletId = txtPalletId.Text; string lot = txtLot.Text; string cartonId = txtCartonId.Text; string batch = txtBatch.Text; bool b_registerDateFrom = cbxRegisterDateFrom.Checked; bool b_registerDateTo = cbxRegisterDateTo.Checked; bool b_invoiceNo = cbxInvoiceNo.Checked; bool b_palletId = cbxPalletId.Checked; bool b_lot = cbxLot.Checked; bool b_cartonId = cbxCartonId.Checked; bool b_batch = cbxBatch.Checked; bool b_multi_lot = cbxMultiLot.Checked; bool b_hideCancel = cbxHideCancel.Checked; // ユーザーがパックIDを検索条件として指定した場合は、個別のSQL文を使用する string sqlX = "select pallet_id, lot, l_cnt, m_qty, batch, register_date, rg_user, cancel_date, cl_user, invoice_no from t_pallet " + "where pallet_id in (select pallet_id from t_carton where carton_id like '" + cartonId + "%')"; // ユーザーが選択した検索条件を、SQL文に反映する string sql1 = "select pallet_id, lot, l_cnt, m_qty, batch, register_date, rg_user, cancel_date, cl_user, invoice_no from t_pallet where "; bool[] cr = { true, true, invoiceNo == string.Empty ? false : true, palletId == string.Empty ? false : true, lot == string.Empty ? false : true, cartonId == string.Empty ? false : true, batch == string.Empty ? false : true, true, true }; bool[] ck = { b_registerDateFrom, b_registerDateTo, b_invoiceNo, b_palletId, b_lot, b_cartonId, b_batch, b_multi_lot, b_hideCancel }; string sql2 = (!(cr[0] && ck[0]) ? string.Empty : "register_date >= '" + registerDateFrom + "' AND ") + (!(cr[1] && ck[1]) ? string.Empty : "register_date < '" + registerDateTo + "' AND ") + (!(cr[2] && ck[2]) ? string.Empty : "invoice_no like '%" + invoiceNo + "%' AND ") + (!(cr[3] && ck[3]) ? string.Empty : "pallet_id like '%" + palletId + "%' AND ") + (!(cr[4] && ck[4]) ? string.Empty : "lot like '%" + lot + "%' AND ") + (!(cr[5] && ck[5]) ? string.Empty : "carton_id like '%" + cartonId + "%' AND ") + (!(cr[6] && ck[6]) ? string.Empty : "batch = '" + batch + "' AND ") + (!(cr[7] && ck[7]) ? string.Empty : "l_cnt >= 2 AND ") + (!(cr[8] && ck[8]) ? string.Empty : "cancel_date is null AND "); bool b_all = (cr[0] && ck[0]) || (cr[1] && ck[1]) || (cr[2] && ck[2]) || (cr[3] && ck[3]) || (cr[4] && ck[4]) || (cr[5] && ck[5]) || (cr[6] && ck[6]); if (!b_all) { MessageBox.Show("Please select at least one check box and fill the criteria.", "Notice", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2); return; } string sql3 = sql1 + VBS.Left(sql2, sql2.Length - 5) + " order by pallet_id"; string sql4 = string.Empty; if (cartonId != string.Empty && b_cartonId) { sql4 = sqlX; } else { sql4 = sql3; } System.Diagnostics.Debug.Print(sql4); // SQL結果を、DTAATABLEへ格納 dt.Clear(); TfSQL tf = new TfSQL(); tf.sqlDataAdapterFillDatatableFromTrayGuardDb(sql4, ref dt); // データグリットビューへDTAATABLEを格納 dgv.DataSource = dt; dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; // グリットビュー右端にボタンを追加(初回のみ) if (load) { addButtonsToDataGridView(dgv); } //行ヘッダーに行番号を表示する for (int i = 0; i < dgv.Rows.Count; i++) { dgv.Rows[i].HeaderCell.Value = (i + 1).ToString(); } //行ヘッダーの幅を自動調節する dgv.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); // 一番下の行を表示する if (dgv.Rows.Count != 0) { dgv.FirstDisplayedScrollingRowIndex = dgv.Rows.Count - 1; } }
// 変更後モジュールがスキャンされたときの処理 private void txtAfter_KeyDown(object sender, KeyEventArgs e) { // エンターキーの場合、テキストボックスの桁数が17桁または24桁の場合のみ、処理を行う if (e.KeyCode != Keys.Enter) { return; } if (txtAfter.Text.Length != 17 && txtAfter.Text.Length != 24) { return; } // データテーブルのクリア dtModule.Rows.Clear(); // BASEシリアルからHOOPシリアルを取得し(ステップ1)、両方のシリアルに該当する、テスト結果・プロセス名・テスト日時を取得する(ステップ2、ステップ3) TfSQL tf = new TfSQL(); DataTable dt = new DataTable(); string log = string.Empty; string module = txtAfter.Text; string mdlShort = VBS.Left(module, 17); string mdlNtrs = string.Empty; string mdlOK2ShipResult = string.Empty; // 2016.08.18 FUJIKI FORCED NG CHECK を追加 string mdlForcedNGResult = string.Empty; // 2016.08.18 FUJIKI FORCED NG CHECK を追加 string scanTime = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); string displayAll = string.Empty; // ログ用 string textResult = "PASS"; string mdlSerialBin = string.Empty; string textSelectBin = string.Empty; // メモリ上のテーブルにレコードを追加 DataRow dr = dtModule.NewRow(); dr["module_id"] = module; dr["lot"] = VBS.Left(module, 8); dr["bin"] = mdlSerialBin; dr["tester_id"] = displayAll; dr["test_result"] = textResult; dr["test_date"] = DateTime.ParseExact(scanTime, "yyyy/MM/dd HH:mm:ss", CultureInfo.InvariantCulture);; dr["r_mode"] = formReturnMode ? "T" : "F"; dtModule.Rows.Add(dr); // アプリケーションフォルダに、日付とテスト結果のログを付ける log = Environment.NewLine + scanTime + "," + module + "," + displayAll + ":" + textResult; // 同日日付のファイルが存在する場合は追記し、存在しない場合はファイルを作成追記する(AppendAllText がやってくれる) try { string outFile = outPath + DateTime.Today.ToString("yyyyMMdd") + ".txt"; System.IO.File.AppendAllText(outFile, log, System.Text.Encoding.GetEncoding("UTF-8")); } catch (Exception ex) { MessageBox.Show(ex.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); } // 現在の一時登録件数を変数へ保持する int okCount = getOkCount(dtModule); txtRow.Text = okCount.ToString(); // データグリットビューの更新 updateDataGridViews(dtModule, ref dgvModule); }
// サブプロシージャ:ロット集計グリッドビューを更新し、数量の最も多いロット番号を返す public string updateLotSummary(DataTable dt) { if (dt.Rows.Count <= 0) { dtLot = new DataTable(); dgvLotSummary.DataSource = dtLot; return(string.Empty); } // 各カートンに含まれる、バックIDリストを取得する TfSQL tf = new TfSQL(); string sql1 = "select pack_id from t_pack where carton_id in ("; string sql2 = string.Empty; var query1 = dt.AsEnumerable().Select(row => new { carton_id = row.Field <string>("carton_id") }); foreach (var q in query1) { sql2 += "'" + q.carton_id + "', "; } string sql3 = sql1 + VBS.Left(sql2, sql2.Length - 2) + ")"; System.Diagnostics.Debug.Print(sql3); DataTable dtTemp1 = new DataTable(); tf.sqlDataAdapterFillDatatableFromTrayGuardDb(sql3, ref dtTemp1); // 各パックに含まれる、トレーIDリストを取得する sql1 = "select tray_id from t_tray where pack_id in ("; sql2 = string.Empty; var query2 = dtTemp1.AsEnumerable().Select(row => new { pack_id = row.Field <string>("pack_id") }); foreach (var q in query2) { sql2 += "'" + q.pack_id + "', "; } sql3 = sql1 + VBS.Left(sql2, sql2.Length - 2) + ")"; System.Diagnostics.Debug.Print(sql3); DataTable dtTemp2 = new DataTable(); tf.sqlDataAdapterFillDatatableFromTrayGuardDb(sql3, ref dtTemp1); // 上記で取得したトレーIDが持つモジュールから、ロット集計を作成する sql1 = "select lot, count(lot) as qty from t_module where tray_id in ("; sql2 = string.Empty; var query3 = dtTemp1.AsEnumerable().Select(row => new { tray_id = row.Field <string>("tray_id") }); foreach (var q in query3) { sql2 += "'" + q.tray_id + "', "; } sql3 = sql1 + VBS.Left(sql2, sql2.Length - 2) + ") group by lot order by qty desc, lot"; System.Diagnostics.Debug.Print(sql3); DataTable dtTemp3 = new DataTable(); tf.sqlDataAdapterFillDatatableFromTrayGuardDb(sql3, ref dtTemp3); // ロット集計表示テーブルに、一時テーブルの情報を移す dgvLotSummary.DataSource = null; dgvLotSummary.Refresh(); dtLot = new DataTable(); var query4 = dtTemp3.AsEnumerable().Select(r => new { lot = r.Field <string>("lot"), qty = r.Field <Int64>("qty") }); // 列の追加 foreach (var q in query4) { dtLot.Columns.Add(q.lot, typeof(int)); } dtLot.Columns.Add("total", typeof(int)); // 行の追加 dtLot.Rows.Add(); foreach (var q in query4) { dtLot.Rows[0][q.lot] = q.qty; } dtLot.Rows[0]["total"] = query4.Sum(a => a.qty); // dgvLotSummary_ControlAdded が発生する、655より多い列を取り扱うため、WEIGHT設定を100から1へ変更 dgvLotSummary.DataSource = dtLot; return(query4.First().lot); }
// サブプロシージャ:データグリットビューの更新 public void updateDataGridViews(DataTable dt, ref DataGridView dgv, bool load) { DateTime registerDateFrom = dtpRegsterDateFrom.Value; DateTime registerDateTo = dtpRegisterDateTo.Value.AddDays(1); string registerDept = cmbRegisterDept.Text; DateTime updateDateFrom = dtpUpdateDateFrom.Value; DateTime updateDateTo = dtpUpdateDateTo.Value.AddDays(1); string updateDept = cmbUpdateDept.Text; string trayId = txtTrayId.Text; string line = cmbLine.Text; string shift = txtShift.Text; string moduleId = txtModuleId.Text; string lot = txtLot.Text; bool b_registerDateFrom = cbxRegisterDateFrom.Checked; bool b_registerDateTo = cbxRegisterDateTo.Checked; bool b_registerDept = cbxRegisterDept.Checked; bool b_updateDateFrom = cbxUpdateDateFrom.Checked; bool b_updateDateTo = cbxUpdateDateTo.Checked; bool b_updateDept = cbxUpdateDept.Checked; bool b_trayId = cbxTrayId.Checked; bool b_line = cbxLine.Checked; bool b_shift = cbxShift.Checked; bool b_multiLot = cbxMultiLot.Checked; bool b_hideCancel = cbxHideCancel.Checked; bool b_moduleId = cbxModuleId.Checked; bool b_lot = cbxLot.Checked; // ユーザーがモジュールIDを検索条件として指定した場合は、個別のSQL文を使用する string sqlX = "select tray_id, lot, qty, register_date, rg_dept, update_date, up_dept, cancel_date, cl_dept, multi_lot, pack_id from t_tray " + "where tray_id in (select tray_id from t_module where module_id like '" + moduleId + "%')"; // ユーザーがロットDを検索条件として指定した場合は、個別のSQL文を使用する string sqlY = "select tray_id, lot, qty, register_date, rg_dept, update_date, up_dept, cancel_date, cl_dept, multi_lot, pack_id from t_tray " + "where tray_id in (select tray_id from t_module where lot like '" + lot + "%')"; // モジュールID・ロットIDが選択されなかった場合は、その他全ての選択条件を、SQL文に盛り込む string sql1 = "select tray_id, lot, qty, register_date, rg_dept, update_date, up_dept, cancel_date, cl_dept, multi_lot, pack_id from t_tray where "; bool[] cr = { true, true, registerDept == string.Empty ? false : true, true, true, updateDept == string.Empty ? false : true, trayId == string.Empty ? false : true, line == string.Empty ? false : true, shift == string.Empty ? false : true, true, true }; bool[] ck = { b_registerDateFrom, b_registerDateTo, b_registerDept, b_updateDateFrom, b_updateDateTo, b_updateDept, b_trayId, b_line, b_shift, b_multiLot, b_hideCancel }; string sql2 = (!(cr[0] && ck[0]) ? string.Empty : "register_date >= '" + registerDateFrom + "' AND ") + (!(cr[1] && ck[1]) ? string.Empty : "register_date < '" + registerDateTo + "' AND ") + (!(cr[2] && ck[2]) ? string.Empty : "rg_dept = '" + registerDept + "' AND ") + (!(cr[3] && ck[3]) ? string.Empty : "update_date >= '" + updateDateFrom + "' AND ") + (!(cr[4] && ck[4]) ? string.Empty : "update_date < '" + updateDateTo + "' AND ") + (!(cr[5] && ck[5]) ? string.Empty : "up_dept = '" + updateDept + "' AND ") + (!(cr[6] && ck[6]) ? string.Empty : "tray_id like '%" + trayId + "%' AND ") + (!(cr[7] && ck[7]) ? string.Empty : "line = '" + line + "' AND ") + (!(cr[8] && ck[8]) ? string.Empty : "shift like '%" + shift + "%' AND ") + (!(cr[9] && ck[9]) ? string.Empty : "multi_lot = 'T' AND ") + (!(cr[10] && ck[10]) ? string.Empty : "cancel_date is null AND "); bool b_all = (cr[0] && ck[0]) || (cr[1] && ck[1]) || (cr[2] && ck[2]) || (cr[3] && ck[3]) || (cr[4] && ck[4]) || (cr[5] && ck[5]) || (cr[6] && ck[6]) || (cr[7] && ck[7]) || (cr[8] && ck[8]) || (moduleId != string.Empty && b_moduleId) || (lot != string.Empty && b_lot); if (!b_all) { MessageBox.Show("Please select at least one check box and fill the criteria.", "Notice", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2); return; } string sql3 = sql1 + VBS.Left(sql2, sql2.Length - 5) + " order by tray_id"; string sql4 = string.Empty; if (moduleId != string.Empty && b_moduleId) { sql4 = sqlX; } else if (lot != string.Empty && b_lot) { sql4 = sqlY; } else { sql4 = sql3; } System.Diagnostics.Debug.Print(sql4); // SQL結果を、DTAATABLEへ格納 dt.Clear(); TfSQL tf = new TfSQL(); tf.sqlDataAdapterFillDatatableFromTrayGuardDb(sql4, ref dt); // データグリットビューへDTAATABLEを格納 dgv.DataSource = dt; dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; // グリットビュー右端にボタンを追加(初回のみ) if (load) { addButtonsToDataGridView(dgv); } //行ヘッダーに行番号を表示する for (int i = 0; i < dgv.Rows.Count; i++) { dgv.Rows[i].HeaderCell.Value = (i + 1).ToString(); } //行ヘッダーの幅を自動調節する dgv.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); // 一番下の行を表示する if (dgv.Rows.Count != 0) { dgv.FirstDisplayedScrollingRowIndex = dgv.Rows.Count - 1; } }