// 按照一定的策略,获得种次号 // return: // -1 error // 0 canceled // 1 succeed public int GetNumber( ZhongcihaoStyle style, string strClass, string strBiblioDbName, out string strNumber, out string strError) { strNumber = ""; strError = ""; int nRet = 0; this.ClassNumber = strClass; this.BiblioDbName = strBiblioDbName; // 仅利用书目统计最大号 if (style == ZhongcihaoStyle.Biblio) { // 得到当前书目中统计出来的最大号的加1以后的号 // return: // -1 error // 1 succeed nRet = GetMaxNumberPlusOne(out strNumber, out strError); if (nRet == -1) goto ERROR1; return 1; } // 每次都利用书目统计最大号来检验、校正尾号 if (style == ZhongcihaoStyle.BiblioAndSeed || style == ZhongcihaoStyle.SeedAndBiblio) { string strTailNumber = this.TailNumber; // 如果本类尚未创建种次号条目 if (String.IsNullOrEmpty(strTailNumber) == true) { // 毕竟初始值还是利用了统计结果 string strTestNumber = ""; // 得到当前书目中统计出来的最大号的加1以后的号 // return: // -1 error // 0 not found // 1 succeed nRet = GetMaxNumberPlusOne(out strTestNumber, out strError); if (nRet == -1) goto ERROR1; if (nRet == 0) strTestNumber = "1"; // 此类从来没有过记录,当前是第一条 strNumber = InputDlg.GetInput( this, null, "请输入类 '" + strClass + "' 的当前种次号最大号:", strTestNumber); if (strNumber == null) return 0; // 放弃整个操作 // dlg.TailNumber = strNumber; nRet = PushTailNumber(strNumber, out strNumber, out strError); if (nRet == -1) goto ERROR1; return 1; } else // 本类已经有种次号条目 { // 检查和统计值的关系 string strTestNumber = ""; // 得到当前书目中统计出来的最大号的加1以后的号 // return: // -1 error // 0 not found // 1 succeed nRet = GetMaxNumberPlusOne(out strTestNumber, out strError); if (nRet == -1) goto ERROR1; if (nRet == 0) { // 依靠现有尾号增量即可 nRet = this.IncreaseTailNumber("1", out strNumber, out strError); if (nRet == -1) goto ERROR1; return 1; } // 用统计出来的号推动当前尾号,就起到了检验的作用 nRet = PushTailNumber(strTestNumber, out strNumber, out strError); if (nRet == -1) goto ERROR1; // 如果到这里就返回,效果为保守型增量,即如果当前记录反复取号而不保存,则尾号不盲目增量。当然缺点也是很明显的 -- 有可能多个窗口取出重号来 if (style == ZhongcihaoStyle.BiblioAndSeed) return 1; if (strTailNumber != strNumber) // 如果实际发生了推动,就要这个号,不必增量了 return 1; // 依靠现有尾号增量 nRet = this.IncreaseTailNumber("1", out strNumber, out strError); if (nRet == -1) goto ERROR1; return 1; } // return 1; } // 仅利用(种次号库)尾号 if (style == ZhongcihaoStyle.Seed) { string strTailNumber = this.TailNumber; // 如果本类尚未创建种次号条目 if (String.IsNullOrEmpty(strTailNumber) == true) { // 毕竟初始值还是利用了统计结果 string strTestNumber = ""; // 得到当前书目中统计出来的最大号的加1以后的号 // return: // -1 error // 0 not found // 1 succeed nRet = GetMaxNumberPlusOne(out strTestNumber, out strError); if (nRet == -1) goto ERROR1; if (nRet == 0) strTestNumber = "1"; // 此类从来没有过记录,当前是第一条 strNumber = InputDlg.GetInput( this, null, "请输入类 '" + strClass + "' 的当前种次号最大号:", strTestNumber); if (strNumber == null) return 0; // 放弃整个操作 // dlg.TailNumber = strNumber; nRet = PushTailNumber(strNumber, out strNumber, out strError); if (nRet == -1) goto ERROR1; return 1; } else // 本类已经有种次号项目,增量即可 { nRet = this.IncreaseTailNumber("1", out strNumber, out strError); if (nRet == -1) goto ERROR1; } return 1; } return 1; ERROR1: return -1; }
/* // 获得MyselfItemRecPath这条记录的CallNumber的区分号部分。如果不存在,则获得同一书目记录下属的第一个CallNumber区分号部分 string GetMyselfOrSiblingQufenNumber(ListView list) { string strSiblingNumber = ""; for (int i = 0; i < list.Items.Count; i++) { ListViewItem item = list.Items[i]; string strRecPath = item.Text; string strBiblioRecPath = ListViewUtil.GetItemText(item, COLUMN_BIBLIORECPATH); if (strRecPath == this.MyselfItemRecPath) { string strNumber = ListViewUtil.GetItemText(item, COLUMN_CALLNUMBER); strNumber = GetZhongcihaoPart(strNumber); if (String.IsNullOrEmpty(strNumber) == false) return strNumber; continue; } if (strBiblioRecPath == this.MyselfParentRecPath && String.IsNullOrEmpty(strSiblingNumber) == true) { strSiblingNumber = ListViewUtil.GetItemText(item, COLUMN_CALLNUMBER); strSiblingNumber = GetZhongcihaoPart(strSiblingNumber); } } if (String.IsNullOrEmpty(strSiblingNumber) == false) return strSiblingNumber; return null; // 没有找到 } * */ // (外部调用接口) // 按照一定的策略,获得种次号 // TODO: 可以返回一定的提示信息,表明是否从自身获得,还是从其它记录的最大号推算出来 // return: // -1 error // 0 canceled // 1 succeed /// <summary> /// 按照一定的策略,获得种次号 /// </summary> /// <param name="style">种次号取号的风格</param> /// <param name="strClass">类号</param> /// <param name="strLocationString">馆藏地点</param> /// <param name="strNumber">返回种次号</param> /// <param name="strError">返回出错信息</param> /// <returns>-1: 出错; 0: 放弃; 1: 成功</returns> public int GetZhongcihao( ZhongcihaoStyle style, string strClass, string strLocationString, out string strNumber, out string strError) { strNumber = ""; strError = ""; int nRet = 0; this.ClassNumber = strClass; this.LocationString = strLocationString; // 仅利用书目统计最大号 if (style == ZhongcihaoStyle.Biblio) { string strOtherMaxNumber = ""; string strMyselfNumber = ""; string strSiblingNumber = ""; // 获得若干号 nRet = GetMultiNumber( "fast", out strOtherMaxNumber, out strMyselfNumber, out strSiblingNumber, out strError); if (nRet == -1) goto ERROR1; if (String.IsNullOrEmpty(strMyselfNumber) == false) { strNumber = strMyselfNumber; return 1; } if (String.IsNullOrEmpty(strSiblingNumber) == false) { strNumber = strSiblingNumber; return 1; } if (String.IsNullOrEmpty(strOtherMaxNumber) == false) { nRet = StringUtil.IncreaseLeadNumber(strOtherMaxNumber, 1, out strNumber, out strError); if (nRet == -1) { strError = "为数字 '" + strOtherMaxNumber + "' 增量时发生错误: " + strError; goto ERROR1; } return 1; } // 2009/2/25 Debug.Assert(nRet == 0, ""); string strDefaultValue = ""; // "1" REDO_INPUT: // 此类从来没有过记录,当前是第一条 strNumber = InputDlg.GetInput( this, null, "请输入类 '" + strClass + "' 的当前种次号最大号:", strDefaultValue, this.MainForm.DefaultFont); if (strNumber == null) return 0; // 放弃整个操作 if (String.IsNullOrEmpty(strNumber) == true) goto REDO_INPUT; return 1; } /* // 仅利用书目统计最大号 if (style == ZhongcihaoStyle.Biblio) { // 得到当前书目中统计出来的最大号的加1以后的号 // return: // -1 error // 1 succeed nRet = GetMaxNumberPlusOne(out strNumber, out strError); if (nRet == -1) goto ERROR1; if (nRet == 1) return 1; // 2009/2/25 Debug.Assert(nRet == 0, ""); // 此类从来没有过记录,当前是第一条 strNumber = InputDlg.GetInput( this, null, "请输入类 '" + strClass + "' 的当前种次号最大号:", "1"); if (strNumber == null) return 0; // 放弃整个操作 return 1; } */ // 每次都利用书目统计最大号来检验、校正尾号 if (style == ZhongcihaoStyle.BiblioAndSeed || style == ZhongcihaoStyle.SeedAndBiblio) { // TODO: 如果当前记录在内存中存在,就应优先用它。这样可以避免无谓的增量 if (style == ZhongcihaoStyle.BiblioAndSeed) { /* // TODO: 如何避免重复filllist nRet = FillList(true, out strError); if (nRet == -1) goto ERROR1; strNumber = GetMyselfOrSiblingQufenNumber(this.listView_number); if (String.IsNullOrEmpty(strNumber) == false) { return 1; } * */ string strOtherMaxNumber = ""; string strMyselfNumber = ""; string strSiblingNumber = ""; // 获得若干号 nRet = GetMultiNumber( "fast", out strOtherMaxNumber, out strMyselfNumber, out strSiblingNumber, out strError); if (nRet == -1) goto ERROR1; if (String.IsNullOrEmpty(strMyselfNumber) == false) { strNumber = strMyselfNumber; return 1; } if (String.IsNullOrEmpty(strSiblingNumber) == false) { strNumber = strSiblingNumber; return 1; } } string strTailNumber = this.TailNumber; // 如果本类尚未创建种次号条目 if (String.IsNullOrEmpty(strTailNumber) == true) { // 毕竟初始值还是利用了统计结果 string strTestNumber = ""; // 得到当前书目中统计出来的最大号的加1以后的号 // return: // -1 error // 0 not found // 1 succeed nRet = GetMaxNumberPlusOne(out strTestNumber, out strError); if (nRet == -1) goto ERROR1; if (nRet == 0) strTestNumber = ""; // "1" REDO_INPUT: // 此类从来没有过记录,当前是第一条 strNumber = InputDlg.GetInput( this, null, "请输入类 '" + strClass + "' 的当前种次号最大号:", strTestNumber, this.MainForm.DefaultFont); if (strNumber == null) return 0; // 放弃整个操作 if (String.IsNullOrEmpty(strNumber) == true) goto REDO_INPUT; // dlg.TailNumber = strNumber; nRet = PushTailNumber(strNumber, out strNumber, out strError); if (nRet == -1) goto ERROR1; return 1; } else // 本类已经有种次号条目 { // 检查和统计值的关系 string strTestNumber = ""; // 得到当前书目中统计出来的最大号的加1以后的号 // return: // -1 error // 0 not found // 1 succeed nRet = GetMaxNumberPlusOne(out strTestNumber, out strError); if (nRet == -1) goto ERROR1; if (nRet == 0) { // 依靠现有尾号增量即可 nRet = this.IncreaseTailNumber("1", out strNumber, out strError); if (nRet == -1) goto ERROR1; return 1; } // 用统计出来的号推动当前尾号,就起到了检验的作用 nRet = PushTailNumber(strTestNumber, out strNumber, out strError); if (nRet == -1) goto ERROR1; // 如果到这里就返回,效果为保守型增量,即如果当前记录反复取号而不保存,则尾号不盲目增量。当然缺点也是很明显的 -- 有可能多个窗口取出重号来 if (style == ZhongcihaoStyle.BiblioAndSeed) return 1; if (strTailNumber != strNumber) // 如果实际发生了推动,就要这个号,不必增量了 return 1; // 依靠现有尾号增量 nRet = this.IncreaseTailNumber("1", out strNumber, out strError); if (nRet == -1) goto ERROR1; return 1; } // return 1; } // 仅利用(种次号库)尾号 if (style == ZhongcihaoStyle.Seed) { string strTailNumber = ""; try { strTailNumber = this.TailNumber; } catch (Exception ex) { strError = ex.Message; goto ERROR1; } // 如果本类尚未创建种次号条目 if (String.IsNullOrEmpty(strTailNumber) == true) { // 毕竟初始值还是利用了统计结果 string strTestNumber = ""; // 得到当前书目中统计出来的最大号的加1以后的号 // return: // -1 error // 0 not found // 1 succeed nRet = GetMaxNumberPlusOne(out strTestNumber, out strError); if (nRet == -1) goto ERROR1; if (nRet == 0) strTestNumber = ""; // "1" REDO_INPUT: // 此类从来没有过记录,当前是第一条 strNumber = InputDlg.GetInput( this, null, "请输入类 '" + strClass + "' 的当前种次号最大号:", strTestNumber, this.MainForm.DefaultFont); if (strNumber == null) return 0; // 放弃整个操作 if (String.IsNullOrEmpty(strNumber) == true) goto REDO_INPUT; // dlg.TailNumber = strNumber; nRet = PushTailNumber(strNumber, out strNumber, out strError); if (nRet == -1) goto ERROR1; return 1; } else // 本类已经有种次号项目,增量即可 { nRet = this.IncreaseTailNumber("1", out strNumber, out strError); if (nRet == -1) goto ERROR1; } return 1; } return 1; ERROR1: return -1; }