欢迎您来到 数字平台。 您尚未登录。[登录] [注册新用户]
当前位置: 论坛首页 / 栏目 产品与服务 / 文章 67

点击:63416[回复顶层] [树状] [详细]
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 1 楼
文章id: 61
数字平台系统二次开发体验(一)——数据导入批查重方案


摘要: 通过一个批查重方案示例,体验数字平台公司系统强大的二次开发体系。

关键词: 二次开发,批查重方案


不同应用的信息系统,甚至是不同用户的相同应用都有不同的功能需求,这种差异性随着个性化或特色化系统建设发展趋势更显突出。寄望于某个系统开发商或技术人员预先穷举系统功能需求是不现实、成本也是非常高的,最合理的做法是分析应用或用户的需求,找到一个最通用的功能集合,满足应用或用户的基本或绝大部份需求。并提供一个标准的、易掌握的二次开发或系统扩展接口,随时根据应用或用户的需求变化而及时增加相应功能。这种二次开发或功能扩展是在一个系统设计初期即预留的,有别于不预先考虑系统扩展性的牵强的事后功能附着,它不会影响系统整体的稳定性,扩展成本很低,扩展效率非常高。

数字平台公司开发的系统就是基于这种思路,为系统提供了标准的二次开发接口,可以根据用户特殊的需求,随时提供系统功能拓展;用户甚至可以摆脱对系统开发商的依赖,自行拓展或由其它开发商拓展系统功能。本文将通过一个数据导入批查重方案的开发,进行一次数字平台系统的二次开发体验。

启动数字平台公司的“dp2batch—批处理”程序

下载地址:http://www.dp2003.com/dp2batch/

 

本帖所有内容见附件,跟帖中的内容同附件。

本帖批查重方案包也见附件,可直接导入到方案管理器中。



资源:

-- ID: 0 文件名: 数字平台系统的二次开发体验.zip 尺寸: 241965 最后修改时间: --
数字平台系统的二次开发体验.zip [下载] 警告:某些文件下载后,如打开(或执行),可能危害您的计算机安全,请谨慎行事。

-- ID: 1 文件名: 一边转入一边查重.projpack 尺寸: 727648 最后修改时间: --
一边转入一边查重.projpack [下载] 警告:某些文件下载后,如打开(或执行),可能危害您的计算机安全,请谨慎行事。


发表时间: 2006-04-07 16:33:23
最后修改时间: 2006-04-20 09:12:39
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 2 楼
文章id: 62
启动批处理程序,打开方案管理器



从“文件”菜单中打开“方案管理”窗:



发表时间: 2006-04-07 16:41:24
最后修改时间: 2006-04-07 16:46:46
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 3 楼
文章id: 63
新增批处理方案



在方案管理器中,可以看到已有一个“批添国拼音方案”。有一个“导入”按钮,可以直接导入开发商开发的其它方案(本文后面将演示这种导入现成方案的方式)。本文是一个二次开发体验,所以我们将点击“新增”按钮,为批处理程序添加一个新处理方案。点击“新增”按钮,打开“Script脚本代码管理”器,在这里,可以用C#语言开发方案主程序文件:

 

为方便二次开发,“Script脚本代码管理”器提供了方案常用文件格式模板。点击“改名按钮”,可以为方案命名,比如我们将方案方案名改为“一边转入一边查重”:

由于本批处理程序是通过ClickOnce自动部署,它会自动安装到系统指定目录,并由.NET调用,所以方案文件存放目录不能修改。但我们可以通过“改名”按钮,在指定目录中为本方案提供一个存贮文件目录(改名是为了便于记忆和管理,采用程序默认名称也可以):



发表时间: 2006-04-07 16:45:18
最后修改时间: 2006-04-07 16:48:13
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 4 楼
文章id: 64
编写方案主程序main.cs



    确定了方案名和方案目录后,我们就可以进入二次开发主要的一步——用C#语言开发方案主程序。双击“main.cs”或选中它并点击“编辑”按钮,可以用记事本程序编辑主程序模板:

这是一个典型的C#代码,除了用using关键词导入.Net命名空间的类外,数字平台公司也开发了很多专用类,可以很方便二次开发人员直接调用。批处理程序通过以下几个过程(可选的)实现功能:

OnInitial——批处理过程初始化阶段执行的代码。

OnBegin——批处理过程开始阶段执行的代码。

Inputing——数据导入数据库阶段执行的代码(与Outputing阶段互斥)。

