///<summary> ///printUrikakeZan ///印刷ダイアログ ///</summary> private void printUrikakeZan() { //グリッドに表示されていない場合 if (gridTokuisaki.Rows.Count == 0) { return; } //PDF作成後の入れ物 string strFile = ""; //データの取り出し用 DataTable dtPrintData = new DataTable(); //列情報を取得 DataGridViewColumnCollection cols = gridTokuisaki.Columns; //行情報を取得 DataGridViewRowCollection rows = gridTokuisaki.Rows; //取引先経理情報登録時の情報 List <string> lstTorihiki = new List <string>(); //年月日の日付フォーマット後を入れる用 string strYMDformat = ""; this.Cursor = Cursors.WaitCursor; //空チェック(開始得意先コード) if (StringUtl.blIsEmpty(lblsetTokuisakiCdopen.CodeTxtText) == false) { this.Cursor = Cursors.Default; // メッセージボックスの処理、項目が空の場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "項目が空です。\r\n日付を入力してください。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); lblsetTokuisakiCdopen.Focus(); return; } //空チェック(終了得意先コード) if (StringUtl.blIsEmpty(lblsetTokuisakiCdclose.CodeTxtText) == false) { this.Cursor = Cursors.Default; // メッセージボックスの処理、項目が空の場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "項目が空です。\r\n日付を入力してください。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); lblsetTokuisakiCdclose.Focus(); return; } ////パワーユーザーの場合 //if ("1".Equals(this.etsuranFlg)) //{ // //空チェック(終了得意先コード) // if (StringUtl.blIsEmpty(lblsetTokuisakiCdclose.CodeTxtText) == false) // { // this.Cursor = Cursors.Default; // // メッセージボックスの処理、項目が空の場合のウィンドウ(OK) // BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "項目が空です。\r\n日付を入力してください。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); // basemessagebox.ShowDialog(); // lblsetTokuisakiCdclose.Focus(); // return; // } //} //日付フォーマット生成、およびチェック strYMDformat = txtYMopen.chkDateYMDataFormat(txtYMopen.Text); //開始年月日の日付チェック if (strYMDformat == "") { this.Cursor = Cursors.Default; // メッセージボックスの処理、項目が日付でない場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "入力された日付が正しくありません。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); txtYMopen.Focus(); return; } else { txtYMopen.Text = strYMDformat; } //初期化 strYMDformat = ""; //日付フォーマット生成、およびチェック strYMDformat = txtYMclose.chkDateYMDataFormat(txtYMclose.Text); //終了年月日の日付チェック if (strYMDformat == "") { this.Cursor = Cursors.Default; // メッセージボックスの処理、項目が日付でない場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "入力された日付が正しくありません。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); txtYMclose.Focus(); return; } else { txtYMclose.Text = strYMDformat; } this.Cursor = Cursors.Default; //年月日が空の場合 if (txtYMopen.blIsEmpty() == false) { // メッセージボックスの処理、項目が空の場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "項目が空です。\r\n日付を入力してください。 ", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); txtYMopen.Focus(); return; } //年月日が空の場合 if (txtYMclose.blIsEmpty() == false) { // メッセージボックスの処理、項目が空の場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "項目が空です。\r\n日付を入力してください。 ", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); txtYMclose.Focus(); return; } //検索開始得意先コードのチェック if (lblsetTokuisakiCdopen.chkTxtTorihikisaki() == true) { lblsetTokuisakiCdopen.Focus(); return; } //検索終了得意先コードのチェック if (lblsetTokuisakiCdclose.chkTxtTorihikisaki() == true) { lblsetTokuisakiCdclose.Focus(); return; } ////パワーユーザーの場合 //if ("1".Equals(this.etsuranFlg)) //{ // //スルー //} //else //{ // //データチェック(年月度が同じの場合) // if (txtYMopen.Text == txtYMclose.Text) // { // //一か月単位は出来ないメッセージ(OK) // BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_VIEW, "1ケ月単位は指定できません。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); // basemessagebox.ShowDialog(); // txtYMopen.Focus(); // return; // } //} this.Cursor = Cursors.WaitCursor; DataTable dtGridViewTokusaki = new DataTable(); List <string> lstStringViewData = new List <string>(); lstStringViewData.Add(lblsetTokuisakiCdopen.CodeTxtText); lstStringViewData.Add(lblsetTokuisakiCdclose.CodeTxtText); ////パワーユーザーの場合 //if ("1".Equals(this.etsuranFlg)) //{ // lstStringViewData.Add(lblsetTokuisakiCdclose.CodeTxtText); //} //else //{ // lstStringViewData.Add(lblsetTokuisakiCdopen.CodeTxtText); //} string strShuturyoku = ""; //出力順のラジオボタン判定 if (radShuturyoku.radbtn0.Checked == true) { strShuturyoku = "Tokuisaki"; } else { strShuturyoku = "Hurigana"; } lstStringViewData.Add(DateTime.Parse(txtYMopen.Text).ToString("yyyy/MM/dd")); lstStringViewData.Add(DateTime.Parse(txtYMclose.Text).ToString("yyyy/MM/dd")); lstStringViewData.Add(strShuturyoku); C0520_KaikakekinZandakaIchiranKakunin_B kaikakekakuninB = new C0520_KaikakekinZandakaIchiranKakunin_B(); try { dtPrintData = kaikakekakuninB.getPrintData(lstStringViewData); this.Cursor = Cursors.Default; //初期値 Common.Form.PrintForm pf = new Common.Form.PrintForm(this, "", CommonTeisu.SIZE_A4, YOKO); pf.ShowDialog(this); //プレビューの場合 if (this.printFlg == CommonTeisu.ACTION_PREVIEW) { //現在時間と使用者PCユーザー名を確保 lstTorihiki.Add(DateTime.Now.ToString()); lstTorihiki.Add(SystemInformation.UserName); this.Cursor = Cursors.WaitCursor; //結果セットをレコードセットに strFile = kaikakekakuninB.dbToPdf(dtPrintData, lstTorihiki); this.Cursor = Cursors.Default; //印刷できなかった場合 if (strFile == "") { //印刷時エラーメッセージ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, "印刷", "印刷時エラーです。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); return; } // プレビュー pf.execPreview(strFile); } // 一括印刷の場合 else if (this.printFlg == CommonTeisu.ACTION_PRINT) { //現在時間と使用者PCユーザー名を確保 lstTorihiki.Add(DateTime.Now.ToString()); lstTorihiki.Add(SystemInformation.UserName); this.Cursor = Cursors.WaitCursor; //結果セットをレコードセットに strFile = kaikakekakuninB.dbToPdf(dtPrintData, lstTorihiki); this.Cursor = Cursors.Default; //印刷できなかった場合 if (strFile == "") { //印刷時エラーメッセージ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, "印刷", "印刷時エラーです。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); return; } // 一括印刷 pf.execPrint(null, strFile, CommonTeisu.SIZE_A4, CommonTeisu.YOKO, true); } } catch (Exception ex) { this.Cursor = Cursors.Default; //データロギング new CommonException(ex); //例外発生メッセージ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_ERROR, CommonTeisu.LABEL_ERROR_MESSAGE, CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); return; } }
///<summary> /// F10:Excel出力 ///</summary> private void exportXls() { // SaveFileDialogクラスのインスタンスを作成 SaveFileDialog sfd = new SaveFileDialog(); // ファイル名の指定 sfd.FileName = "買掛金残高一覧確認_" + DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss") + ".xlsx"; // デフォルトパス取得(デスクトップ) string Init_dir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); //はじめに表示されるフォルダを指定する sfd.InitialDirectory = Init_dir; // ファイルフィルタの設定 sfd.Filter = "すべてのファイル(*.*)|*.*"; if (sfd.ShowDialog() == DialogResult.OK) { // グリッドに表示されていない場合 if (gridTokuisaki.Rows.Count == 0) { return; } //データの取り出し用 DataTable dtPrintData = new DataTable(); //列情報を取得 DataGridViewColumnCollection cols = gridTokuisaki.Columns; //行情報を取得 DataGridViewRowCollection rows = gridTokuisaki.Rows; //取引先経理情報登録時の情報 List <string> lstTorihiki = new List <string>(); //年月日の日付フォーマット後を入れる用 string strYMDformat = ""; this.Cursor = Cursors.WaitCursor; //空チェック(開始得意先コード) if (StringUtl.blIsEmpty(lblsetTokuisakiCdopen.CodeTxtText) == false) { this.Cursor = Cursors.Default; // メッセージボックスの処理、項目が空の場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "項目が空です。\r\n日付を入力してください。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); lblsetTokuisakiCdopen.Focus(); return; } //空チェック(終了得意先コード) if (StringUtl.blIsEmpty(lblsetTokuisakiCdclose.CodeTxtText) == false) { this.Cursor = Cursors.Default; // メッセージボックスの処理、項目が空の場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "項目が空です。\r\n日付を入力してください。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); lblsetTokuisakiCdclose.Focus(); return; } //日付フォーマット生成、およびチェック strYMDformat = txtYMopen.chkDateYMDataFormat(txtYMopen.Text); //開始年月日の日付チェック if (strYMDformat == "") { this.Cursor = Cursors.Default; // メッセージボックスの処理、項目が日付でない場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "入力された日付が正しくありません。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); txtYMopen.Focus(); return; } else { txtYMopen.Text = strYMDformat; } //初期化 strYMDformat = ""; //日付フォーマット生成、およびチェック strYMDformat = txtYMclose.chkDateYMDataFormat(txtYMclose.Text); //終了年月日の日付チェック if (strYMDformat == "") { this.Cursor = Cursors.Default; // メッセージボックスの処理、項目が日付でない場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "入力された日付が正しくありません。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); txtYMclose.Focus(); return; } else { txtYMclose.Text = strYMDformat; } this.Cursor = Cursors.Default; //年月日が空の場合 if (txtYMopen.blIsEmpty() == false) { // メッセージボックスの処理、項目が空の場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "項目が空です。\r\n日付を入力してください。 ", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); txtYMopen.Focus(); return; } //年月日が空の場合 if (txtYMclose.blIsEmpty() == false) { // メッセージボックスの処理、項目が空の場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "項目が空です。\r\n日付を入力してください。 ", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); txtYMclose.Focus(); return; } //検索開始得意先コードのチェック if (lblsetTokuisakiCdopen.chkTxtTorihikisaki() == true) { lblsetTokuisakiCdopen.Focus(); return; } //検索終了得意先コードのチェック if (lblsetTokuisakiCdclose.chkTxtTorihikisaki() == true) { lblsetTokuisakiCdclose.Focus(); return; } this.Cursor = Cursors.WaitCursor; DataTable dtGridViewTokusaki = new DataTable(); List <string> lstStringViewData = new List <string>(); lstStringViewData.Add(lblsetTokuisakiCdopen.CodeTxtText); lstStringViewData.Add(lblsetTokuisakiCdclose.CodeTxtText); string strShuturyoku = ""; //出力順のラジオボタン判定 if (radShuturyoku.radbtn0.Checked == true) { strShuturyoku = "Tokuisaki"; } else { strShuturyoku = "Hurigana"; } lstStringViewData.Add(DateTime.Parse(txtYMopen.Text).ToString("yyyy/MM/dd")); lstStringViewData.Add(DateTime.Parse(txtYMclose.Text).ToString("yyyy/MM/dd")); lstStringViewData.Add(strShuturyoku); C0520_KaikakekinZandakaIchiranKakunin_B kaikakekakuninB = new C0520_KaikakekinZandakaIchiranKakunin_B(); try { DataTable dtXlsData = kaikakekakuninB.getPrintData(lstStringViewData); if (dtXlsData.Rows.Count > 0) { CreatePdf cpdf = new CreatePdf(); // 出力するヘッダを設定 string[] header = { "コード", "得意先名", "年月", "前月買掛残", "支払現金", "支払小切手", "支払振込", "支払手形", "支払相殺", "支払手数料", "支払その他", "繰越残高", "当月仕入高", "当月消費税", "当月残高", "税区", }; // Linqで出力対象の項目をSelect // カラム名は以下のようにつける(カラム名でフォーマットを判断するため) // 金額関係:***kingaku // 単価関係:***tanka // 原価:***genka // 数量:***suryo var outDat = dtXlsData.AsEnumerable() .Select(dat => new { code = dat["コード"], tokuisakiName = dat["得意先名"], YM = dat["年月"], zenkaikakezanKingaku = dat["前月買掛残"], siharaiGenkinKingaku = dat["支払現金"], siharaiKogiteKingaku = dat["支払小切手"], siharaiFurikomiKingaku = dat["支払振込"], siharaiTegataKingaku = dat["支払手形"], siharaiSosaiKingaku = dat["支払相殺"], siharaiTesuryoKingaku = dat["支払手数料"], siharaiSonotaKingaku = dat["支払その他"], kurikosizanKingaku = dat["繰越残高"], togetuUriageKingaku = dat["当月仕入高"], togetuZeiKingaku = dat["当月消費税"], togetuZanKingaku = dat["当月残高"], zeiku = dat["税区"] }).ToList(); // listをDataTableに変換 DataTable dtKaikakeZan = cpdf.ConvertToDataTable(outDat); string outFile = sfd.FileName; cpdf.DtToXls(dtKaikakeZan, "買掛金残高一覧確認", outFile, 3, 1, header); this.Cursor = Cursors.Default; // メッセージボックスの処理、Excel作成完了の場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_VIEW, "Excelファイルを作成しました。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_INFOMATION); basemessagebox.ShowDialog(); } } catch (Exception ex) { this.Cursor = Cursors.Default; //データロギング new CommonException(ex); //例外発生メッセージ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_ERROR, CommonTeisu.LABEL_ERROR_MESSAGE, CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); return; } } }
///<summary> ///setTokuisakiView ///得意先データの表示 ///</summary> private void setTokuisakiView() { //年月日の日付フォーマット後を入れる用 string strYMDformat = ""; //空チェック(開始得意先コード) if (StringUtl.blIsEmpty(lblsetTokuisakiCdopen.CodeTxtText) == false) { // メッセージボックスの処理、項目が空の場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "項目が空です。\r\n数値を入力してください。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); lblsetTokuisakiCdopen.Focus(); return; } //空チェック(終了得意先コード) if (StringUtl.blIsEmpty(lblsetTokuisakiCdclose.CodeTxtText) == false) { // メッセージボックスの処理、項目が空の場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "項目が空です。\r\n数値を入力してください。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); lblsetTokuisakiCdclose.Focus(); return; } ////パワーユーザーの場合 //if ("1".Equals(this.etsuranFlg)) //{ // //空チェック(終了得意先コード) // if (StringUtl.blIsEmpty(lblsetTokuisakiCdclose.CodeTxtText) == false) // { // // メッセージボックスの処理、項目が空の場合のウィンドウ(OK) // BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "項目が空です。\r\n日付を入力してください。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); // basemessagebox.ShowDialog(); // lblsetTokuisakiCdclose.Focus(); // return; // } //} //日付フォーマット生成、およびチェック strYMDformat = txtYMopen.chkDateYMDataFormat(txtYMopen.Text); //開始年月日の日付チェック if (strYMDformat == "") { // メッセージボックスの処理、項目が日付でない場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "入力された日付が正しくありません。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); txtYMopen.Focus(); return; } else { txtYMopen.Text = strYMDformat; } //初期化 strYMDformat = ""; //日付フォーマット生成、およびチェック strYMDformat = txtYMopen.chkDateYMDataFormat(txtYMclose.Text); //開始年月日の日付チェック if (strYMDformat == "") { // メッセージボックスの処理、項目が日付でない場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "入力された日付が正しくありません。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); txtYMclose.Focus(); return; } else { txtYMclose.Text = strYMDformat; } //年月日が空の場合 if (txtYMopen.blIsEmpty() == false) { // メッセージボックスの処理、項目が空の場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "項目が空です。\r\n日付を入力してください。 ", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); txtYMopen.Focus(); return; } //年月日が空の場合 if (txtYMclose.blIsEmpty() == false) { // メッセージボックスの処理、項目が空の場合のウィンドウ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_INPUT, "項目が空です。\r\n日付を入力してください。 ", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); txtYMclose.Focus(); return; } //検索開始得意先コードのチェック if (lblsetTokuisakiCdopen.chkTxtTorihikisaki() == true) { lblsetTokuisakiCdopen.Focus(); return; } //検索終了得意先コードのチェック if (lblsetTokuisakiCdclose.chkTxtTorihikisaki() == true) { lblsetTokuisakiCdclose.Focus(); return; } DataTable dtGridViewTokusaki = new DataTable(); List <string> lstStringViewData = new List <string>(); lstStringViewData.Add(lblsetTokuisakiCdopen.CodeTxtText); lstStringViewData.Add(lblsetTokuisakiCdclose.CodeTxtText); ////パワーユーザーの場合 //if ("1".Equals(this.etsuranFlg)) //{ // lstStringViewData.Add(lblsetTokuisakiCdclose.CodeTxtText); //} //else //{ // lstStringViewData.Add(lblsetTokuisakiCdopen.CodeTxtText); //} string strShuturyoku = ""; //出力順のラジオボタン判定 if (radShuturyoku.radbtn0.Checked == true) { strShuturyoku = "Tokuisaki"; } else { strShuturyoku = "Hurigana"; } lstStringViewData.Add(DateTime.Parse(txtYMopen.Text).ToString("yyyy/MM/dd")); lstStringViewData.Add(DateTime.Parse(txtYMclose.Text).ToString("yyyy/MM/dd")); lstStringViewData.Add(strShuturyoku); C0520_KaikakekinZandakaIchiranKakunin_B kaikakekakuninB = new C0520_KaikakekinZandakaIchiranKakunin_B(); try { //待機状態 Cursor.Current = Cursors.WaitCursor; dtGridViewTokusaki = kaikakekakuninB.setGridTokusaiki(lstStringViewData); //テーブルがある場合 if (dtGridViewTokusaki.Rows.Count > 0) { //グリッドビューの表示 gridTokuisaki.DataSource = dtGridViewTokusaki; //元に戻す Cursor.Current = Cursors.Default; gridTokuisaki.Focus(); } else { //元に戻す Cursor.Current = Cursors.Default; //データがないメッセージ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_VIEW, "対象のデータはありません。", CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); //グリッドを空にする gridTokuisaki.DataSource = ""; } } catch (Exception ex) { //データロギング new CommonException(ex); //例外発生メッセージ(OK) BaseMessageBox basemessagebox = new BaseMessageBox(this, CommonTeisu.TEXT_ERROR, CommonTeisu.LABEL_ERROR_MESSAGE, CommonTeisu.BTN_OK, CommonTeisu.DIAG_ERROR); basemessagebox.ShowDialog(); return; } }