From 054e1c9c10a06d130ab667cf8ea78e4aa9bfcac4 Mon Sep 17 00:00:00 2001 From: LGram16 Date: Sun, 8 Mar 2026 17:37:39 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A7=88=ED=81=AC=EB=AA=A9=EB=A1=9D=ED=99=94?= =?UTF-8?q?=EB=A9=B4=EC=97=90=EC=84=9C=20=EC=8B=A0=EA=B7=9C=EB=A7=88?= =?UTF-8?q?=ED=81=AC=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=EC=97=90=20=EB=B9=84?= =?UTF-8?q?=EA=B3=A0=EB=9E=80=EC=9D=B4=20=EC=B4=88=EA=B8=B0=ED=99=94?= =?UTF-8?q?=EB=90=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=98=84=EC=83=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95(=EB=B9=84=EA=B3=A0=EB=9E=80=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80)=20=EB=A7=88=ED=81=AC=EB=AA=A9=EB=A1=9D=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=8B=A0=EA=B7=9C=20=EB=A7=88=ED=81=AC=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20=ED=9B=84=20=EB=B0=94=EB=A1=9C=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=9D=B4=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=98=84=EC=83=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95(=EB=8D=B0=EC=9D=B4=ED=84=B0=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=EB=B6=88=EC=9D=BC=EC=B9=98=EB=A1=9C=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=20SKIP)=20=EB=A7=88=ED=81=AC=EC=A0=95?= =?UTF-8?q?=EB=A6=AC=EC=97=90=EC=84=9C=20=EC=9D=BC=EB=B6=80=20=EB=A7=88?= =?UTF-8?q?=ED=81=AC=ED=8C=8C=EC=9D=BC=20=EB=B6=88=EB=9F=AC=EC=98=A4?= =?UTF-8?q?=EA=B8=B0=EC=97=90=EC=84=9C=20=EC=98=A4=EB=A5=98=EA=B0=80=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=ED=95=98=EB=8A=94=20=ED=98=84=EC=83=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95(=EC=9B=90=EC=9D=B8=20:=20=EA=B0=80=EA=B2=A9?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EC=97=86=EC=9D=8C)=20=EB=A7=88=ED=81=AC?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=EC=97=90=EC=84=9C=20=EC=A0=81=EC=83=89?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=EC=9D=98=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EB=A7=88=ED=81=AC=20100a=20=EC=97=90=20=EC=84=9C=EB=AA=85?= =?UTF-8?q?=EC=9D=B4=20=EC=9E=85=EB=A0=A5=EB=90=98=EB=8A=94=20=ED=98=84?= =?UTF-8?q?=EC=83=81=20=EC=88=98=EC=A0=95(=EA=B8=B0=EB=B3=B8=EB=A7=88?= =?UTF-8?q?=ED=81=AC=EB=A1=9C=EC=A7=81=EC=98=A4=EB=A5=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unimarc/unimarc/Helper/Database.cs | 8 +-- unimarc/unimarc/PUB.cs | 2 +- unimarc/unimarc/Properties/AssemblyInfo.cs | 4 +- unimarc/unimarc/마크/Marc2.cs | 54 ++++++++++++------- unimarc/unimarc/마크/MarcEditorControl.cs | 4 +- unimarc/unimarc/마크/Marc_Plan.cs | 14 ++++- .../unimarc/마크/Marc_Plan_Sub_SelectList.cs | 5 +- 7 files changed, 62 insertions(+), 29 deletions(-) diff --git a/unimarc/unimarc/Helper/Database.cs b/unimarc/unimarc/Helper/Database.cs index 5454195..91062a3 100644 --- a/unimarc/unimarc/Helper/Database.cs +++ b/unimarc/unimarc/Helper/Database.cs @@ -295,7 +295,7 @@ namespace UniMarc } - public static (bool result, int newidx, string message) UpdateMarc(int midx, string FullMarc, int v_grade, + public static (bool result, int newidx, string message,string date) UpdateMarc(int midx, string FullMarc, int v_grade, string etc1, string etc2, string url, string v_orgmarc) { var isUpdate = midx > 0; @@ -307,7 +307,7 @@ namespace UniMarc //상황에 맞게 업데이트 명령을 처리한다. var basicinfo = GetBasicMarcInfo(FullMarc); - if (basicinfo.Success == false) return (false, 0, basicinfo.Message); + if (basicinfo.Success == false) return (false, 0, basicinfo.Message,v_date); @@ -392,10 +392,10 @@ namespace UniMarc var ret = Helper_DB.ExcuteNonQuery(U_cmd); if (ret.applyCount != 1) { - return (false, midx, $"업데이트된 행의 수가 1이 아닙니다. 적용된 행 수: {ret.applyCount}, 오류 메시지: {ret.errorMessage}"); + return (false, midx, $"업데이트된 행의 수가 1이 아닙니다. 적용된 행 수: {ret.applyCount}, 오류 메시지: {ret.errorMessage}", v_date); } } - return (true, midx, string.Empty); + return (true, midx, string.Empty, v_date); } } diff --git a/unimarc/unimarc/PUB.cs b/unimarc/unimarc/PUB.cs index 55bd889..29af98e 100644 --- a/unimarc/unimarc/PUB.cs +++ b/unimarc/unimarc/PUB.cs @@ -55,7 +55,7 @@ namespace UniMarc string Empty_text = string.Format( "020\t \t▼a{1}▼c\\{5}▲\n" + "056\t \t▼a▼25▲\n" + - "100\t \t▼a{2}▲\n" + + "100\t \t▼a{3}▲\n" + "245\t \t▼a{2}▼d{3}▲\n" + "260\t \t▼b{4}▲\n" + "300\t \t▼a▼c▲\n" + diff --git a/unimarc/unimarc/Properties/AssemblyInfo.cs b/unimarc/unimarc/Properties/AssemblyInfo.cs index 3d55692..f7f6479 100644 --- a/unimarc/unimarc/Properties/AssemblyInfo.cs +++ b/unimarc/unimarc/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를 // 기본값으로 할 수 있습니다. // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2026.03.02.1630")] -[assembly: AssemblyFileVersion("2026.03.02.1630")] +[assembly: AssemblyVersion("2026.03.08.1700")] +[assembly: AssemblyFileVersion("2026.03.08.1700")] diff --git a/unimarc/unimarc/마크/Marc2.cs b/unimarc/unimarc/마크/Marc2.cs index 7f4ee8c..9884204 100644 --- a/unimarc/unimarc/마크/Marc2.cs +++ b/unimarc/unimarc/마크/Marc2.cs @@ -948,7 +948,6 @@ namespace UniMarc string date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); string orimarc = marcEditorControl1.MakeMarcString(); - //아래는 실제 폼에서의 저장코드 // [신규 방식: 데이터 객체(Item) 중심 로직] var item = this.dataList.Where(t => t.ListIdx == this.Param.ListIdx).FirstOrDefault(); @@ -959,18 +958,12 @@ namespace UniMarc // cb_grade.SelectedIndex.ToString(); // 등급은 0~3의 숫자로 저장된다고 가정 var v_grade = uC_SelectGrade1.Grade == -1 ? "" : uC_SelectGrade1.Grade.ToString(); - //if (radA.Checked) v_grade = "0"; - //else if (radB.Checked) v_grade = "1"; - //else if (radC.Checked) v_grade = "2"; - //else if (radD.Checked) v_grade = "3"; - var v_etc1 = this.etc1.Text.Trim(); var v_etc2 = this.etc2.Text.Trim(); // 1. DB 작업 (공용 메서드로 통합 관리) int targetMarcIdx = (item.Status == MarcRecordStatus.MyCompany) ? item.MarcIdx : 0; var saveResult = Helper_DB.UpdateMarc(targetMarcIdx, orimarc, uC_SelectGrade1.Grade, v_etc1, v_etc2, this.Param.URL, this.Param.OriginalMarc); - if (saveResult.result == false) { UTIL.MsgE(saveResult.message); @@ -978,20 +971,38 @@ namespace UniMarc } // 새로 생성된 인덱스 반영 - item.MarcIdx = saveResult.newidx; - - + if(saveResult.newidx != item.MarcIdx) + { + Console.WriteLine($"new marc index set : {item.MarcIdx} to {saveResult.newidx}"); + item.MarcIdx = saveResult.newidx; + } + // 2. 객체 데이터 업데이트 및 시각적 상태 계산 item.Status = MarcRecordStatus.MyCompany; item.BackColor = GetSaveDateColor(date); item.Grade = v_grade; //등급업데이트추가 + item.DbMarc = orimarc; + + SetMarcItemInfo(item, + saveResult.newidx, + PUB.user.CompanyIdx, + orimarc, + v_grade, + PUB.user.UserName, + saveResult.date, + string.Empty); + + // 3. 목록 인덱스 연동 업데이트 (Obj_List_Book) string UpdateListIndex = string.Format("UPDATE `Obj_List_Book` SET `m_idx` = {0} WHERE `idx` = {1} AND `compidx` = \"{2}\";", item.MarcIdx, item.ListIdx, mCompidx); Helper_DB.ExcuteNonQuery(UpdateListIndex); + //업데이트되도록 원래데이터를 초기화한다 260308 + mOldMarc = string.Empty; + mOldMarIdx = -1; + // 4. BindingSource 갱신으로 UI 자동 업데이트 - bs1.ResetCurrentItem(); bs1_CurrentChanged(null, null); UTIL.MsgI("저장되었습니다!"); } @@ -1080,7 +1091,13 @@ namespace UniMarc { if (!mLoadCompleted) return; var dr = bs1.Current as MarcBookItem; - if (dr == null) return; + if (dr == null) + { + mOldMarIdx = -1; + return; + } + + if (mOldMarc == null) mOldMarc = string.Empty; //if (List_Book.CurrentCell == null) return; //int row_idx = List_Book.CurrentCell.RowIndex; @@ -1152,26 +1169,27 @@ namespace UniMarc OriginalMarc = dbMarc, }; var defMarc = PUB.MakeEmptyMarc(isbn13, bookName, author, publisher, price); - marcEditorControl1.LoadBookData(dbMarc, isbn13, defMarc); + var load_ret = marcEditorControl1.LoadBookData(dbMarc, isbn13, defMarc); //등급선택 (dbMarc 데이터를 확인하여. 등급을 결정한다) int gradeNo; - bool check_Marc = dbMarc.Length >= 3; - if (!check_Marc) + if (load_ret ==false) { //richTextBox1.Text = Make_Empty(); gradeNo = 3; //마크가 없는것은 D등급으로 한다 + remark.remark1 = string.Empty; + remark.remark2 = string.Empty; } else { - etc1.Text = remark.remark1; - etc2.Text = remark.remark2; - //자료의 등급 다시 선택 if (int.TryParse(grade, out gradeNo) == false) gradeNo = 2; } + etc1.Text = remark.remark1; + etc2.Text = remark.remark2; + uC_SelectGrade1.Grade = gradeNo; lbl_SaveData.Multiline = true; diff --git a/unimarc/unimarc/마크/MarcEditorControl.cs b/unimarc/unimarc/마크/MarcEditorControl.cs index 0c830b1..0735f03 100644 --- a/unimarc/unimarc/마크/MarcEditorControl.cs +++ b/unimarc/unimarc/마크/MarcEditorControl.cs @@ -122,7 +122,7 @@ namespace UniMarc /// /// /// - public void LoadBookData(string dbMarc, string isbn = "", string defaultMarc = "") + public bool LoadBookData(string dbMarc, string isbn = "", string defaultMarc = "") { mLoadCompleted = false; richTextBox1.Text = ""; @@ -182,6 +182,8 @@ namespace UniMarc UpdateTextColor(); mLoadCompleted = true; + + return check_Marc; } diff --git a/unimarc/unimarc/마크/Marc_Plan.cs b/unimarc/unimarc/마크/Marc_Plan.cs index 09fd749..1654bd5 100644 --- a/unimarc/unimarc/마크/Marc_Plan.cs +++ b/unimarc/unimarc/마크/Marc_Plan.cs @@ -173,7 +173,19 @@ namespace UniMarc item.SBookNum2 = dr["s_book_num2"].ToString(); item.Author = dr["author"].ToString(); item.BookComp = dr["book_comp"].ToString(); - item.Price = dr["price"] != DBNull.Value ? Convert.ToInt32(dr["price"]) : 0; + if(dr["price"] ==DBNull.Value) + { + item.Price = 0; + } + else + { + var str_price = dr["price"].ToString(); + if (int.TryParse(str_price, out int v_price)) + item.Price = v_price; + else + item.Price = 0; + } + item.Midx = dr["midx"] != DBNull.Value ? Convert.ToInt32(dr["midx"]) : 0; item.etc1 = dr["etc1"]?.ToString() ?? string.Empty; item.etc2 = dr["etc2"]?.ToString() ?? string.Empty; diff --git a/unimarc/unimarc/마크/Marc_Plan_Sub_SelectList.cs b/unimarc/unimarc/마크/Marc_Plan_Sub_SelectList.cs index 6e3df83..9f7bbe3 100644 --- a/unimarc/unimarc/마크/Marc_Plan_Sub_SelectList.cs +++ b/unimarc/unimarc/마크/Marc_Plan_Sub_SelectList.cs @@ -307,7 +307,8 @@ namespace UniMarc else if (v_110a.isEmpty() == false) v_author = v_110a; else if (v_100a.isEmpty() == false) v_author = v_100a; - + var str_price = fullparser.GetTag("950b").FirstOrDefault() ?? string.Empty; + int.TryParse(str_price, out int v_price); var item = new MarcPlanItem { RegNum = fullparser.GetTag("049l").FirstOrDefault(),// Search_Res[0], 등록번호 @@ -324,7 +325,7 @@ namespace UniMarc SBookNum2 = fullparser.GetTag("490v").FirstOrDefault(),//Search_Res[11],총서번호2 Author = v_author, BookComp = fullparser.GetTag("260b").FirstOrDefault(),//Search_Res[12],출판사 - Price = Convert.ToInt32(fullparser.GetTag("950b").FirstOrDefault()),//Search_Res[13],정가 + Price = v_price,//Convert.ToInt32(fullparser.GetTag("950b").FirstOrDefault()),//Search_Res[13],정가 Marc = fullmarc, ColCheck = "T" };