// dp2circulation MARC 编目自动创建数据C#脚本程序 // 最后修改时间: 2009/3/4 // 修改情况: // 1) 2008/10/17 增加维护102对照表、210对照表的功能 // 2) 2008/12/18 "7*1$a <-- 200$f"增加了可以插入到711字段的能力 using System; using System.Windows.Forms; using System.IO; using System.Text; using DigitalPlatform; using DigitalPlatform.Xml; using DigitalPlatform.Marc; using DigitalPlatform.IO; using DigitalPlatform.GcatClient; using DigitalPlatform.Text; using System.Xml.XPath; using DigitalPlatform.Script; using dp2Circulation; public class MyHost : DetailHost { DigitalPlatform.GcatClient.Channel GcatChannel = null; string[] cfgFields = new string[] { "200(a-9)", "701(a-9)", "711(a-9)", "702(a-9)", "712(a-9)" }; public override void Main(object sender, GenerateDataEventArgs e) { Field curfield = this.DetailForm.MarcEditor.FocusedField; ScriptActionCollection actions = new ScriptActionCollection(); bool bActive = false; if (!(sender is EntityEditForm || sender is EntityControl)) { // 加拼音 actions.NewItem("加拼音", "给.....加拼音", "AddPinyin", false); // 规整ISBN为13 if (curfield != null && curfield.Name == "010") bActive = true; else bActive = false; actions.NewItem("规整ISBN-13", "对010$a中ISBN进行规整", "HyphenISBN_13", bActive); // 规整ISBN为10 if (curfield != null && curfield.Name == "010") bActive = true; else bActive = false; actions.NewItem("规整ISBN-10", "对010$a中ISBN进行规整", "HyphenISBN_10", bActive); // 102国家代码 地区代码 if (curfield != null && curfield.Name == "102") bActive = true; else bActive = false; actions.NewItem("102$a$b <-- 010$a", "根据010$a中ISBN出版社代码, 自动创建102字段$a国家代码$b地区代码", "Add102", bActive); // 410 <-- 225 if (curfield != null && (curfield.Name == "225" || curfield.Name == "410")) bActive = true; else bActive = false; actions.NewItem("410 <-- 225", "将225$a内容加入410 $1200 $a", "Copy225To410", bActive); // 7*1$a <-- 200$f if (curfield != null && (curfield.Name == "701" || curfield.Name == "711")) bActive = true; else bActive = false; actions.NewItem("7*1$a <-- 200$f", "将200$f内容加入701/711字段$a", "Copy200fTo7x1a", bActive); // 7*2$a <-- 200$g if (curfield != null && (curfield.Name == "702" || curfield.Name == "712")) bActive = true; else bActive = false; actions.NewItem("7*2$a <-- 200$g", "将200$g内容加入702/712字段$a", "Copy200gTo7x2a", bActive); /* // 905$d <-- 690$a if (curfield != null && (curfield.Name == "905" || curfield.Name == "690")) bActive = true; else bActive = false; actions.NewItem("905$d <-- 690$a", "将690$a内容加入905字段$d", "Copy690aTo905d", bActive); // 加入著者号 if (curfield != null && curfield.Name == "905") bActive = true; else bActive = false; actions.NewItem("加入著者号", "根据701/711/702/712$a内容, 创建905$e", "AddAuthorNumber", bActive); // 加入种次号 if (curfield != null && curfield.Name == "905" && this.DetailForm.MarcEditor.FocusedSubfieldName == 'd') bActive = true; else bActive = false; actions.NewItem("加入种次号", "根据905$d内容, 创建905$e", "AddZhongcihao", bActive); // 维护种次号 actions.NewItem("维护种次号", "根据905$d内容中的类号, 出现维护种次号的界面", "ManageZhongcihao", false); */ // 出版地 if (curfield != null && curfield.Name == "210") bActive = true; else bActive = false; actions.NewItem("210$a$c <-- 010$a", "根据010$a中ISBN出版社代码, 自动创建出版社子字段210$a$c", "AddPublisher", bActive); // 维护 102 国家代码 地区代码 bActive = false; actions.NewItem("维护102对照表", "ISBN出版社代码 和 102字段$a国家代码$b地区代码 的对照表", "Manage102", bActive); // 维护 210 出版地 出版社 bActive = false; actions.NewItem("维护210对照表", "ISBN出版社代码 和 210字段$a出版地$c出版社名 的对照表", "Manage210", bActive); actions.NewItem("905字段加四角号", "905字段加加四角号", "AddFourAngle", false); } else { // 创建索取号 bActive = false; if (sender is EntityEditForm) bActive = true; actions.NewItem("创建索取号", "为册记录创建索取号", "CreateCallNumber", bActive); // 管理索取号 bActive = false; actions.NewItem("管理索取号", "为册记录管理索取号", "ManageCallNumber", bActive); } ScriptActionMenuDlg dlg = new ScriptActionMenuDlg(); dlg.Actions = actions; if ((Control.ModifierKeys & Keys.Alt) == Keys.Alt) dlg.AutoRun = false; else dlg.AutoRun = this.DetailForm.MainForm.AppInfo.GetBoolean("detailform", "gen_auto_run", false); // dlg.StartPosition = FormStartPosition.CenterScreen; this.DetailForm.MainForm.AppInfo.LinkFormState(dlg, "gen_data_dlg_state"); dlg.ShowDialog(); this.DetailForm.MainForm.AppInfo.UnlinkFormState(dlg); this.DetailForm.MainForm.AppInfo.SetBoolean("detailform", "gen_auto_run", dlg.AutoRun); if (dlg.DialogResult == DialogResult.OK) { this.Invoke(dlg.SelectedAction.ScriptEntry, sender, e); } } void AddPinyin() { this.DetailForm.MarcEditor.Enabled = false; try { PinyinStyle style = PinyinStyle.None; // 在这里修改拼音大小写风格 for (int i = 0; i < DetailForm.MarcEditor.Record.Fields.Count; i++) { Field field = DetailForm.MarcEditor.Record.Fields[i]; string strFrom = ""; string strTo = ""; int nRet = GetPinyinCfgLine(field.Name, out strFrom, out strTo); if (nRet != 1) continue; string strHanzi = ""; string strNextSubfieldName = ""; string strField = field.Text; for (int j = 0; ; j++) { // return: // -1 error // 0 not found // 1 found nRet = MarcUtil.GetSubfield(strField, ItemType.Field, strFrom, j, out strHanzi, out strNextSubfieldName); if (nRet != 1) break; if (strHanzi.Length <= 1) break; strHanzi = strHanzi.Substring(1); string strPinyin; string strError = ""; // 把字符串中的汉字和拼音分离 // return: // -1 出错 // 0 用户希望中断 // 1 正常 nRet = this.DetailForm.HanziTextToPinyin( true, // 本地,快速 strHanzi, style, out strPinyin, out strError); if (nRet == -1) { MessageBox.Show(this.DetailForm, strError); break; } if (nRet == 0) { MessageBox.Show(this.DetailForm, "用户中断。拼音子字段内容可能不完整。"); return; } nRet = MarcUtil.ReplaceSubfield( ref strField, strTo, j, strTo + strPinyin); field.Text = strField; } } } finally { this.DetailForm.MarcEditor.Enabled = true; this.DetailForm.MarcEditor.Focus(); } } int GetPinyinCfgLine(string strFieldName, out string strFrom, out string strTo) { strFrom = ""; strTo = ""; for (int i = 0; i < cfgFields.Length; i++) { string strLine = cfgFields[i]; string strName = strLine.Substring(0, 3); if (strName == strFieldName) { string strRight = strLine.Substring(3).Trim(); if (strRight.Length == 0) return -1; if (strRight[0] == '(') strRight = strRight.Substring(1).Trim(); if (strRight.Length == 0) return -1; if (strRight[strRight.Length - 1] == ')') strRight = strRight.Substring(0, strRight.Length - 1).Trim(); if (strRight.Length == 0) return -1; int nRet = strRight.IndexOf("-"); if (nRet == -1) return -1; strFrom = strRight.Substring(0, nRet).Trim(); strTo = strRight.Substring(nRet + 1).Trim(); return 1; } } return 0; } void Copy200fTo7x1a() { Copy200gfTo7xxa("f", "701,711"); } void Copy200gTo7x2a() { Copy200gfTo7xxa("g", "702,712"); } // 取列表值的第一个 static string FirstOf(string strParts) { string[] parts = strParts.Split(new char[] { ',' }); if (parts.Length > 0) return parts[0]; return strParts; } void Copy200gfTo7xxa(string strFromSubfield, string strToFields) { Field field_200 = this.DetailForm.MarcEditor.Record.Fields.GetOneField("200", 0); SubfieldCollection subfields_200 = field_200.Subfields; Subfield subfield_f = subfields_200[strFromSubfield]; if (subfield_f == null) { MessageBox.Show(this.DetailForm, "200$" + strFromSubfield + "不存在"); return; } string strToField = FirstOf(strToFields); string strContent = subfield_f.Value; // 看看当前活动字段是不是701 Field field_701 = null; field_701 = this.DetailForm.MarcEditor.FocusedField; if (field_701 != null) { if (StringUtil.IsInList(field_701.Name, strToFields) == true) { strToField = field_701.Name; } else field_701 = null; } if (field_701 == null) { field_701 = this.DetailForm.MarcEditor.Record.Fields.GetOneField(strToField, 0); if (field_701 == null) { field_701 = this.DetailForm.MarcEditor.Record.Fields.Add(strToField, " ", "", true); } } if (field_701 == null) throw (new Exception("error ...")); Subfield subfield_701a = field_701.Subfields["a"]; if (subfield_701a == null) { subfield_701a = new Subfield(); subfield_701a.Name = "a"; } subfield_701a.Value = strContent; field_701.Subfields["a"] = subfield_701a; } void AddAuthorNumber() { string strAuthor = ""; strAuthor = this.DetailForm.MarcEditor.Record.Fields.GetFirstSubfield("701", "a"); if (strAuthor != "") goto BEGIN; strAuthor = this.DetailForm.MarcEditor.Record.Fields.GetFirstSubfield("711", "a"); if (strAuthor != "") goto BEGIN; strAuthor = this.DetailForm.MarcEditor.Record.Fields.GetFirstSubfield("702", "a"); if (strAuthor != "") goto BEGIN; strAuthor = this.DetailForm.MarcEditor.Record.Fields.GetFirstSubfield("712", "a"); if (strAuthor == "") { MessageBox.Show(this.DetailForm, "701/711/702/712中均未发现&a,无法处理"); return; } BEGIN: string strGcatWebServiceUrl = this.DetailForm.MainForm.GcatServerUrl; // "http://dp2003.com/dp2libraryws/gcat.asmx"; string strNumber = ""; string strError = ""; // 获得著者号 // return: // -1 error // 0 canceled // 1 succeed int nRet = GetGcatAuthorNumber(strGcatWebServiceUrl, strAuthor, out strNumber, out strError); if (nRet == -1) goto ERROR1; this.DetailForm.MarcEditor.Record.Fields.SetFirstSubfield("905", "e", strNumber); return; ERROR1: MessageBox.Show(this.DetailForm, strError); } void AddZhongcihao() { string strError = ""; ZhongcihaoForm dlg = new ZhongcihaoForm(); try { string strClass = ""; string strNumber = ""; int nRet = 0; strClass = this.DetailForm.MarcEditor.Record.Fields.GetFirstSubfield("905", "d"); if (strClass == "") { MessageBox.Show(this.DetailForm, "记录中不存在905$d子字段,因此无法加种次号"); return; } string strExistNumber = this.DetailForm.MarcEditor.Record.Fields.GetFirstSubfield("905", "e"); // dlg.MdiParent = this.DetailForm.MainForm; dlg.MainForm = this.DetailForm.MainForm; dlg.TopMost = true; dlg.MyselfBiblioRecPath = this.DetailForm.BiblioRecPath; // dlg.ClassNumber = strClass; // dlg.BiblioDbName = this.DetailForm.BiblioDbName; dlg.Show(); // return: // -1 error // 0 canceled // 1 succeed nRet = dlg.GetNumber( ZhongcihaoStyle.Seed, strClass, this.DetailForm.BiblioDbName, out strNumber, out strError); if (nRet == -1) goto ERROR1; this.DetailForm.MarcEditor.Record.Fields.SetFirstSubfield("905", "e", strNumber); return; } catch (Exception ex) { strError = ex.Message; goto ERROR1; } finally { dlg.Close(); } ERROR1: MessageBox.Show(this.DetailForm, strError); } // 维护种次号 void ManageZhongcihao() { string strError = ""; ZhongcihaoForm dlg = new ZhongcihaoForm(); string strClass = ""; int nRet = 0; strClass = this.DetailForm.MarcEditor.Record.Fields.GetFirstSubfield("905", "d"); dlg.MdiParent = this.DetailForm.MainForm; dlg.MainForm = this.DetailForm.MainForm; dlg.TopMost = true; dlg.AutoBeginSearch = true; dlg.ClassNumber = strClass; dlg.BiblioDbName = this.DetailForm.BiblioDbName; dlg.Show(); } // 加入出版地、出版者 void AddPublisher() { string strError = ""; string strISBN = ""; int nRet = 0; strISBN = this.DetailForm.MarcEditor.Record.Fields.GetFirstSubfield("010", "a"); if (strISBN.Trim() == "") { strError = "记录中不存在010$a子字段,因此无法加出版社子字段"; goto ERROR1; } // 切割出 出版社 代码部分 string strPublisherNumber = ""; nRet = this.DetailForm.MainForm.GetPublisherNumber(strISBN, out strPublisherNumber, out strError); if (nRet == -1) { goto ERROR1; } string strValue = ""; nRet = this.DetailForm.GetPublisherInfo(strPublisherNumber, out strValue, out strError); if (nRet == -1) goto ERROR1; if (nRet == 0 || strValue == "") { // 创建新条目 strValue = InputDlg.GetInput( this.DetailForm, null, "请输入ISBN出版社号 '" + strPublisherNumber + "' 对应的出版社名称(格式 出版地:出版社名):", "出版地:出版社名"); if (strValue == null) return; // 放弃整个操作 nRet = this.DetailForm.SetPublisherInfo(strPublisherNumber, strValue, out strError); if (nRet == -1) goto ERROR1; } // MessageBox.Show(this.DetailForm, strValue); // 把全角冒号替换为半角的形态 strValue = strValue.Replace(":", ":"); string strName = ""; string strCity = ""; nRet = strValue.IndexOf(":"); if (nRet == -1) { strName = strValue; } else { strCity = strValue.Substring(0, nRet); strName = strValue.Substring(nRet + 1); } this.DetailForm.MarcEditor.Record.Fields.SetFirstSubfield("210", "a", strCity); this.DetailForm.MarcEditor.Record.Fields.SetFirstSubfield("210", "c", strName); return; ERROR1: MessageBox.Show(this.DetailForm, strError); } // 维护210对照关系 // 2008/10/17 new add void Manage210() { string strError = ""; string strISBN = ""; int nRet = 0; strISBN = this.DetailForm.MarcEditor.Record.Fields.GetFirstSubfield("010", "a").Trim(); string strPublisherNumber = ""; if (String.IsNullOrEmpty(strISBN) == false) { // 切割出 出版社 代码部分 nRet = this.DetailForm.MainForm.GetPublisherNumber(strISBN, out strPublisherNumber, out strError); if (nRet == -1) { goto ERROR1; } } if (String.IsNullOrEmpty(strPublisherNumber) == true) strPublisherNumber = "978-7-?"; strPublisherNumber = InputDlg.GetInput( this.DetailForm, "维护210对照表 -- 第1步", "请输入ISBN中出版社号码部分:", strPublisherNumber); if (strPublisherNumber == null) return; // 放弃整个操作 string strValue = ""; nRet = this.DetailForm.GetPublisherInfo(strPublisherNumber, out strValue, out strError); if (nRet == -1) goto ERROR1; if (nRet == 0 || strValue == "") { strValue = "出版地:出版社名"; } // 创建新条目 strValue = InputDlg.GetInput( this.DetailForm, "维护210对照表 -- 第2步", "请输入ISBN出版社号码 '" + strPublisherNumber + "' 对应的UNIMARC 210$a$c参数(格式 出版地:出版社名):", strValue); if (strValue == null) return; // 放弃整个操作 if (strValue == "") goto DOSAVE; // MessageBox.Show(this.DetailForm, strValue); // 把全角冒号替换为半角的形态 strValue = strValue.Replace(":", ":"); string strName = ""; string strCity = ""; nRet = strValue.IndexOf(":"); if (nRet == -1) { strError = "输入的内容中缺少冒号"; goto ERROR1; // strName = strValue; } else { strCity = strValue.Substring(0, nRet); strName = strValue.Substring(nRet + 1); } strValue = strCity + ":" + strName; DOSAVE: nRet = this.DetailForm.SetPublisherInfo(strPublisherNumber, strValue, out strError); if (nRet == -1) goto ERROR1; return; ERROR1: MessageBox.Show(this.DetailForm, strError); } void HyphenISBN_13() { HyphenISBN(true); } void HyphenISBN_10() { HyphenISBN(false); } void HyphenISBN(bool bForce13) { string strError = ""; string strISBN = ""; int nRet = 0; strISBN = this.DetailForm.MarcEditor.Record.Fields.GetFirstSubfield("010", "a"); if (strISBN.Trim() == "") { MessageBox.Show(this.DetailForm, "记录中不存在010$a子字段,因此无法进行规整"); return; } nRet = this.DetailForm.MainForm.LoadIsbnSplitter(true, out strError); if (nRet == -1) goto ERROR1; string strResult = ""; nRet = this.DetailForm.MainForm.IsbnSplitter.IsbnInsertHyphen(strISBN, bForce13 == true ? "force13,strict" : "force10,strict", out strResult, out strError); if (nRet == -1) goto ERROR1; if (nRet == 1) { DialogResult result = MessageBox.Show(this.DetailForm, "原ISBN '" + strISBN + "'加工成 '" + strResult + "' 后发现校验位有变化。\r\n\r\n是否接受修改?", "规整ISBN", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); if (result != DialogResult.Yes) return; } this.DetailForm.MarcEditor.Record.Fields.SetFirstSubfield("010", "a", strResult); return; ERROR1: MessageBox.Show(this.DetailForm, strError); } void Add102() { string strError = ""; string strISBN = ""; int nRet = 0; strISBN = this.DetailForm.MarcEditor.Record.Fields.GetFirstSubfield("010", "a"); if (strISBN.Trim() == "") { strError = "记录中不存在010$a子字段,因此无法加102$a$b"; goto ERROR1; } // 切割出 出版社 代码部分 string strPublisherNumber = ""; nRet = this.DetailForm.MainForm.GetPublisherNumber(strISBN, out strPublisherNumber, out strError); if (nRet == -1) { goto ERROR1; } string strValue = ""; nRet = this.DetailForm.Get102Info(strPublisherNumber, out strValue, out strError); if (nRet == -1) goto ERROR1; if (nRet == 0 || strValue == "") { // 创建新条目 strValue = InputDlg.GetInput( this.DetailForm, null, "请输入ISBN出版社号码 '" + strISBN + "' 对应的UNIMARC 102$a$b参数(格式 国家代码[2位]:城市代码[6位]):", "国家代码[2位]:城市代码[6位]"); if (strValue == null) return; // 放弃整个操作 nRet = this.DetailForm.Set102Info(strPublisherNumber, strValue, out strError); if (nRet == -1) goto ERROR1; } // MessageBox.Show(this.DetailForm, strValue); // 把全角冒号替换为半角的形态 strValue = strValue.Replace(":", ":"); string strCountryCode = ""; string strCityCode = ""; nRet = strValue.IndexOf(":"); if (nRet == -1) { strCountryCode = strValue; if (strCountryCode.Length != 2) { strError = "国家代码 '" + strCountryCode + "' 应当为2字符"; goto ERROR1; } } else { strCountryCode = strValue.Substring(0, nRet); strCityCode = strValue.Substring(nRet + 1); if (strCountryCode.Length != 2) { strError = "冒号前面的国家代码部分 '" + strCountryCode + "' 应当为2字符"; goto ERROR1; } if (strCityCode.Length != 6) { strError = "冒号后面的城市代码部分 '" + strCityCode + "' 应当为6字符"; goto ERROR1; } } this.DetailForm.MarcEditor.Record.Fields.SetFirstSubfield("102", "a", strCountryCode); this.DetailForm.MarcEditor.Record.Fields.SetFirstSubfield("102", "b", strCityCode); return; ERROR1: MessageBox.Show(this.DetailForm, strError); } // 维护102对照关系 void Manage102() { string strError = ""; string strISBN = ""; int nRet = 0; strISBN = this.DetailForm.MarcEditor.Record.Fields.GetFirstSubfield("010", "a").Trim(); string strPublisherNumber = ""; if (String.IsNullOrEmpty(strISBN) == false) { // 切割出 出版社 代码部分 nRet = this.DetailForm.MainForm.GetPublisherNumber(strISBN, out strPublisherNumber, out strError); if (nRet == -1) { goto ERROR1; } } if (String.IsNullOrEmpty(strPublisherNumber) == true) strPublisherNumber = "978-7-?"; strPublisherNumber = InputDlg.GetInput( this.DetailForm, "维护102对照表 -- 第1步", "请输入ISBN中出版社号码部分:", strPublisherNumber); if (strPublisherNumber == null) return; // 放弃整个操作 string strValue = ""; nRet = this.DetailForm.Get102Info(strPublisherNumber, out strValue, out strError); if (nRet == -1) goto ERROR1; if (nRet == 0 || strValue == "") { strValue = "国家代码[2位]:城市代码[6位]"; } // 创建新条目 strValue = InputDlg.GetInput( this.DetailForm, "维护102对照表 -- 第2步", "请输入ISBN出版社号码 '" + strPublisherNumber + "' 对应的UNIMARC 102$a$b参数(格式国家代码[2位]:城市代码[6位]):", strValue); if (strValue == null) return; // 放弃整个操作 if (strValue == "") goto DOSAVE; // MessageBox.Show(this.DetailForm, strValue); // 把全角冒号替换为半角的形态 strValue = strValue.Replace(":", ":"); string strCountryCode = ""; string strCityCode = ""; nRet = strValue.IndexOf(":"); if (nRet == -1) { strCountryCode = strValue; if (strCountryCode.Length != 2) { strError = "国家代码 '" + strCountryCode + "' 应当为2字符"; goto ERROR1; } } else { strCountryCode = strValue.Substring(0, nRet); strCityCode = strValue.Substring(nRet + 1); if (strCountryCode.Length != 2) { strError = "冒号前面的国家代码部分 '" + strCountryCode + "' 应当为2字符"; goto ERROR1; } if (strCityCode.Length != 6) { strError = "冒号后面的城市代码部分 '" + strCityCode + "' 应当为6字符"; goto ERROR1; } } strValue = strCountryCode + ":" + strCityCode; DOSAVE: nRet = this.DetailForm.Set102Info(strPublisherNumber, strValue, out strError); if (nRet == -1) goto ERROR1; return; ERROR1: MessageBox.Show(this.DetailForm, strError); } void Copy225To410() { Field field_225 = this.DetailForm.MarcEditor.Record.Fields.GetOneField("225", 0); if (field_225 == null) { MessageBox.Show(this.DetailForm, "225字段不存在"); return; } SubfieldCollection subfields_225 = field_225.Subfields; Subfield subfield_a = subfields_225["a"]; if (subfield_a == null) { MessageBox.Show(this.DetailForm, "225$" + "a" + "不存在"); return; } string strContent = subfield_a.Value; // 看看当前活动字段是不是410 Field field_410 = null; field_410 = this.DetailForm.MarcEditor.FocusedField; if (field_410 != null) { if (field_410.Name != "410") field_410 = null; } bool bInitial410Value = false; // 410字段的值是否初始化过 if (field_410 == null) { field_410 = this.DetailForm.MarcEditor.Record.Fields.GetOneField("410", 0); if (field_410 == null) { field_410 = this.DetailForm.MarcEditor.Record.Fields.Add("410", " ", new string((char)31, 1) + "1200 " + new string((char)31, 1) + "a", true); bInitial410Value = true; } } if (bInitial410Value == false) { field_410.Value = new string((char)31, 1) + "1200 " + new string((char)31, 1) + "a" + field_410.Value; } if (field_410 == null) throw (new Exception("error ...")); Subfield subfield_410a = field_410.Subfields["a"]; if (subfield_410a == null) { subfield_410a = new Subfield(); subfield_410a.Name = "a"; } subfield_410a.Value = strContent; field_410.Subfields["a"] = subfield_410a; } void Copy690aTo905d() { Copy690aTo905d("a", "905"); } void Copy690aTo905d(string strFromSubfield, string strToField) { Field field_690 = this.DetailForm.MarcEditor.Record.Fields.GetOneField("690", 0); SubfieldCollection subfields_690 = field_690.Subfields; Subfield subfield_a = subfields_690[strFromSubfield]; if (subfield_a == null) { MessageBox.Show(this.DetailForm, "690$" + strFromSubfield + "不存在"); return; } string strContent = subfield_a.Value; // 看看当前活动字段是不是905 Field field_905 = null; field_905 = this.DetailForm.MarcEditor.FocusedField; if (field_905 != null) { if (field_905.Name != strToField) field_905 = null; } if (field_905 == null) { field_905 = this.DetailForm.MarcEditor.Record.Fields.GetOneField(strToField, 0); if (field_905 == null) { field_905 = this.DetailForm.MarcEditor.Record.Fields.Add(strToField, " ", "", true); } } if (field_905 == null) throw (new Exception("error ...")); Subfield subfield_905d = field_905.Subfields["d"]; if (subfield_905d == null) { subfield_905d = new Subfield(); subfield_905d.Name = "d"; } subfield_905d.Value = strContent; field_905.Subfields["d"] = subfield_905d; } public override void CreateCallNumber(object sender, GenerateDataEventArgs e) { base.CreateCallNumber(sender, e); } void AddFourAngle() { string sijiaohao = ""; string author = ""; string author1 = ""; string author2 = ""; author1 = this.DetailForm.MarcEditor.Record.Fields.GetFirstSubfield("701", "a"); author2 = this.DetailForm.MarcEditor.Record.Fields.GetFirstSubfield("711", "a"); getSiJiaoHao getsjh = new getSiJiaoHao(); if (author1 != "") { author = author1; if (author.Length == 1) { getsjh.authorchar = author[0]; getsjh.QuHao(); sijiaohao = getsjh.hao; //1个字,取号规则:1234 } if (author.Length == 2) { for (int i = 0; i <= 1; i++) { getsjh.authorchar = author[i]; getsjh.QuHao(); if (i == 0) sijiaohao = getsjh.hao.Substring(0, 1) + getsjh.hao.Substring(3, 1); //两个字,取号规则:1414 if (i == 1) sijiaohao += getsjh.hao.Substring(0, 1) + getsjh.hao.Substring(3, 1); } } if (author.Length >= 3) { author = author.Substring(0, 3); for (int i = 0; i <= 2; i++) { getsjh.authorchar = author[i]; getsjh.QuHao(); if (i == 0) sijiaohao = getsjh.hao.Substring(0, 1) + getsjh.hao.Substring(3, 1); //大于等于3个字,只取前3个字,取号规则:1411 if (i == 1) sijiaohao += getsjh.hao.Substring(0, 1); if (i == 2) sijiaohao += getsjh.hao.Substring(0, 1); } } } else if (author2 != "") { if (author2.Length < 4) { MessageBox.Show(this.DetailForm, "团体责任者这么短,取号规则研究中..."); return; } else { author = author2.Substring(0, 3); for (int i = 0; i <= 3; i++) { getsjh.authorchar = author[i]; getsjh.QuHao(); if (i == 0) sijiaohao = getsjh.hao.Substring(0, 1); //团体只取前四个字,取号规则:1111 if (i == 1) sijiaohao += getsjh.hao.Substring(0, 1); if (i == 2) sijiaohao += getsjh.hao.Substring(0, 1); if (i == 3) sijiaohao += getsjh.hao.Substring(0, 1); } } } else { MessageBox.Show(this.DetailForm, "701/711中均未发现$a,无法处理"); return; } this.DetailForm.MarcEditor.Record.Fields.SetFirstSubfield("905", "e", sijiaohao); } class getSiJiaoHao { public string hao; public char authorchar; public void QuHao() { XPathDocument doc = new XPathDocument("f:\\temp\\sijiaohao.xml"); XPathNavigator nav = ((IXPathNavigable)doc).CreateNavigator(); XPathNodeIterator iter = nav.Select("/Collection/Character[@char='" + authorchar + "']"); while (iter.MoveNext()) { hao = iter.Current.Value; } } } }