示例#1
0
        // 按照一定的策略,获得种次号
        // 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;
        }
示例#2
0
        /*
        // 获得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;
        }