Files
Unimarc/unimarc/unimarc/마크/AddMarc2.cs

409 lines
14 KiB
C#

using AR;
using SHDocVw;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace UniMarc
{
public partial class AddMarc2 : Form
{
Helper_DB db = new Helper_DB();
String_Text st = new String_Text();
Help008Tag tag008 = new Help008Tag();
private string mOldMarc = string.Empty;
Main m;
public AddMarc2(Main _m)
{
InitializeComponent();
db.DBcon();
marcEditorControl1.db = this.db;
m = _m;
}
private void AddMarc_Load(object sender, EventArgs e)
{
cb_SearchCol.SelectedIndex = 0;
TextReset();
this.KeyPreview = true;
this.radD.Checked = true; //등급기본
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.F9)
{
btn_Save_Click(this, EventArgs.Empty);
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
public void SetKolisValueApply(string marc)
{
this.marcEditorControl1.SetMarcString(marc);
}
private void tb_ISBN_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode != Keys.Enter)
return;
searchMarc();
}
void searchMarc()
{
TextReset();
string SearchText = tb_Search.Text;
string SearchCol = cb_SearchCol.SelectedItem.ToString();
using (var mcs = new MarcCopySelect2(SearchCol, SearchText))
if (mcs.ShowDialog() == DialogResult.OK)
{
/// 0:idx <br></br>
/// 1:compidx <br></br>
/// 2:user <br></br>
/// 3:date <br></br>
/// 4:grade <br></br>
/// 5:tag008 <br></br>
/// 6:LineMarc</param>
var selected = mcs.SelectedItem;
var defMarc = PUB.MakeEmptyMarc(selected.ISBN, "BookName", "Author", "Publisher", "Price");
this.marcEditorControl1.LoadBookData(selected.marc_db, selected.ISBN, defMarc);
mOldMarc = selected.marc_db;
if (selected.compidx != PUB.user.CompanyIdx)
{
UTIL.MsgI($"다른 기관의 데이터 입니다\n신규 등록모드로 실행됩니다.\n\n필요한 경우 입력일자를 업데이트하세요");
this.lbl_Midx.Text = "신규등록";// ".idx;
this.lbl_Midx.Tag = null;
this.lbl_Midx.BackColor = Color.Tomato;
}
else
{
this.lbl_Midx.Text = selected.idx;
this.lbl_Midx.Tag = selected.idx;
this.lbl_Midx.BackColor = Color.Lime;
}
//가져온 등급으로 변경해준다.
if (selected.Grade == "0") radA.Checked = true;
else if (selected.Grade == "1") radB.Checked = true;
else if (selected.Grade == "2") radC.Checked = true;
else if (selected.Grade == "3") radD.Checked = true;
rtEtc1.Text = selected.remark1;
rtEtc2.Text = selected.remark2;
}
}
private void btn_Empty_Click(object sender, EventArgs e)
{
TextReset();
}
/// <summary>
/// 전체 초기화
/// </summary>
/// <param name="isDelete">탭 컨트롤에서 사용할 경우 false</param>
public void TextReset(bool isDelete = true)
{
if (isDelete)
{
var isbn = $"※{DateTime.Now.ToString("yyMMddhhmmss")}";
var emptryMarc = PUB.MakeEmptyMarc(isbn, "title", "author", "publisher", "price");
var emptymarc = TextResetSub();
marcEditorControl1.LoadBookData(string.Empty, isbn, defaultMarc: emptryMarc);
this.rtEtc1.Text = string.Empty;
this.rtEtc2.Text = string.Empty;
lbl_Midx.Tag = null;
lbl_Midx.Text = "신규작성";
lbl_Midx.BackColor = Color.Tomato;
}
}
string TextResetSub()
{
// 입력일자 (00-05)
// 발행년유형 (6)
// 발행년1 (07-10)
// 발행년2 (11-14)
// 발행국 (15-17)
// 삽화표시 (18-21)
// 이용대상자수준 (22) v
// 개별자료형태 (23) v
// 내용형식1 (24) v
// 내용형식2 (25) v
// 한국대학부호 (26-27)
// 수정레코드 (28)
// 회의간행물 (29) c
// 기념논문집 (30) c
// 색인 (31)
// 목록전거 (32)
// 문학형식 (33) v
// 전기 (34) v
// 언어 (35-37) v
// 한국정부기관부호 (38-39)
string yyMMdd = DateTime.Now.ToString("yyMMdd");
string yyyy = DateTime.Now.ToString("yyyy");
string Empty_008 = yyMMdd + "s" + yyyy + " 000 kor ▲";
string Empty_text = string.Format(
$"008\t {Empty_008.Replace("", "")}" +
"020\t \t▼a▼c▲\n" +
"056\t \t▼a▼2▲\n" +
"100\t \t▼a▲\n" +
"245\t \t▼a▼d▲\n" +
"260\t \t▼b▲\n" +
"300\t \t▼a▼c▲\n" +
"653\t \t▼a▲\n" +
"700\t \t▼a▲\n" +
"950\t \t▼b▲\n");
return Empty_text;
}
/// <summary>
/// 마크DB에 UPDATE해주는 함수
/// </summary>
/// <param name="Table">테이블 이름</param>
/// <param name="MarcIndex">마크 인덱스 번호</param>
/// <param name="FullMarc">한줄짜리 마크</param>
/// <param name="grade">마크 등급</param>
/// <param name="tag056">분류기호</param>
/// <param name="v_date">저장시각 yyyy-MM-dd HH:mm:ss</param>
void UpdateMarc(string MarcIndex, string FullMarc, string grade)
{
//도서정보추출
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");
//파서를 사용해서 변경한다
var parser = new UniMarc.MarcParser();
parser.ParseFullMarc(FullMarc);
//ISBN와 가격 (처음나오는 020태그의 값을 적용)
var tag_020 = parser.GetTag<MarcField>("020").FirstOrDefault();
if (tag_020 != null)
{
v_isbn = tag_020.GetSubfieldValue('a');
v_price = tag_020.GetSubfieldValue('c');
}
//저자(100 -> 110 -> 111 순으로 적용)
var tag_100 = parser.GetTag<MarcField>("100").FirstOrDefault();
var tag_110 = parser.GetTag<MarcField>("110").FirstOrDefault();
var tag_111 = parser.GetTag<MarcField>("111").FirstOrDefault();
if (tag_111 != null)
v_author = tag_111.GetSubfieldValue('a');
else if (tag_110 != null)
v_author = tag_110.GetSubfieldValue('a');
else if (tag_100 != null)
v_author = tag_100.GetSubfieldValue('a');
//서명
var tag_245 = parser.GetTag<MarcSubfield>("245a").FirstOrDefault();
v_title = tag_245?.Value ?? string.Empty;
//출판사
var tag_300b = parser.GetTag<MarcSubfield>("300b").FirstOrDefault();
v_publisher = tag_300b?.Value ?? string.Empty;
//056a
var v_056 = parser.GetTag("056a").FirstOrDefault() ?? string.Empty;
var v_008 = parser.GetTag("008").FirstOrDefault() ?? string.Empty;
if (v_056.isEmpty() || v_008.isEmpty())
{
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 =
{
"ISBN", "서명", "저자", "출판사", "가격",
"marc", "비고1", "비고2", "grade", "marc_chk",
"user", "division", "008tag", "date", "compidx"
};
//데이터중복검사필요
//동일 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
{
lbl_Midx.Tag = rlt.value.ToString();
lbl_Midx.Text = rlt.value.ToString();
UTIL.MsgI($"저장 완료\n\nIDX:{rlt.value}");
}
}
else
{
//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("변경 완료");
}
}
private void Btn_SearchKolis_Click(object sender, EventArgs e)
{
AddMarc_FillBlank af = new AddMarc_FillBlank(this);
af.Show();
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
private void button2_Click(object sender, EventArgs e)
{
searchMarc();
}
private void btSave_Click(object sender, EventArgs e)
{
var midx = lbl_Midx.Tag?.ToString() ?? string.Empty;
if (midx.isEmpty())
{
UTIL.MsgE("저장할 마크를 불러오세요\n신규마크작성상태에서는 추가 버튼을 사용하세요");
return;
}
SaveData(true);
}
private void btn_Save_Click(object sender, EventArgs e)
{
SaveData(false);
}
void SaveData(bool isUpdate)
{
string tag008 = marcEditorControl1.text008.Text;
//입력일자를 업데이트할지 확인한다.
if (isUpdate == false)
{
var inputdate = tag008.Substring(0, 6);
if (inputdate == "000000")
inputdate = DateTime.Now.ToString("yyMMdd");
else if (inputdate != DateTime.Now.ToString("yyMMdd"))
{
if (UTIL.MsgQ($"입력일자({inputdate})를 오늘로 변경할까요?") == DialogResult.Yes)
{
tag008 = DateTime.Now.ToString("yyMMdd") + tag008.Substring(6);
marcEditorControl1.text008.Text = tag008;
}
}
}
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 parserF = new UniMarc.MarcParser();
parserF.ParseFullMarc(fullMarc);
string midx = this.lbl_Midx.Tag?.ToString() ?? string.Empty;
if (isUpdate == false) midx = string.Empty;
var v_grade = "";
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";
//midx 값이 emptry 라면 insert , 아니라면 update
UpdateMarc(midx, fullMarc, v_grade);
}
}
}