unote 書けば書くほどに

20230307

        private void button1_Click_1(object sender, EventArgs e)
        {
            //strSQL = strSQL_SEL + selTN;
            DataTable dtN = new DataTable();//全ての項目テーブル
            DataTable dtZ = new DataTable();//検索対象(NAME ALL)

            Console.WriteLine("実行...");

            //全ての項目テーブル
            strSQL = "select * from NOUKI";
            Console.WriteLine(strSQL);
            dtN = OraTableSelect(strSQL);

            //検索対象(NAME ALL)
            strSQL = "select * from ZAIKO";
            Console.WriteLine(strSQL);
            dtZ = OraTableSelect(strSQL);

            //word列追加する
            dtN.Columns.Add("word");
            dtN.Columns.Add("aimai");
            dtN.Columns.Add("hantei");
            dtN.Columns.Add("LOT");
            dtN.Columns.Add("SNOUKI");
            dtN.Columns.Add("BIKOU");

            int NCnt = dtN.Rows.Count;

            string strWord;
            string strAimai;
            string strLot;

            string str;
            string target = "-";
            int tgtidx;
            int X=0;

            //検索ワード作成
            for (int m = 0; m < NCnt; m++)
            {
                str = dtN.Rows[m]["SZUBAN"].ToString();
                tgtidx = str.IndexOf(target);

                if (tgtidx == -1)
                {
                    dtN.Rows[m]["word"] = str.Substring(tgtidx, -6);
                }
                else
                {
                    dtN.Rows[m]["word"] = str.Substring(tgtidx, str.Length - tgtidx);
                }

            }

            for (int count = 0; count < NCnt; count++)
            {
                //完全一致検索
                string tgtZUBAN = dtN.Rows[X]["NZUBAN"].ToString();

                var kanzen = 
                    dtZ.AsEnumerable().Where(i => i["ZZUBAN"].ToString().Contains(tgtZUBAN));

                if (kanzen.Any())//完全一致がある場合
                {
                    DataTable dtKanzen = kanzen.CopyToDataTable();
                    int kznCNT = dtKanzen.Rows.Count;

                    dtN.Rows[X]["aimai"] = dtN.Rows[0]["ZZUBAN"];
                    dtN.Rows[X]["LOT"] = dtKanzen.Rows[0]["LOT"].ToString();
                    dtN.Rows[X]["SNOUKI"] = dtKanzen.Rows[0]["SNOUKI"].ToString();
                    dtN.Rows[X]["BIKOU"] = dtKanzen.Rows[0]["BIKOU"].ToString();

                    //完全一致が1件のみ(単一ロット)
                    if (kznCNT == 1)
                    {
                        dtN.Rows[X]["hantei"] = "完全一致、単一ロット";
                        dtN.Rows[X]["aimai"] = dtKanzen.Rows[0]["ZZUBAN"].ToString();
                        X++;
                    }

                    //完全一致が2件以上(複数ロット)
                    else if (kznCNT >= 2)
                    {
                        int Y = X;//行を追加する前の行数を保持

                        dtN.Rows[X]["hantei"] = "完全一致、複数ロット";
                        dtN.Rows[X]["aimai"] = dtKanzen.Rows[0]["ZZUBAN"].ToString();

                        //★dtaddz();
                        for (int ar = 1; ar <= kznCNT - 1; ar++)
                        {

                            DataRow addrw = dtN.NewRow();
                            dtN.Rows.InsertAt(addrw, X + ar);//行追加(対象行,開始位置)
                            //★dtaddz();
                        }

                        X = Y + kznCNT;//次の行位置 
                    }
                    //else
                    //{
                    //    X++;
                    //}


                    //あいまい検索
                    strWord = dtN.Rows[X]["word"].ToString();
                    var tmpAimai =
                        dtZ.AsEnumerable().Where(i => i["ZZUBAN"].ToString().Contains(strWord));


                    if (tmpAimai.Any())
                    {
                        DataTable dttmp = tmpAimai.CopyToDataTable();

                        //完全一致を取り除いたデータを抽出
                        var aimai =
                            dttmp.AsEnumerable().Where(x => !x["ZZUBAN"].ToString().Contains(tgtZUBAN));


                        DataTable dtAimai = aimai.CopyToDataTable();
                        int aimaiCNT = dtAimai.Rows.Count;


                        if (aimaiCNT >= 2)
                        {
                            dtN.Rows[X]["hantei"] = "あり";
                            int Y = X;//行を追加する前の行数を保持

                            strAimai = dtAimai.Rows[0]["ZZUBAN"].ToString();
                            dtN.Rows[X]["aimai"] = strAimai;

                            dtN.Rows[X]["LOT"] = dtAimai.Rows[0]["LOT"].ToString();
                            dtN.Rows[X]["SNOUKI"] = dtAimai.Rows[0]["SNOUKI"].ToString();
                            dtN.Rows[X]["BIKOU"] = dtAimai.Rows[0]["BIKOU"].ToString();

                            for (int ar = 1; ar <= aimaiCNT - 1; ar++)
                            {
                                strAimai = dtAimai.Rows[ar]["ZZUBAN"].ToString();     //あいまいword

                                DataRow addrw = dtN.NewRow();
                                dtN.Rows.InsertAt(addrw, X + ar);//行追加(対象行,開始位置)

                                dtN.Rows[X + ar]["aimai"] = strAimai;
                                dtN.Rows[X + ar]["LOT"] = dtAimai.Rows[ar]["LOT"].ToString();
                                dtN.Rows[X + ar]["SNOUKI"] = dtAimai.Rows[ar]["SNOUKI"].ToString();
                                dtN.Rows[X + ar]["BIKOU"] = dtAimai.Rows[ar]["BIKOU"].ToString();
                            }

                            X = Y + aimaiCNT;//次の行位置 
                        }
                        else
                        {
                            X++;
                        }

                    }

                    else//あいまい一致なし
                    {
                        dtN.Rows[X]["hantei"] = "なし";
                        X++;
                    }

                }
                //完全一致なし
                else
                {
                    dtN.Rows[X]["hantei"] = "完全一致なし";
                    X++;
                }

            }         

            dataGridView1.DataSource = dtN;