以前dp2circulation可没有给用户提供过什么“删除全部拼音子字段”的代码吧。
如果这样的代码存在,恐怕也是藏在我的那个宝贝代码箱子里,没有拿出来给过用户。
很多用户可能有过这样的经历,想先删除数据中全部已有的拼音子字段再加拼音子字段,或者说,就删除但是不加。这是一个很实在的需求。如果要手动一个一个去删除拼音子字段那该多麻烦啊。
有人可能会说:难道加拼音的功能不是自动替换了旧的拼音子字段么?
是的。但是且慢,在历史上比较旧的CNMARC数据,曾经采用200$a创建拼音子字段$A这样的方法,而dp2circulation中的这个加拼音的功能,是按照200$a创建拼音子字段$9的规则,也就是说,即便替换也是替换了$9,不会去主动删除字段中的$A等。
看看,这个“删除全部拼音子字段”的功能还是有必要存在吧?并且最好能删除以前那个规则下的全部拼音子字段。
下面我就介绍一段这样的代码。
还是要在dp2manager中打开特定书目库的dp2circulation_marc_autogen.cs脚本文件。
为了能删除旧规则下的拼音子字段,需要在MyHost类里面前部变量定义的位置,增加一段下述代码:
string OldPinyinCfgXml = "<root>"
+ "<item name='200' from='a' to='A' />"
+ "<item name='200' from='e' to='E' />"
+ "<item name='200' from='f' to='F' />"
+ "<item name='701' indicator='@[^A].' from='a' to='A' />"
+ "<item name='711' from='a' to='A' />"
+ "<item name='702' indicator='@[^A].' from='a' to='A' />"
+ "<item name='712' from='a' to='A' />"
+ "</root>";
然后,在Main()函数内增加一段代码,以创建新的功能入口:
// 删除拼音
actions.NewItem("删除拼音", "删除全部拼音子字段", "RemovePinyin", false);
然后,在MyHost类中适当位置增加一个RemovePinyin()函数的代码:
void RemovePinyin()
{
RemovePinyin(this.PinyinCfgXml);
RemovePinyin(this.OldPinyinCfgXml);
}
好,代码修改就告结束。保存它。
启动dp2circulation,在种册窗里面用Ctrl+A打开功能对话框,选择“删除拼音”功能执行。
~~~
从上面的代码我们可以看出,MyHost类的RemovePinyin()函数,实际上内部调用了两次DetailHost类里面的RemovePinyin(string strCfgXml)函数。第一次调用是为了删除新规则下的全部拼音子字段,第二次调用是为了删除老规则下的全部拼音子字段。
~~~
思考题:
1) 如果仅仅要删除新规则下的全部拼音子字段,上面的代码该如何改写呢?
2) 如果想在MyHost类的RemovePinyin()函数中只调用一次DetailHost类里面的RemovePinyin(string strCfgXml)函数,就达到删除新老规则下的全部拼音子字段的效果,上面的代码又该如何改造呢?
~~~
相信如果您完成了上述思考题,就会觉得这些代码逐渐脱离了平淡无奇,开始有些“神奇”的意思了吧。对,它是柔韧的,可以像橡皮泥一样地捏来捏去。并且,它还是不失“脚本”的特性:依然简洁。