打印开发框架
概述
- U9打印分类
- 列表打印
- 查询打印
- 简单单据打印
- 单据打印
- U9输出UI风格
- U9打印UI风格
- 台头示例代码
有两种风格,一种是列表和查询的打印风格,一种是单据的打印风格。
技术框架
开发流程
列表和查询
开发流程
步骤一:列表和查询的UIModel创建时设置输出和打印动作组参数
输出
OnOutPut_Extend()
注意:需要增加如下设置:
代码模版:./UITpls/UICommonAction.tpl
模版参数:OnOutPut
打印
OnPrint_Extend()
注意:需要增加如下设置:
代码模版:./UITpls/UICommonAction.tpl
模版参数:OnPrint
列表和查询自动生成导出与打印代码如下:
private void OnOutPut_Extend(object sender, UIActionEventArgs e)
{
//调用模版定义的默认实现方法.如需扩展,请直接在此编程.
this.OnOutPut_DefaultImpl(sender,e) ;
}
private void OnPrint_Extend(object sender, UIActionEventArgs e)
{
//调用模版定义的默认实现方法.如需扩展,请直接在此编程.
this.OnPrint_DefaultImpl(sender,e) ;
}
步骤二、根据实际情况开发人员写自己扩展打印代码
对于正常的一般的列表,步骤二是不需要的
对于根据DTO方式创建的查询,数据需要准备
private void OnOutPut_Extend(object sender, UIActionEventArgs e)
{
//调用模版定义的默认实现方法.如需扩展,请直接在此编程.
IExportSettings settings = ExportServiceFactory.GetInstance().CreateExportSettingsObject();
settings.PrintData =QryBPExportService.GetInstance(….). GetResultSet();
e.Tag = settings;
this.OnOutPut_DefaultImpl(sender, e);
}
private void OnPrint_Extendobject sender, UIActionEventArgs e)
{
//调用模版定义的默认实现方法.如需扩展,请直接在此编程.
IExportSettings settings = ExportServiceFactory.GetInstance().CreateExportSettingsObject();
settings.PrintData = QryBPExportService.GetInstance(….). GetResultSet();
e.Tag = settings;
this. OnPrint_DefaultImpl(sender, e);
}
列表打印用户扩展代码示例
如果有如下需求, 需要加扩展代码。
- 标题布局设置示例代码
- 用户标题示例代码
- 隐藏用户标题
- 传递默认DataGrid名称
- 传递打印数据
- 含自定义列的DataGrid输出与打印
- 当前DataGrid数据打印(当前页)
台头示例代码
用途:简单单据单据打印,仅需增加布局没有苛刻要求的台头。
如在打印动作中增加台头支持,开发人员可在OnPrint_Extend函数中增加代码,如
private void OnPrint_Extend(object sender, UIActionEventArgs e)
{
IExportSettings settings = ExportServiceFactory.GetInstance().CreateExportSettingsObject();
//列表台头
settings.HeadLineList.AddHeadLine("用户:", "mwh");
settings.HeadLineList.AddHeadLine("部门:", "UBF平台技术部");
settings.HeadLineList.AddHeadLine("公司:", "用友软件公司");
e.Tag = settings;
//调用模版定义的默认实现方法.如需扩展,请直接在此编程.
this.OnPrint_DefaultImpl(sender,e) ;
}
增加的代码必须在默认实现方法之前设置。IExportSettings中的HeadLineList设置台头值对。HeadLineList为IHeadLineList对象
关键属性:
HeadColumns:一行中栏目个数,默认3行,开发人员可进行设置
InterWidth:台头栏目间距,0.1mm单位,默认50,即5mm,开发人员可进行设置
关键方法:
AddHeadLine(string headLabel,string headValue);设置台头标签及data
用户标题示例代码
列表导出与打印的模板是自动生成的,目前默认自动生成模板对于标题布局的规范是居中。如果某列表的标题必须定义其他布局方式,如居左,开发人员在打印或输出扩展可如下增加代码:
IExportSettings settings = ExportServiceFactory.GetInstance().CreateExportSettingsObject();
settings.TileAlignment= TileAlignment.Left;
e.Tag = settings;
其他见台头示例代码
事后处理事件
对于列表/查询/单据的输出与打印,若需事后处理程序,如需要根据成败进行必要的次数统计时,如统计打印份数,可如下处理:
在打印和导出扩展事件里的默认生成代码之前增加:
IExportSettings settings = ExportServiceFactory.GetInstance().CreateExportSettingsObject();
settings. new FinishCallBackHandle(this.OnExportFinished);
…. //其他用户代码
e.Tag = settings;
增加事后处理函数
this.OnOutPut_DefaultImpl(sender,e) ;
privatevoid OnExportFinished(object sender, FinishCallEventArgs args)
{
if (args.ExportStatus == ExportStatus.Sucess)
{
//增加用户代码
}
}
标题布局设置示例代码
列表导出与打印的模板是自动生成的,目前默认自动生成模板对于标题布局的规范是居中。如果某列表的标题必须定义其他布局方式,如居左,开发人员在打印或输出扩展可如下增加代码:
IExportSettings settings = ExportServiceFactory.GetInstance().CreateExportSettingsObject();
settings.TileAlignment= TileAlignment.Left;
e.Tag = settings;
其他见台头示例代码
含自定义列的DataGrid输出与打印
默认列表打印与输出数据输出为当前列表内容的全部数据内容,非当前页内容。因此数据要通过UIView对应的实体的OQL重新从数据库中读取,这种情况会使自定义列内容不能显示(因为OQL中不包含自定义列)。解决办法有两种:
- 用户在运行其组织数据DataSet。参考传递打印数据
- 只打印当前DataGrid数据内容(适用于当前DataGrid显示了所有该显示的数据)
IExportSettings settings = ExportServiceFactory.GetInstance().CreateExportSettingsObject();
settings.OnlyCurrentPageData= true;
e.Tag = settings;
其他见台头示例代码
传递打印数据
如果用户打印的不是当前页面的某个DataGrid的数据,用户可以设置自己的打印数据DataSet,传递数据的数据分为两种形式
- 传递的数据即为要打印的数据,如枚举值已经转换成对应的显示名称,布尔类型也已转换成同列表Grid显示一致的形式
此时需要自己设置简单的打印样式(如列宽,标题,台头,行高,每列的布局等),自己可参考列表给出打印相关信息如下:
IExportSettings settings = ExportServiceFactory.GetInstance().CreateExportSettingsObject();
//准备打印数据,可打印数据,不需要再转换
settings.PrintData=
//行高,像素单位,若不设置,取系统默认20像素
settings.RowHeight=
//列名,如不设,取DataTable的Column的显示名称(caption),用户可参考当前列表DataGrid的对应列的Caption进行设置
settings.ColumnsName.Add(列名1)
settings.ColumnsName.Add(列名2)
…..
//列宽,如不设,取系统默认200像素,开发人员可参考当前列表DataGrid的对应列的列宽
settings.ColumnsWidth.Add(列宽1)
settings.ColumnsWidth.Add(列宽2)
…
//每列的布局方式,如不设,根据DataTable对应数据类型获取默认布局,开发人员可根据列表对应列的布局进行设置
settings.ColumnsAlignment.Add(TextAlignment.Left),
settings.ColumnsAlignment.Add(TextAlignment.Center),
settings.ColumnsAlignment.Add(TextAlignment.Right),
…
//标题,开发人员可参考当前主View的显示名称,如不设取默认值“列表打印”
settings.Title=
//标题布局,如不设,居中显示
settings.TileAlignment=
//设置DataGrid的名称,由于不需要DataGrid进行数据转换与格式化,必须设一个不存在的DataGrid名称。否则会根据UIDataGrid进行数据转换与格式化
settings. UIDataGridName= “DataGrid0”;
e.Tag = settings;
- 传递的打印数据为原始数据,具体显示还要根据当前列表中的DataGrid进行过滤和转换,如枚举值为数据,布尔类型为true和false,需要根据列表中的枚举列进行显示转换。格式也要根据当前列表中列样式进行设置,如列宽,列显示名称。
适合情况:列表含自定义列同时数据又有多页的情况
IExportSettings settings = ExportServiceFactory.GetInstance().CreateExportSettingsObject();
//准备原始打印数据,,需要根据DataGrid进行过滤和转换,如用户准备数据列多,而打印列少或需要枚举转换等
settings.PrintData=
//设置DataGrid名称,如是默认的”DataGrid1”,不需设置
settings. UIDataGridName= “DataGrid0”;
e.Tag = settings;
其他见台头示例代码
列表打印的适用范围与局限性
列表打印适用于:
- 标准查询或列表页面的打印
- 简单页面数据输出打印,此页面含一个要打印的DataGrid,也许含几个标签
- 复杂页面,没有严格的打印样式规范的需求,只需用将数据输出即可。自己组织打印数据及简单格式,参考传递打印数据
局限性:
- 如果页面含有几个列表,只有一个打印/输出控制菜单,还必须每个列表都要按页面显示样式进行输出,目前不支持!
复杂的单据打印、有严格打印样式需求的不能通过列表打印完成
单据打印
开发流程
单据打印流程:
- UIModel打印参数设置,同列表和查询
- 打印模板设计
- 发布打印模板
- 创建打印参照
- 打印运行时数据准备及打印分类标识设定
打印模板设计
- 数据查询设计
- 创建数据源
- 创建数据查询(BE数据查询)
- 设置查询BE主实体及选择要查询的实体属性
- 执行预览操作
- 布局设计
- 数据绑定
- 格式化与精度设置
- 函数支持
- 快速布局
打印模板发布
- 打印分类目录创建
- 打印模型容器创建
- 打印模板发布
打印参照创建
- 设计阶段创建打印参照对打印模型验证
- 构造阶段打印参照数据预制(加入构造)
- 运行UBFSTUDIO
- 打开报表打印工程
- 运行报表、打印元数据管理
- 连接打印元数据
- 选择打印元数据导出节点进行导出
- 将导出的文件拷贝的U9Data视图特定位置:
U9.VOB.Data/SystemData/StdSqlScript/ReportMetaData/Print目录下
单据打印运行时数据准备
- 数据准备服务IPrepareDataService
- DataSet GetDataSet(IUIView parentUIView, IUIView childUIView, string tableName);
- DataSet GetDataSet(IUIRecord parentUIRecord, IUIView parentUIView, IUIView childUIView,IUFDataGrid childUIViewBindingGrid, string tableName);
- DataSet GetDataSet(List uiViews);
- DataSet GetDataSet(IUIView uiView);
- DataSet GetDataSet(string printTemplateID, FilterValues filterValues);
- 函数回调获取打印数据
- 运行期Context支持
- 系统Context,包括用户名、代码、组织等
- 自定义常量以Contexts!开头,在设计模板时直接引用,在运行期的打印扩展事件里需要赋值
打印开发框架
本文2024-08-20 18:44:41发表“u9cloud知识”栏目。
本文链接:https://wenku.my7c.com/article/yonyou-u9cloud-1194.html