//"ノード名未指定" //──────────────────────────────────────── /// <summary> /// コンストラクター。 /// </summary> /// <param name="e_Fpath_ConfigStack"></param> public Table_HumaninputImpl( string name_Table, Expression_Node_Filepath filepath_Nodeconfigtree_Expr, Configuration_Node cur_Conf ) : base(name_Table, cur_Conf) { this.expression_Filepath_ConfigStack = filepath_Nodeconfigtree_Expr; this.dataTable = new DataTable(); this.name_Table = name_Table; this.format_Table_Humaninput = new Format_Table_HumaninputImpl(); this.recordFielddefinition_ = new RecordFielddefinitionImpl();//暫定 }
//──────────────────────────────────────── /// <summary> /// /// </summary> /// <param name="out_sFieldListList"></param> /// <param name="out_O_NewFldDefList"></param> /// <param name="src_sNewFieldNameList"></param> /// <param name="e_Where"></param> /// <param name="tableH_Source"></param> /// <param name="log_Reports"></param> public static void SelectFieldListList( out List <List <string> > listList_SField_Out, out RecordFielddefinition out_RecordFielddefinition_New, EnumLogic enumWhereLogic, List <string> list_SName_NewField_Src, List <Recordcondition> list_Reccond, Table_Humaninput tableH_Source, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Table.Name_Library, "Util_Table", "SelectFieldListList", log_Reports); // RecordFielddefinition recordFielddefinition_New = new RecordFielddefinitionImpl(); List <int> list_indexField = new List <int>(); // // 新しい、列定義リストを作成します。 // { // 最初の列は「NO」とします。 list_SName_NewField_Src.Insert(0, Utility_Table.S_FIELD_NO); //fieldIndex int nFIx = 0; tableH_Source.RecordFielddefinition.ForEach(delegate(Fielddefinition fielddefinition, ref bool isBreak, Log_Reports log_Reports2) { if (list_SName_NewField_Src.Contains(fielddefinition.Name_Humaninput)) { // 選出されたフィールドだけでリストを作ります。 recordFielddefinition_New.Add(fielddefinition); list_indexField.Add(nFIx); } nFIx++; }, log_Reports); } // // テーブルに列定義を設定した後で。 // 移し替えたいデータ値の配列を作ります。 listList_SField_Out = new List <List <string> >(); // { int nEndover = list_indexField.Count; foreach (DataRow srcRow in tableH_Source.DataTable.Rows) { List <string> sList_NewField = new List <string>(); // // 「E■@where」属性を解析します。 // // 該当しないレコードは除去していきます。 // // 「E■@where」に logic属性が無い場合は logic="and" とします。 if (EnumLogic.None == enumWhereLogic) { enumWhereLogic = EnumLogic.And; } bool bHit = Utility_Table.ApplyReccond(srcRow, tableH_Source, enumWhereLogic, list_Reccond, 0, log_Reports); //ystem.Console.WriteLine(InfxenonTable.LibraryName + ":Util_Table.SelectFieldListList: (結果) [" + bHit + "]"); if (bHit) { for (int nA = 0; nA < nEndover; nA++) { // TODO:指定のフィールド・インデックスだけをピックアップしたい。 int nB = list_indexField[nA]; Value_Humaninput o_Value = (Value_Humaninput)srcRow[nB]; sList_NewField.Add(o_Value.Text); } listList_SField_Out.Add(sList_NewField); } //hit } } goto gt_EndMethod; // // // // gt_EndMethod: out_RecordFielddefinition_New = recordFielddefinition_New; log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// O_TableImpl#AddRecordListで使います。 /// </summary> /// <param name="columnIndex"></param> /// <param name="value"></param> /// <param name="oTable"></param> /// <param name="log_Reports"></param> /// <returns></returns> public static Value_Humaninput ConfigurationTo_Field( int index_Column, string value, RecordFielddefinition recordFielddefinition, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Table.Name_Library, "Utility_Row", "ConfigurationTo_Field", log_Reports); // // // セルのソースヒント名 string nodeConfigtree; try { nodeConfigtree = recordFielddefinition.ValueAt(index_Column).Name_Humaninput; } catch (ArgumentOutOfRangeException) { // エラー goto gt_Error_Index; } Value_Humaninput result; // 型毎に処理を分けます。 switch (recordFielddefinition.ValueAt(index_Column).Type_Field) { case EnumTypeFielddefinition.Int: { // 空白データも自動処理 Int_HumaninputImpl cellData = new Int_HumaninputImpl(nodeConfigtree); cellData.Text = value; result = cellData; } break; case EnumTypeFielddefinition.Bool: { // 空白データも自動処理 Bool_HumaninputImpl cellData = new Bool_HumaninputImpl(nodeConfigtree); cellData.Text = value; result = cellData; } break; default: { String_HumaninputImpl cellData = new String_HumaninputImpl(nodeConfigtree); cellData.Text = value; result = cellData; } break; } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_Index: result = null; if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー461!", log_Method); Log_TextIndented t = new Log_TextIndentedImpl(); t.Append("列インデックス[" + index_Column + "](0スタート)が指定されましたが、"); t.Newline(); t.Append("列は[" + recordFielddefinition.Count + "]個しかありません。(列定義リストは、絞りこまれている場合もあります)"); t.Newline(); // ヒント r.Message = t.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); return(result); }
//──────────────────────────────────────── /// <summary> /// /// </summary> /// <param name="out_sFieldListList"></param> /// <param name="out_O_NewFldDefList"></param> /// <param name="src_sNewFieldNameList"></param> /// <param name="e_Where"></param> /// <param name="tableH_Source"></param> /// <param name="log_Reports"></param> public static void SelectFieldListList( out List<List<string>> listList_SField_Out, out RecordFielddefinition out_RecordFielddefinition_New, EnumLogic enumWhereLogic, List<string> list_SName_NewField_Src, List<Recordcondition> list_Reccond, Table_Humaninput tableH_Source, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Table.Name_Library, "Util_Table", "SelectFieldListList",log_Reports); // RecordFielddefinition recordFielddefinition_New = new RecordFielddefinitionImpl(); List<int> list_indexField = new List<int>(); // // 新しい、列定義リストを作成します。 // { // 最初の列は「NO」とします。 list_SName_NewField_Src.Insert(0, Utility_Table.S_FIELD_NO); //fieldIndex int nFIx = 0; tableH_Source.RecordFielddefinition.ForEach(delegate(Fielddefinition fielddefinition, ref bool isBreak, Log_Reports log_Reports2) { if (list_SName_NewField_Src.Contains(fielddefinition.Name_Humaninput)) { // 選出されたフィールドだけでリストを作ります。 recordFielddefinition_New.Add(fielddefinition); list_indexField.Add(nFIx); } nFIx++; }, log_Reports); } // // テーブルに列定義を設定した後で。 // 移し替えたいデータ値の配列を作ります。 listList_SField_Out = new List<List<string>>(); // { int nEndover = list_indexField.Count; foreach (DataRow srcRow in tableH_Source.DataTable.Rows) { List<string> sList_NewField = new List<string>(); // // 「E■@where」属性を解析します。 // // 該当しないレコードは除去していきます。 // // 「E■@where」に logic属性が無い場合は logic="and" とします。 if (EnumLogic.None == enumWhereLogic) { enumWhereLogic = EnumLogic.And; } bool bHit = Utility_Table.ApplyReccond(srcRow, tableH_Source, enumWhereLogic, list_Reccond, 0, log_Reports); //ystem.Console.WriteLine(InfxenonTable.LibraryName + ":Util_Table.SelectFieldListList: (結果) [" + bHit + "]"); if (bHit) { for (int nA = 0; nA < nEndover; nA++) { // TODO:指定のフィールド・インデックスだけをピックアップしたい。 int nB = list_indexField[nA]; Value_Humaninput o_Value = (Value_Humaninput)srcRow[nB]; sList_NewField.Add(o_Value.Text); } listList_SField_Out.Add(sList_NewField); } //hit } } goto gt_EndMethod; // // // // gt_EndMethod: out_RecordFielddefinition_New = recordFielddefinition_New; log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// 設定された型リストで、テーブルの構造を作成します。 /// </summary> public void CreateTable(RecordFielddefinition recordFielddefinition_New, Log_Reports log_Reports) { Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Table.Name_Library, this, "CreateTable",log_Reports); // this.dataTable.Clear(); this.recordFielddefinition_ = recordFielddefinition_New; Exception error_Excp; recordFielddefinition_New.ForEach(delegate(Fielddefinition fielddefinition_New, ref bool isBreak2, Log_Reports log_Reports2) { // 列の型を決めます。 try { this.dataTable.Columns.Add(fielddefinition_New.Name_Trimupper, fielddefinition_New.ToType_Field()); } catch (DuplicateNameException e) { error_Excp = e; goto gt_Error_Duplicated; } goto gt_EndInnermethod; // #region 異常系 //──────────────────────────────────────── gt_Error_Duplicated: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー111!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("列の名前が重複しています。"); s.Append(error_Excp.Message); s.Append(Environment.NewLine); s.Append("テーブル名=["); s.Append(this.dataTable.TableName); s.Append("]"); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndInnermethod; //──────────────────────────────────────── #endregion // gt_EndInnermethod: ; }, log_Reports); goto gt_EndMethod; // gt_EndMethod: log_Method.EndMethod(log_Reports); }
/// <summary> /// データを渡すことで、テーブルを作成します。 /// テーブルの型定義と、データを渡します。 /// /// TODO:データテーブルによって新行を作成するので、データテーブルの列定義と、列定義リストは合わせて置かなければならない。 /// /// </summary> /// <param name="rows"></param> /// <param name="fldDefList">列定義は絞りこまれている場合もあります。</param> /// <param name="d_Logging_OrNull"></param> public void AddRecordList( List<List<string>> rows, RecordFielddefinition recordFielddefinition, Log_Reports log_Reports) { Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Table.Name_Library, this, "AddRecordList",log_Reports); // string error_NameColumn_TrimUpper; Exception error_Excep; DataRow error_DataRow; List<string> error_List_NameColumn; int error_indexColumn; // テーブルデータを作成します。 for (int indexRow = 0; indexRow < rows.Count; indexRow++) { List<string> list_NameColumn = rows[indexRow]; // 行オブジェクトを作成。 DataRow dataRow = this.dataTable.NewRow(); // TODO:これで合ってる? 入力テーブルの行数と、列定義の列数、小さい方に合わせます。(2012-02-11/仕様変更) int indexEndover; if (list_NameColumn.Count < recordFielddefinition.Count) { indexEndover = list_NameColumn.Count; } else { indexEndover = recordFielddefinition.Count; } // 行の列数ではなく、列定義の列数でループを回します。 // 絞りこまれていることがあるからです。 for (int indexColumn = 0; indexColumn < indexEndover; indexColumn++) { // 引き渡されたデータを、行オブジェクトにセット string nameColumn_TrimUpper = recordFielddefinition.ValueAt(indexColumn).Name_Trimupper; if ("" == nameColumn_TrimUpper) { // 列定義になく、データ領域に溢れていたので追加された列か、 // 列名なしの列。 if (recordFielddefinition.Count <= indexColumn) { // フィールドを追加。 // 列名: 空文字列 // 値の型:OValue_StringImpl this.dataTable.Columns.Add("", typeof(String_HumaninputImpl)); } // セルのソースヒント名 string nodeConfigtreeOfCell; { // フィールド名がないので、インデックスで指定します。 Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("("); s.Append(indexColumn); s.Append(")番フィールド"); nodeConfigtreeOfCell = s.ToString(); } // 列名がないので、列インデックスで指定して、データを追加。 // 値の型:OValue_StringImpl String_HumaninputImpl stringH = new String_HumaninputImpl(nodeConfigtreeOfCell); stringH.Text = list_NameColumn[indexColumn]; dataRow[indexColumn] = stringH; } else { if (list_NameColumn.Count <= indexColumn) { // エラー error_DataRow = dataRow; error_List_NameColumn = list_NameColumn; error_indexColumn = indexColumn; goto gt_Error_ColumnIndexOver; } // 値を格納。 Value_Humaninput valueH = Utility_Row.ConfigurationTo_Field(//TODO: indexColumn, list_NameColumn[indexColumn], recordFielddefinition, log_Reports ); try { dataRow[nameColumn_TrimUpper] = valueH; } catch (ArgumentException e) { error_DataRow = dataRow; error_NameColumn_TrimUpper = nameColumn_TrimUpper; error_Excep = e; goto gt_Error_Field; } } } // テーブルに行オブジェクトをセット this.dataTable.Rows.Add(dataRow); } goto gt_EndMethod; // #region 異常系 //──────────────────────────────────────── gt_Error_ColumnIndexOver: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー463!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("列定義の個数より フィールド数の少ない入力テーブルが指定されました。"); s.Newline(); s.Append("実データのこの行の列数["); s.Append(error_List_NameColumn.Count); s.Append("] 指定した列インデックス=["); s.Append(error_indexColumn); s.Append("] フィールド定義の個数=["); s.Append(recordFielddefinition.Count); s.Append("]"); s.Newline(); s.Append("──────────────────────────────テーブルに存在する列名"); s.Newline(); foreach (DataColumn col in error_DataRow.Table.Columns) { s.Append("実列名=[" + col.ColumnName + "]"); s.Newline(); } s.Append("──────────────────────────────"); s.Newline(); s.Append("──────────────────────────────定義に存在する列名"); s.Newline(); s.Append("定義列名=[" + recordFielddefinition.ToString_DebugDump() + "]"); s.Newline(); s.Append("──────────────────────────────"); s.Newline(); // ヒント r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_Field: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー462!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("フィールド名[" + error_NameColumn_TrimUpper + "]が指定されましたが、ありません。"); s.Newline(); s.Append("──────────────────────────────テーブルに存在する列名"); s.Newline(); foreach (DataColumn col in error_DataRow.Table.Columns) { s.Append("実列名=[" + col.ColumnName + "]"); s.Newline(); } s.Append("──────────────────────────────"); s.Newline(); s.Append("──────────────────────────────定義に存在する列名"); s.Newline(); s.Append("定義列名=[" + recordFielddefinition.ToString_DebugDump() + "]"); s.Newline(); s.Append("──────────────────────────────"); s.Newline(); // ヒント s.Append(r.Message_SException(error_Excep)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// フィールドの定義を取得します。 /// /// フィールド名の英字大文字、小文字は無視します。 /// </summary> /// <param name="expectedFieldName"></param> /// <param name="isRequired">該当なしの時に例外を投げるなら真。</param> /// <returns>該当なし、エラーの場合偽。</returns> public bool TryGetFieldDefinitionByName( out RecordFielddefinition out_RecordFielddefinition3, List<string> list_NameField_Expected, bool isRequired, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Table.Name_Library, this, "TryGetFieldDefinitionByName",log_Reports); bool isResult = true; RecordFielddefinition recordFielddefinition1 = new RecordFielddefinitionImpl(); if (list_NameField_Expected.Count < 1) { // エラー。 goto gt_Error_ParamNothingField; } string error_NameField_Expected; int count = 0; foreach (string nameField_Expected in list_NameField_Expected) { // // TODO:現状、「ID,NAME」などのカンマ区切りに対応できていない? // string name_Field_ExpectedUpper = nameField_Expected.ToUpper(); bool isHit2 = false; this.RecordFielddefinition.ForEach(delegate(Fielddefinition fielddefinition,ref bool isBreak2, Log_Reports log_Reports2) { if (fielddefinition.Name_Trimupper == name_Field_ExpectedUpper) { //ヒット isHit2 = true; recordFielddefinition1.Add(fielddefinition); count++; isBreak2 = true; goto gt_NextField; } gt_NextField: ; }, log_Reports); if (!isHit2) { // 一致するものが無かった場合。 recordFielddefinition1.Add(new FielddefinitionImpl("<null>", EnumTypeFielddefinition.String));//桁合わせ。 isResult = false; if (isRequired) { // エラー。 error_NameField_Expected = nameField_Expected; goto gt_Error_NothingField1; } // 正常 goto gt_EndMethod; } } // 正常 if (count < 1) { isResult = false; if (isRequired) { // エラー。 StringBuilder s = new StringBuilder(); foreach (string sFld in list_NameField_Expected) { s.Append("["); s.Append(sFld); s.Append("]"); } error_NameField_Expected = s.ToString(); goto gt_Error_NothingField2; } } // 正常 goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_ParamNothingField: { isResult = false; if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー121!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("["); s.Append(this.Name); s.Append("]テーブルの列定義を調べようとしましたが、列名が指定されていません。sExpectedFieldNameList.Count=["); s.Append(list_NameField_Expected.Count); s.Append("]"); // ヒント r.Message = s.ToString(); log_Reports.EndCreateReport(); } } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_NothingField1: isResult = false; if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー131!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("["); s.Append(this.Name); s.Append("]テーブルに、["); s.Append(error_NameField_Expected); s.Append("]フィールドは存在しませんでした。"); s.Newline(); s.Newline(); // ヒント s.Append("──────────定義されている列のリスト"); s.Newline(); s.Append(recordFielddefinition1.ToString_DebugDump()); s.Newline(); s.Append("──────────"); s.Newline(); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_NothingField2: isResult = false; if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー132!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("["); s.Append(this.Name); s.Append("]テーブルに、["); s.Append(error_NameField_Expected); s.Append("]フィールドは存在しませんでした。"); s.Newline(); s.Newline(); // ヒント s.Append("──────────定義されている列のリスト"); s.Newline(); s.Append(recordFielddefinition1.ToString_DebugDump()); s.Newline(); s.Append("──────────"); s.Newline(); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: out_RecordFielddefinition3 = recordFielddefinition1; log_Method.EndMethod(log_Reports); return isResult; }
//──────────────────────────────────────── /// <summary> /// O_TableImpl#AddRecordListで使います。 /// </summary> /// <param name="columnIndex"></param> /// <param name="value"></param> /// <param name="oTable"></param> /// <param name="log_Reports"></param> /// <returns></returns> public static Value_Humaninput ConfigurationTo_Field( int index_Column, string value, RecordFielddefinition recordFielddefinition, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Table.Name_Library, "Utility_Row", "ConfigurationTo_Field", log_Reports); // // // セルのソースヒント名 string nodeConfigtree; try { nodeConfigtree = recordFielddefinition.ValueAt(index_Column).Name_Humaninput; } catch (ArgumentOutOfRangeException) { // エラー goto gt_Error_Index; } Value_Humaninput result; // 型毎に処理を分けます。 switch (recordFielddefinition.ValueAt(index_Column).Type_Field) { case EnumTypeFielddefinition.Int: { // 空白データも自動処理 Int_HumaninputImpl cellData = new Int_HumaninputImpl(nodeConfigtree); cellData.Text = value; result = cellData; } break; case EnumTypeFielddefinition.Bool: { // 空白データも自動処理 Bool_HumaninputImpl cellData = new Bool_HumaninputImpl(nodeConfigtree); cellData.Text = value; result = cellData; } break; default: { String_HumaninputImpl cellData = new String_HumaninputImpl(nodeConfigtree); cellData.Text = value; result = cellData; } break; } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_Index: result = null; if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー461!", log_Method); Log_TextIndented t = new Log_TextIndentedImpl(); t.Append("列インデックス[" + index_Column + "](0スタート)が指定されましたが、"); t.Newline(); t.Append("列は[" + recordFielddefinition.Count + "]個しかありません。(列定義リストは、絞りこまれている場合もあります)"); t.Newline(); // ヒント r.Message = t.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); return result; }