Outputing——数据库中导出数据阶段执行的代码(与Inputing阶段互斥)。

OnEnd——批处理过程结束阶段的代码。

具体专用类的调用方式见相关手册,以下是“一边转入一边查重”的完整示例代码:

using System;

using System.Windows.Forms;

using System.IO;

using System.Text;

 

using DigitalPlatform.MarcDom;

using DigitalPlatform.Library;

using DigitalPlatform.Marc;

using DigitalPlatform.Statis;

 

using dp2Batch;

 

public class MyBatch : Batch

{

    DupDlg dupdlg = null;

 

    int m_nDupCount = 0;

 

    Encoding OutputEncoding = Encoding.UTF8;

 

    Stream DupOutputFile = null;

 

    public string Title = "";

 

    public override void OnInitial(object sender, BatchEventArgs e)

    {

 

 

        // MessageBox.Show(this.MainForm, "OnInitial");

    }

    public override void OnBegin(object sender, BatchEventArgs e)

    {

        MessageBox.Show(this.MainForm, "OnBegin");

 

        if (dupdlg == null)

        {

            dupdlg = new DupDlg();

 

            dupdlg.Initial(this.SearchPanel,

                this.SearchPanel.ServerUrl,

                false);

            dupdlg.ProjectName = "";

            dupdlg.Closed -= new

EventHandler(dupdlg_Closed);

            dupdlg.Closed += new

EventHandler(dupdlg_Closed);

 

            dupdlg.LoadBrowse = LoadBrowse.Dup; // 只装

载超过阈值的浏览记录

 

            dupdlg.Show();

 

            DialogResult ret = dupdlg.FindProjectName();

            if (ret != DialogResult.OK)

            {

                e.Continue = ContinueType.SkipAll;

                return;

            }

 

        }

 

 

        // 查重发现重复的MARC输出文件

        OpenMarcFileDlg dlg = new OpenMarcFileDlg();

 

        dlg.Text = "请指定经查重发现重复后输出的 ISO2709 文件";

        dlg.FileName = "output.mrc";

 

        this.ap.LinkFormState(dlg, "dupmarc_dlg_state");

        dlg.ShowDialog(this.MainForm);

        this.ap.UnlinkFormState(dlg);

 

        if (dlg.DialogResult != DialogResult.OK)

        {

            DupOutputFile = null;

        }

        else

        {

            DupOutputFile = File.Create(dlg.FileName);

        }

 

    }

    public override void Inputing(object sender, BatchEventArgs e)

    {

        string strError = "";

 

        // MessageBox.Show(this.MainForm, this.Title);

 

        if (dupdlg == null)

        {

            e.Continue = ContinueType.SkipAll;

            return;

        }

 

        try {

 

        dupdlg.Activate();

        dupdlg.ServerUrl = this.ServerUrl;

        dupdlg.RecordFullPath = this.RecFullPath;

        dupdlg.Record = this.XmlRecord;

        int nRet = dupdlg.DoSearch(out strError);

        if (nRet == -1)

        {

            MessageBox.Show(this.MainForm, strError);

            return;

        }

 

        if (dupdlg.DupPaths.Length > 0)

        {

            m_nDupCount ++;

 

            this.SkipInput = true;

 

            if (DupOutputFile != null)

            {

                // 遇到重复,向外写ISO2709文件

                byte [] baResult = null;

                nRet = MarcUtil.CvtJineiToISO2709(

                    this.MarcRecord,

                    this.MarcSyntax,

                    OutputEncoding,

                    out baResult,

                    out strError);

                if (nRet == -1)

                {

                    MessageBox.Show(this.MainForm,

strError);

                    return;

                }

                DupOutputFile.Write(baResult, 0,

baResult.Length);

            }

 

        }

           

 

        }

        catch (Exception ex)

        {

            MessageBox.Show(this.MainForm, ex.Message);

            e.Continue = ContinueType.SkipAll;

            return;

        }

 

    }

    public override void OnEnd(object sender, BatchEventArgs e)

    {

        if (DupOutputFile != null)

        {

            DupOutputFile.Close();

        }

        MessageBox.Show(this.MainForm, "OnEnd");

    }

 

    private void dupdlg_Closed(object sender, EventArgs e)

    {

        dupdlg = null;

    }

}



发表时间: 2006-04-07 16:52:04
最后修改时间: 2006-04-07 16:53:31
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 5 楼
文章id: 65
类库引用配置文件



references.xml文件中提供了程序引用的类库信息,格式和内容如下:

 



