From 1b77fd02b0b50d9d070ae6127bff14399046c49b Mon Sep 17 00:00:00 2001 From: LGram16 Date: Mon, 23 Feb 2026 22:29:01 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A7=88=ED=81=AC=EC=9E=91=EC=84=B1=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=99=84=EB=A3=8C,=20fullmarc=20=ED=95=B4=EC=84=9D?= =?UTF-8?q?=EA=B8=B0=201=EC=B0=A8=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unimarc/unimarc/Helper/MarcParser.cs | 121 ++++-- .../{sample_fullmarc => sample_fullmarc.txt} | 0 .../{sample_richtext => sample_richtext.txt} | 0 unimarc/unimarc/Program.cs | 6 + unimarc/unimarc/UniMarc.csproj | 8 +- unimarc/unimarc/마크/AddMarc2.cs | 408 +++++------------- 6 files changed, 200 insertions(+), 343 deletions(-) rename unimarc/unimarc/Helper/{sample_fullmarc => sample_fullmarc.txt} (100%) rename unimarc/unimarc/Helper/{sample_richtext => sample_richtext.txt} (100%) diff --git a/unimarc/unimarc/Helper/MarcParser.cs b/unimarc/unimarc/Helper/MarcParser.cs index 8e97951..4676d44 100644 --- a/unimarc/unimarc/Helper/MarcParser.cs +++ b/unimarc/unimarc/Helper/MarcParser.cs @@ -1,3 +1,4 @@ +using Org.BouncyCastle.Pkcs; using System; using System.Collections.Generic; using System.Linq; @@ -46,7 +47,7 @@ namespace UniMarc { if (IsControlField) return $"{Tag}\t \t{ControlValue}▲"; - + StringBuilder sb = new StringBuilder(); sb.Append($"{Tag}\t{Indicators}\t"); foreach (var sub in Subfields) @@ -84,7 +85,7 @@ namespace UniMarc MarcField field = new MarcField(tag); string[] parts = cleanLine.Split('\t'); - + if (field.IsControlField) { if (parts.Length >= 3) @@ -94,11 +95,11 @@ namespace UniMarc } else { - if (parts.Length >= 2) + if (parts.Length >= 2) field.Indicators = parts[1].PadRight(2).Substring(0, 2); - + string dataPart = parts.Length >= 3 ? parts[2] : ""; - if (parts.Length < 3 && cleanLine.Length > 5) + if (parts.Length < 3 && cleanLine.Length > 5) dataPart = cleanLine.Substring(5); dataPart = dataPart.TrimEnd(FIELD_TERMINATOR); @@ -155,47 +156,75 @@ namespace UniMarc } } } - - public void ParseFullMarc(string data) + public (bool success, string message) ParseFullMarc(string data) { + + System.Text.StringBuilder AlertMessage = new StringBuilder(); Fields.Clear(); - if (string.IsNullOrEmpty(data) || data.Length < 24) return; + if (data.Length < 24) return (false, "마크데이터가 24보다 작습니다"); + //리더부는 항상 24바이트이다. 0~23까지이다. Leader = data.Substring(0, 24); - if (!int.TryParse(Leader.Substring(12, 5), out int baseAddress)) return; + if (!int.TryParse(Leader.Substring(12, 5), out int baseAddress)) return (false, string.Empty); - // Detection: Is the directory using Standard Byte Offsets (ANSI) or Scaled Byte Offsets (Unicode/UTF16)? - bool isScaled = false; - if (data.Length >= 31) + //data Length + if (int.TryParse(Leader.Substring(0, 5), out int dataLength) == false) { - if (int.TryParse(data.Substring(27, 4), out int len008) && len008 > 75) - isScaled = true; + return (false, "Leader 전체 데이터 길이를 확인할 수 없습니다"); } + + + + + + bool isScaled = false; + + int directoryLength = baseAddress - 24; int entryCount = directoryLength / 12; + var directory = data.Substring(24, directoryLength); - for (int i = 0; i < entryCount; i++) + var RealData = data.Substring(24 + directoryLength); + if (RealData.Contains((char)0x1D) == false) { - int entryStart = 24 + (i * 12); - if (entryStart + 12 > data.Length) break; - if (data[entryStart] == '\x1E' || data[entryStart] == '^' || data[entryStart] == FIELD_TERMINATOR) break; + AlertMessage.AppendLine($"레코드식별기호 0x1D 가 없습니다"); + } + else RealData = RealData.Trim((char)0x1D); - string tag = data.Substring(entryStart, 3); - if (!int.TryParse(data.Substring(entryStart + 3, 4), out int length)) continue; - if (!int.TryParse(data.Substring(entryStart + 7, 5), out int offset)) continue; + //태그별식별기호로 분리한다. + if (RealData[RealData.Length - 1] == (char)0x1E) + RealData = RealData.Substring(0, RealData.Length - 1); - // Scaling logic: directory values represent Unicode byte offsets (2x chars) - // Integer division (offset / 2) maps the byte offset to the starting char index. - // Addition of 1 to length before division handles odd byte-lengths (markers). - int actualOffset = isScaled ? (offset / 2) : offset; - int actualLength = isScaled ? ((length + 1) / 2) : length; + var Tags = RealData.Split((char)0x1E); + if(Tags.Length != entryCount) + { + AlertMessage.AppendLine($"디렉토리 카운트({entryCount})와 태그수량({Tags.Length})이 일치하지 않습니다"); + } - if (baseAddress + actualOffset >= data.Length) continue; - if (baseAddress + actualOffset + actualLength > data.Length) - actualLength = data.Length - (baseAddress + actualOffset); + for (int i = 0; i < Math.Min(entryCount,Tags.Length); i++) + { + int entryStart = (i * 12); - string fieldData = data.Substring(baseAddress + actualOffset, actualLength); + //TAG(3)+LENGTH(4)+OFFSET(5)=12 + if (entryStart + 12 > directory.Length) break; + if (directory[entryStart] == '\x1E' || directory[entryStart] == '^' || directory[entryStart] == FIELD_TERMINATOR) break; + + string tag = directory.Substring(entryStart, 3); + var tag_len = directory.Substring(entryStart + 3, 4); + var tag_off = directory.Substring(entryStart + 7, 5); + + if (!int.TryParse(tag_len, out int length)) + { + AlertMessage.AppendLine($"태그({tag}) 길이를 확인할 수 없습니다 값:{tag_len}"); + } + if (!int.TryParse(tag_off, out int offset)) + { + AlertMessage.AppendLine($"태그({tag}) 오프셋을 확인할 수 없습니다 값:{offset}"); + } + + + string fieldData = Tags[i]; fieldData = fieldData.TrimEnd('\x1E', '\x1D', FIELD_TERMINATOR, '^', ' '); MarcField field = new MarcField(tag); @@ -203,16 +232,42 @@ namespace UniMarc field.ControlValue = fieldData; else { - if (fieldData.Length >= 2) + var subfieldIndex = fieldData.IndexOf((char)0x1f); + string fielddata = ""; + if (subfieldIndex < 0) + { + //1f가 없는 것은 오류 처리한다. + continue; + } + else if (subfieldIndex < 1) + { + //지시기호없이 데이터가 시작되는경우이다. + field.Indicators = " "; + ParseSubfields(field, fieldData); + } + else if (subfieldIndex < 2) + { + //지시기호가1개이다 뒤에 공백을 넣자 + field.Indicators = fieldData.Substring(0, subfieldIndex) + " "; + ParseSubfields(field, fieldData.Substring(1)); + } + else if (subfieldIndex > 2) + { + //지시기호가 2자리보다 길다? 이건 오류처리하자. + field.Indicators = " "; + ParseSubfields(field, fieldData.Substring(subfieldIndex)); + } + else { field.Indicators = fieldData.Substring(0, 2); ParseSubfields(field, fieldData.Substring(2)); } - else if (fieldData.Length > 0) - ParseSubfields(field, fieldData); + } Fields.Add(field); } + + return (true, AlertMessage.ToString()); } public List GetTag(string path) diff --git a/unimarc/unimarc/Helper/sample_fullmarc b/unimarc/unimarc/Helper/sample_fullmarc.txt similarity index 100% rename from unimarc/unimarc/Helper/sample_fullmarc rename to unimarc/unimarc/Helper/sample_fullmarc.txt diff --git a/unimarc/unimarc/Helper/sample_richtext b/unimarc/unimarc/Helper/sample_richtext.txt similarity index 100% rename from unimarc/unimarc/Helper/sample_richtext rename to unimarc/unimarc/Helper/sample_richtext.txt diff --git a/unimarc/unimarc/Program.cs b/unimarc/unimarc/Program.cs index 3fbe2fe..4896cb8 100644 --- a/unimarc/unimarc/Program.cs +++ b/unimarc/unimarc/Program.cs @@ -16,6 +16,12 @@ namespace UniMarc { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); + + //var parserF = new UniMarc.MarcParser(); + //var fullMarc = System.IO.File.ReadAllText(".\\Helper\\sample_fullmarc.txt"); + //var rlt = parserF.ParseFullMarc(fullMarc); + //if(rlt.success==false) + //AR.UTIL.MsgE("unitmarc"); try { diff --git a/unimarc/unimarc/UniMarc.csproj b/unimarc/unimarc/UniMarc.csproj index 990d5a5..b626042 100644 --- a/unimarc/unimarc/UniMarc.csproj +++ b/unimarc/unimarc/UniMarc.csproj @@ -2047,8 +2047,12 @@ Reference.svcmap - - + + PreserveNewest + + + PreserveNewest + diff --git a/unimarc/unimarc/마크/AddMarc2.cs b/unimarc/unimarc/마크/AddMarc2.cs index 970f19f..dd1870b 100644 --- a/unimarc/unimarc/마크/AddMarc2.cs +++ b/unimarc/unimarc/마크/AddMarc2.cs @@ -55,13 +55,6 @@ namespace UniMarc this.marcEditorControl1.SetMarcString(marc); } - private void MarcEditorControl1_BookSaved(object sender, EventArgs e) - { - // Removed - logic moved to btn_Save_Click - } - - - private void tb_ISBN_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode != Keys.Enter) @@ -119,11 +112,6 @@ namespace UniMarc } - private void btn_close_Click(object sender, EventArgs e) - { - this.Close(); - } - private void btn_Empty_Click(object sender, EventArgs e) { TextReset(); @@ -197,202 +185,36 @@ namespace UniMarc } - #region SaveSub /// /// 마크DB에 UPDATE해주는 함수 /// /// 테이블 이름 /// 마크 인덱스 번호 - /// 한줄짜리 마크 + /// 한줄짜리 마크 /// 마크 등급 /// 분류기호 - /// 저장시각 yyyy-MM-dd HH:mm:ss - void UpdateMarc(string MarcIndex, string oriMarc, string grade, string tag056, string tag008, string date) + /// 저장시각 yyyy-MM-dd HH:mm:ss + void UpdateMarc(string MarcIndex, string FullMarc, string grade) { - var etc1 = rtEtc1.Text.Trim(); - var etc2 = rtEtc2.Text.Trim(); + //도서정보추출 + var v_isbn = ""; + var v_price = ""; + var v_author = ""; + var v_title = ""; + var v_publisher = ""; + var v_date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - if (grade.isEmpty()) grade = "2"; - string[] EditTable = - { - "compidx", "marc", "marc_chk","marc1", "marc_chk1", "비고1", - "비고2", "division", "008tag", "date", "user", - "grade" - }; - string[] EditColumn = - { - PUB.user.CompanyIdx, oriMarc, "1",mOldMarc, "0", etc1, - etc2, tag056, tag008, date, PUB.user.UserName, - grade.ToString() - }; - - string[] SearchTable = { "idx", "compidx" }; - string[] SearchColumn = { MarcIndex, PUB.user.CompanyIdx }; - - //int marcChk = subMarcChk(Table, MarcIndex); - //if (IsCovertDate) - // marcChk--; - - //switch (marcChk) - //{ - // case 0: - // EditTable[1] = "marc1"; - // EditTable[2] = "marc_chk1"; - // EditTable[3] = "marc_chk"; - // break; - // case 1: - // EditTable[1] = "marc2"; - // EditTable[2] = "marc_chk2"; - // EditTable[3] = "marc_chk1"; - // break; - // case 2: - // EditTable[1] = "marc"; - // EditTable[2] = "marc_chk"; - // EditTable[3] = "marc_chk2"; - // break; - // default: - // EditTable[1] = "marc"; - // EditTable[2] = "marc_chk"; - // EditTable[3] = "marc_chk2"; - // break; - //} - string UpCMD = db.More_Update("Marc", EditTable, EditColumn, SearchTable, SearchColumn); - PUB.log.Add("ADDMarcUPDATE", string.Format("{0}({1}) : {2}", PUB.user.UserName, PUB.user.CompanyIdx, UpCMD.Replace("\r", " ").Replace("\n", " "))); - var rlt = Helper_DB.ExcuteNonQuery(UpCMD); - if (rlt.applyCount != 1) - UTIL.MsgE(rlt.errorMessage); - else - UTIL.MsgI("변경 완료"); - } - - - - /// - /// 마크DB에 INSERT해주는 함수 - /// - /// 테이블 이름 - /// 0:ISBN 1:서명 2:저자 3:출판사 4:정가 - /// 한줄짜리 마크 - /// 마크 등급 - /// 분류기호 - /// 저장시각 yyyy-MM-dd HH:mm:ss - void InsertMarc(string[] BookData, string oriMarc, string grade, string tag056, string tag008, string date) - { - if (grade.isEmpty()) grade = "2"; - var etc1 = rtEtc1.Text.Trim(); - var etc2 = rtEtc2.Text.Trim(); - string[] InsertTable = - { - "ISBN", "서명", "저자", "출판사", "가격", - "marc", "비고1", "비고2", "grade", "marc_chk", - "user", "division", "008tag", "date", "compidx" - }; - - //데이터중복검사필요 - //동일 isbnd있다면 그래도 저장할건지 한번 더 물어봐야 함 - if (DB_Utils.ExistISBN(BookData[0])) - { - if (UTIL.MsgQ("동일한 ISBN이 이미 존재합니다. 그래도 저장하시겠습니까?") == DialogResult.No) - return; - } - - string[] InsertColumn = - { - BookData[0], BookData[1], BookData[2], BookData[3], BookData[4], - oriMarc, etc1, etc2, grade.ToString(), "1", - PUB.user.UserName, tag056, tag008, date, PUB.user.CompanyIdx - }; - - string InCMD = db.DB_INSERT("Marc", InsertTable, InsertColumn); - PUB.log.Add("ADDMarcINSERT", string.Format("{0}({1}) : {2}", PUB.user.UserName, PUB.user.CompanyIdx, InCMD.Replace("\r", " ").Replace("\n", " "))); - var rlt = Helper_DB.ExcuteInsertGetIndex(InCMD); - if (rlt.errorMessage.isEmpty() == false) - UTIL.MsgE(rlt.errorMessage); - else - { - lbl_Midx.Tag = rlt.value.ToString(); - lbl_Midx.Text = rlt.value.ToString(); - UTIL.MsgI($"저장 완료\n\nIDX:{rlt.value}"); - } - } - - /// - /// 마크 저장시 사용하며, 마지막 수정일과 수정자를 가져와 덮어씌울지 백업데이터를 만들지 구분 - /// - /// 저장할 마크의 마지막 수정일 - /// 저장할 마크의 마지막 수정자 - /// 마지막 수정일로부터 2일이 지나지 않고, 마지막 수정자와 해당 유저가 동일 할 경우 True 반환 - private bool IsCoverData(int TimeSpanDaysValue, string user) - { - if (TimeSpanDaysValue < -1) - return false; - if (user != PUB.user.UserName) - return false; - return true; - } - - private TimeSpan CheckDate(string LastDate, string SaveDate) - { - DateTime Last = Convert.ToDateTime(LastDate); - DateTime Save = Convert.ToDateTime(SaveDate); - - return Last - Save; - } - - - - - - /// - /// 관련 도서 정보를 가져옴 - /// - /// 뷰형태의 마크 - /// 0:ISBN 1:서명 2:저자 3:출판사 4:정가 - string[] GetBookData(string ViewMarc) - { - // ISBN, BookName, Author, BookComp, Price - string[] result = { "", "", "", "", "" }; - bool IsISBN = false; - string[] TargetArr = ViewMarc.Split('\n'); - foreach (string Target in TargetArr) - { - string[] tmp = Target.Replace("▲", "").Split('\t'); - // 0:ISBN 4:Price - if (tmp[0] == "020" && !IsISBN) - { - IsISBN = true; - result[0] = GetMiddelString(tmp[2], "▼a", "▼"); - result[4] = GetMiddelString(tmp[2], "▼c", "▼"); - } - - // 2:Author - if (tmp[0] == "100") - result[2] = GetMiddelString(tmp[2], "▼a", "▼"); - else if (tmp[0] == "110") - result[2] = GetMiddelString(tmp[2], "▼a", "▼"); - else if (tmp[0] == "111") - result[2] = GetMiddelString(tmp[2], "▼a", "▼"); - - // 1:BookName - if (tmp[0] == "245") - result[1] = GetMiddelString(tmp[2], "▼a", "▼"); - - // 3:BookComp - if (tmp[0] == "300") - result[3] = GetMiddelString(tmp[2], "▼b", "▼"); - } - - //파서를 사용해서 변경한다 + //파서를 사용해서 변경한다 var parser = new UniMarc.MarcParser(); - parser.ParseMnemonic(ViewMarc); + parser.ParseFullMarc(FullMarc); //ISBN와 가격 (처음나오는 020태그의 값을 적용) var tag_020 = parser.GetTag("020").FirstOrDefault(); if (tag_020 != null) { - result[0] = tag_020.GetSubfieldValue('a'); - result[4] = tag_020.GetSubfieldValue('c'); + v_isbn = tag_020.GetSubfieldValue('a'); + v_price = tag_020.GetSubfieldValue('c'); } //저자(100 -> 110 -> 111 순으로 적용) @@ -400,112 +222,109 @@ namespace UniMarc var tag_110 = parser.GetTag("110").FirstOrDefault(); var tag_111 = parser.GetTag("111").FirstOrDefault(); if (tag_111 != null) - result[2] = tag_111.GetSubfieldValue('a'); + v_author = tag_111.GetSubfieldValue('a'); else if (tag_110 != null) - result[2] = tag_110.GetSubfieldValue('a'); + v_author = tag_110.GetSubfieldValue('a'); else if (tag_100 != null) - result[2] = tag_100.GetSubfieldValue('a'); + v_author = tag_100.GetSubfieldValue('a'); //서명 var tag_245 = parser.GetTag("245a").FirstOrDefault(); - result[1] = tag_245?.Value ?? string.Empty; + v_title = tag_245?.Value ?? string.Empty; //출판사 var tag_300b = parser.GetTag("300b").FirstOrDefault(); - result[3] = tag_300b?.Value ?? string.Empty; + v_publisher = tag_300b?.Value ?? string.Empty; - return result; - } + //056a + var v_056 = parser.GetTag("056a").FirstOrDefault() ?? string.Empty; + var v_008 = parser.GetTag("008").FirstOrDefault() ?? string.Empty; - /// - /// 문자와 문자사이의 값 가져오기 - /// - /// 대상 문자열 - /// 시작 문자열 - /// 마지막 문자열 - /// 불러올 태그 번호 - /// 문자 사이값 - public string GetMiddelString(string str, string begin, string end, string TagNum = "") - { - string result = ""; - - if (string.IsNullOrEmpty(str) || str == "") - return result; - - int count = 0; - bool loop = false; - - for (int a = count; a < str.Length; a++) + if (v_056.isEmpty() || v_008.isEmpty()) { - count = str.IndexOf(begin); - if (count > -1) + UTIL.MsgE("056a | 008 태그의 값을 확인할 수 없습니다\n1.마크데이터를 확인 해주세요\n2.개발자에 해당 내용을 문의하세요"); + return; + } + + if (v_isbn.isEmpty() || v_title.isEmpty()) + { + UTIL.MsgE("ISBN과 서명을 추출하지 못했습니다\n1.마크데이터를 확인 해주세요\n2.개발자에 해당 내용을 문의하세요"); + return; + } + + var etc1 = rtEtc1.Text.Trim(); + var etc2 = rtEtc2.Text.Trim(); + + if (grade.isEmpty()) grade = "2"; + + + if (MarcIndex.isEmpty()) + { + //insert + string[] InsertTable = { - str = str.Substring(count + begin.Length); - if (loop) - // 여러 태그들 구분을 지어줌. - result += "▽"; + "ISBN", "서명", "저자", "출판사", "가격", + "marc", "비고1", "비고2", "grade", "marc_chk", + "user", "division", "008tag", "date", "compidx" + }; - if (str.IndexOf(end) > -1) - result += str.Substring(0, str.IndexOf(end)); - else - result += str; - - result = TrimEndGubun(result, TagNum); + //데이터중복검사필요 + //동일 isbnd있다면 그래도 저장할건지 한번 더 물어봐야 함 + if (DB_Utils.ExistISBN(v_isbn)) + { + if (UTIL.MsgQ("동일한 ISBN이 이미 존재합니다. 그래도 저장하시겠습니까?") == DialogResult.No) + return; } + + string[] InsertColumn = + { + v_isbn, v_title, v_author, v_publisher, v_price, + FullMarc, etc1, etc2, grade.ToString(), "1", + PUB.user.UserName, v_056, v_008, v_date, PUB.user.CompanyIdx + }; + + string InCMD = db.DB_INSERT("Marc", InsertTable, InsertColumn); + PUB.log.Add("ADDMarcINSERT", string.Format("{0}({1}) : {2}", PUB.user.UserName, PUB.user.CompanyIdx, InCMD.Replace("\r", " ").Replace("\n", " "))); + var rlt = Helper_DB.ExcuteInsertGetIndex(InCMD); + if (rlt.errorMessage.isEmpty() == false) + UTIL.MsgE(rlt.errorMessage); else - break; - - loop = true; - } - - return result; - } - - string TrimEndGubun(string str, string TagNum) - { - char[] gu = { '.', ',', ':', ';', '/', ' ' }; - if (TagNum == "300" || TagNum == "300a") - { - str = str.Trim(); - if (TagNum == "300a") { - gu = new char[] { '.', ',', '=', ':', ';', '/', '+', ' ' }; - for (int i = 0; i < gu.Length; i++) - { - str = str.TrimEnd(gu[i]); - } + lbl_Midx.Tag = rlt.value.ToString(); + lbl_Midx.Text = rlt.value.ToString(); + UTIL.MsgI($"저장 완료\n\nIDX:{rlt.value}"); } - - if (str.Contains("ill.")) - return str; - if (str.Contains("p.")) - return str; } - - if (TagNum == "710" || TagNum == "910") - return str; - - - if (TagNum == "245") gu = new char[] { '.', ':', ';', '/', ' ' }; - if (TagNum == "245a") gu = new char[] { '.', ',', '=', ':', ';', '/', ' ' }; - for (int i = 0; i < gu.Length; i++) + else { - str = str.TrimEnd(gu[i]); + //update + + string[] EditTable = + { + "compidx", "marc", "marc_chk","marc1", "marc_chk1", "비고1", + "비고2", "division", "008tag", "date", "user", + "grade" + }; + string[] EditColumn = + { + PUB.user.CompanyIdx, FullMarc, "1",mOldMarc, "0", etc1, + etc2, v_056, v_008, v_date, PUB.user.UserName, + grade.ToString() + }; + + string[] SearchTable = { "idx", "compidx" }; + string[] SearchColumn = { MarcIndex, PUB.user.CompanyIdx }; + + string UpCMD = db.More_Update("Marc", EditTable, EditColumn, SearchTable, SearchColumn); + PUB.log.Add("ADDMarcUPDATE", string.Format("{0}({1}) : {2}", PUB.user.UserName, PUB.user.CompanyIdx, UpCMD.Replace("\r", " ").Replace("\n", " "))); + var rlt = Helper_DB.ExcuteNonQuery(UpCMD); + if (rlt.applyCount != 1) + UTIL.MsgE(rlt.errorMessage); + else + UTIL.MsgI("변경 완료"); } - //foreach (char gubun in gu) - //{ - // if (str.Length < 1) continue; - // if (str[str.Length - 1] == gubun) - // { - // str = str.Remove(str.Length - 1); - // str = str.Trim(); - // } - //} - return str; } - #endregion - private void Btn_SearchKolis_Click(object sender, EventArgs e) { @@ -548,7 +367,7 @@ namespace UniMarc var inputdate = tag008.Substring(0, 6); if (inputdate == "000000") inputdate = DateTime.Now.ToString("yyMMdd"); - else + else if (inputdate != DateTime.Now.ToString("yyMMdd")) { if (UTIL.MsgQ($"입력일자({inputdate})를 오늘로 변경할까요?") == DialogResult.Yes) { @@ -560,43 +379,18 @@ namespace UniMarc if (marcEditorControl1.CheckValidation() == false) return; - - string tag056 = marcEditorControl1.Tag056(out string with008TagOutput);// Tag056(dbMarc, _param); //tag056을 호출해야 008이추가된다.그런후에 데이터를 처리해야함 string fullMarc = marcEditorControl1.MakeMarcString(); var marcString = marcEditorControl1.richTextBox1.Text; - var parser = new UniMarc.MarcParser(); - parser.ParseMnemonic(marcString); - - //풀마크분석은 아직 오류가 있음. + var parserF = new UniMarc.MarcParser(); parserF.ParseFullMarc(fullMarc); - var v_056 = parser.GetTag("056a").FirstOrDefault() ?? string.Empty; - - if (tag056.isEmpty()) - { - UTIL.MsgE("056 태그값을 확인할 수 없습니다\n개발자 문의 하세요"); - return; - } - string date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - //string orimarc = st.made_Ori_marc(dbMarc).Replace(@"\", "₩"); - - //if (!isMustTag(orimarc)) - //{ - // return; - //} - //var MarcText = fullMarc; string midx = this.lbl_Midx.Tag?.ToString() ?? string.Empty; - string[] BookData = GetBookData(marcString); - if (string.Join("", BookData).isEmpty()) - { - UTIL.MsgE("도서정보를 추출할 수 없습니다\n개발자 문의 하세요"); - return; - } + if (isUpdate == false) midx = string.Empty; var v_grade = ""; if (radA.Checked) v_grade = "0"; @@ -604,10 +398,8 @@ namespace UniMarc else if (radC.Checked) v_grade = "2"; else if (radD.Checked) v_grade = "3"; - if (isUpdate) - UpdateMarc(midx, fullMarc, v_grade, tag056, tag008, date); - else - InsertMarc(BookData, fullMarc, v_grade, tag056, tag008, date); + //midx 값이 emptry 라면 insert , 아니라면 update + UpdateMarc(midx, fullMarc, v_grade); }