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

点击:65050[回复顶层] [树状] [详细]
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 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 > >|
 

在线用户
访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客 (我自己)   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客
当前栏目在线用户数 35, 总在线用户数 37