发表时间: 2006-04-07 16:56:03
最后修改时间: 2006-04-07 17:29:49
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 6 楼
文章id: 66
新增操作MARC数据程序,完成配置方案开发



本批处理方案是针对ISO2709格式的MARC数据进行处理,通过调用数字平台公司专业开发的DOM(文档对象模型),非常方便为二次开发人员提供了MARC数据的编程接口。

点击“新增”按钮,为批处理程序添加MARC数据的过滤器方案构成文件(用以选择需要处理的MARC字段):

 

并双击新添加的“marcfilter.fltx”文件,修改其内容为:

<?xml version='1.0' encoding='utf-8'?>

<filter>

<using>

<![CDATA[

using System;

using System.IO;

using System.Text;

using System.Windows.Forms;

using DigitalPlatform.MarcDom;

 

using dp2Batch;

]]>

</using>

    <record>

        <def>

        <![CDATA[

            int i;

            int j;

        ]]>

        </def>

        <begin>

        <![CDATA[

            // MessageBox.Show("record data:" + this.Data);

        ]]>

        </begin>

             <field name="200">

            <begin>

            <![CDATA[

                Batch.Title = this.Data;

            ]]>

            </begin>

             </field>

        <end>

        <![CDATA[

 

            j ++;

        ]]>

        </end>

    </record>

</filter>

这个MARC过滤配置文件是XML格式,可以在其实体中包含标准的C#代码。

再将本方案需要的三个类库拷贝到方案目录中(这种机制可有利于二次开发时,调用其它开发商的类库),“一边转入一边查重”方案就完成了:



发表时间: 2006-04-07 17:00:31
最后修改时间: 2006-04-19 11:45:14
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 7 楼
文章id: 67
运行批处理程序,体验二次开发成果



让我们运行一下程序试试:

1、启动批处理程序,在“导入”属性页中,选择拟导入的ISO2709数据文件:

 

2、通过库名映射规则选择按钮,选择拟导入的数据库及导入处理规则:

在数据库映射对话框(DbNameMapDlg)中,单击鼠标右键,新增数据库映射:

由于拟导入的ISO2709数据不具有源数据库信息,可以在源下的文本框中输入“*”号通配符;选择目标库;选择写入方式,如:

3、确定后,回到批处理导入界面,点击左下角的勾按钮,执行批处理操作:



发表时间: 2006-04-07 17:06:43
最后修改时间: 2006-04-07 17:11:19
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 8 楼
文章id: 68
选择批处理方案



4、在弹出的“指定方案名”对话框中,将会出现包括本次我们新建的方案在内的方案树目录。选择“一边导入一边查重”方案,可以在导入数据进库时,执行方案中二次开发的业务逻辑(如果仅导入导出数据,不作任何处理,可勾选对话框下部“忽略方案”选项):

 

5、由于本系统支持UNIMARCUSMARC,字符编码方案支持UNICODEGB2312EACC等,所以会弹出对话框,提示确定拟导入的ISO2709数据的MARC格式和编码方案:

6、确定后,程序执行开始阶段代码,弹出对话框(这是由于前面我们编写的主文件仅执行了开启对话框的操作,可以忽略这个阶段,也可以将方案说明提示信息写在此处):



发表时间: 2006-04-07 17:14:38
最后修改时间: 2006-04-07 17:33:44
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 9 楼
文章id: 69
选择查重方案,确定重复数据文件输出格式



7、在指定查重方案对话框中,选择相应查重方案所在服务器(参考查重配置文件手册):

 8、确定重复数据输出的ISO2709文件名和MARC数据格式及其编码方案:

 



发表时间: 2006-04-07 17:18:11
最后修改时间: 2006-04-07 17:18:54
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 10 楼
文章id: 70
导入数据时,根据批处理方案调用查重功能模块



9、确定后,程序在导入数据时,根据选择的批处理方案,调出查重模块功能,执行查重操作,并将重复的数据写入之前确定的重复数据文件中,不重的文件写入到目标库中:

 

查重模块已发现了导入数据源中,有一条数据与查重目标库中重复。查看C盘下的output.mrc内容(用记事本程序打开),这条重复数据已写入:

10、由于示例方案为了体现执行结束后的处理效果,程序最后会弹出对话框:

 



发表时间: 2006-04-07 17:22:42
最后修改时间: 2006-04-07 17:35:27
页 1 / 2 |< 1 2 > >|
 

在线用户
(无) 
当前栏目在线用户数 0, 总在线用户数 1