填报实现模式详解

在本章节开始的部分当中, 我们已经对填报实现原理做了介绍,这里将原理的文字介绍部分再次强调一下。

填报功能运行时,系统会首先找出与填报项中绑定的所有的单元格的顶层父格,页面渲染时,通过该顶层父格找到所有的子格所在的行和列,并加以标记和保存,并将每个单元格与其所在行或列建立索引。

  • 用户修改某个单元格操作时,就会将该单元格对应的行或列标记修改状态。
  • 用户在选中某个单元格后,点击工具栏上的插入按钮时,系统会根据选中单元格对应的所有子格信息,复制所有的对应的子格,创建新的行或列(根据选中单元格迭代方向决定创建行还是列,迭代方向向下的创建行,否则创建列),同时对于选中单元格的父格,执行父格的跨行或跨列加1操作(选中单元格迭代方向向下的执行父格的跨行加1操作,否则执行父格的跨列加1操作),同时将新插入的行或列标记为插入状态。
  • 用户在选中某个单元格后,点击工具栏上的删除按钮时,系统会根据当前选中单元格, 删除其下所有的子格所在行或列(同样,如果选中单元格迭代方向向下,那删除子格所在行,否则删除子格所在列),同时将删除的行或列添加删除标记。
  • 最后用户点击工具栏上保存按钮时,系统会将当前页面中所有的标记了修改插入以及删除行或列取出,提交到服务执行保存操作。

通过上面的描述可以看出,填报功能严重依赖于单元格间的父子格关系,如果在报表中制作一个填报的表单后,将各个单元格的父格都设置为,那么在填报保存时将会出现保存错误。

为了让大家理解填报的实现模式,这里将通过一些示例加以说明。

1. 多行报表填报示例

创建一张报表,连接示例数据库中的employee表,设计报表模版,并与employee表各个字段绑定,同时将各个单元格都绑定单行文本框,如下图所示:

配置一个名为mysql的填报项,并与报表模版中各个单元格绑定,同时设置EMPLOYEE_ID为主键,效果如下:

上面的填报项配置中,分别与A2~H2单元格绑定,又因为我们在报表模版配置时,没有自定义单元格的父格,所以系统在处理填报中绑定的A2~H2单元格的信息时,会使用A2单元格为填报主单元格,因为通过A2单元格可以找到所有子格,及子格所在的行,从而将每一条填报记录在预览页面打开时准备好。

打开报表配置对话框,在WEB预览工具栏选项卡里将填报相关所有按钮加入到列表中,同时交暂存数据中的允许自动暂存项勾选取消,如下图所示:

预览报表,效果如下图所示:

接下来,我们就分别来看看在选择不同参照单元格时,插入与删除操作会产生什么样的效果,通过产生的效果来加深我们对填报实现模式的理解。

修改操作比较简单,这里就不再讨论,需要注意的是,修改操作不支持对主键的修改,也就是说如果修改了主键,保存后会发现没有保存入库,这是因为修改保存时采用的是主键为条件来执行更新操作,而不会重设主键的值,所以不支持修改主键。

1.1 插入操作

首先我们来看看插入操作,选中所在部门ID对应的第一个单元格,单击工具栏上的插入按钮,可以看到系统会在该单元格下方插入一空行,如下图所示:

填充好各个单元格的值,点击工具栏上的保存按钮,就可以将该新行记录插入到数据库。

选中新插入行对应的学历单元格,再次点击工具栏上的插入按钮,效果如下图所示:

截图中可以看到,在选择新插入行的学历单元格再进行插入行操作时,会将所在部门ID对应的单元格作为父格,同时将父格跨行值加1,同时在选择的学历单元格下添加一行新的记录。

填充好新插入行单元格值,然后点击工具栏上的保存按钮,将新行记录插入到数据库中,这时插入的记录采用的是和选中的对于学历单元格所在行相同的所在部门ID值,如下图:

再次选择新插入行对应的性别单元格,再点击工具栏上的插入按钮,可以看到以下效果:

可以看到引擎将以这个性别所在单元格为参照,在其下方新插入一行,同时将所在部门ID列及学历列跨行加1,为新插入行填充各个单元格值,然后点击保存,就可以实现将新记录保存入库,同时可以看到新插入的记录将采用与上一行相同的所在部门ID及学历值。

如本章节开始时所说,填报功能依赖于报表模版中配置的父子格关系,在插入数据时会根据当前选择的参照单元格,依据该单元格在报表中对应的父格和子格,实现行或列记录的插入。

2.删除操作

和插入操作一样,删除操作同样也需要参照单元格,在我们选择一个参照单元格后,点击工具栏上的删除按钮,引擎会将当前选择的单元格所在行,以及其子格所在行一起删除。

同时,如果当前选择的单元格有父格,并且该父格的跨行值大于当前选择单元格的跨行值,那么系统会重新设置该父格的跨行值,新值为:父格原跨行值-选择单元格的跨行值。

我们来看一个例子,同样是上面的填报报表,我们选择第一个所在部门ID单元格,该单元格跨了6行,删除该单元格所在的行,也就是会删除对应的6行记录,如下图所示:

点击工具栏上的保存按钮,提示保存成功,再次刷新页面,会发现对应的6条记录已被删除。

接下来我们再选择第一行学历下对应的第一个单元格,再次点击工具栏上的删除按钮,因为该学历下有两条记录,所以系统会将这两条记录删除,同时因为它的左父格所在部门ID的跨行值大于当前选择的单元格的跨行值,所以系统会重设其左父格的跨行值,效果如下图所示:

综上,可以看出,删除时同样依赖于报表模版中配置的单元格父格关系,删除时会删除当前选择单元格及其子格所在行,同时对于选择单元格的父格,如果父格的跨行值大于选择单元格的跨行值,系统会保留父格,同时会缩减对应父格的跨行值。

2.表单型报表填报示例

同样采用示例数据库中的employee表,制作如下图所示报表模版,并为绑定字段的单元格绑定好文本输入框控件,效果如下图: 可以看到,这是一个简单的类似表单类型的报表,报表数据迭代时将采用绑定了EMPLOYEE_ID字段的B1单元格为主单元格进行迭代,所以设置B2、B3、D1、D2、D3单元格的左父格为B1;为了让每个表单项之前留一空行,所以这里将A4单元格的左父格也设置为B1。

同时为了在插入数据时能把表单的标题也复制下来,所以这里还需要在右侧属性面板中的其它属性里新单元格值类型为原单元格值,如下图所示:

预览该报表模版,效果如下:

回到报表模版设计页面,打开报表配置对话框,在WEB预览工具栏选项卡里将填报相关所有按钮加入到列表中。

2.1 插入操作

刷新报表的预览页面,选择不同参照单元格执行工具栏上的插入按钮,效果如下图所示:

通过上图中可以看到,只有选择ANLIN所在的B1单元格为插入的参照单元格时,插入的结果才是正确的,选择其它单元格为插入的参照单元格时,插入的内容都是错误的。

之所以会出现上面的问题,是因为填报单元格的主格导致,之前我们说过,填报功能运行时,系统会首先找出与填报项中绑定的所有的单元格的顶层父格作为主格,通过该主格找到所有的子格及其所在行或列并建立索引。 对应到我们这个表单,B1单元格是其它所有单元格的左父格,所以B1单元格就是填报功能运行的主格,在选择B1单元格时,系统会找到B1单元格的所有子格及其所在行进行复制,以因为B1单元格的迭代方向为向下迭代,所以复制操作就是在B1单元格所有子格对应行的最后一行下插入新的记录,新的记录里包含的行数由B1单元格所有子格对应的行决定,所有子格对应的行都会被复制,所以我们会看到会产生四行新的记录。

对于表单标题所在的A1、A2、A3、C1、C2、C3单元格,因为在报表模版中我们配置了新单元格值类型为原单元格值,如下图: 所以这些单元格在产生新单元格时会将标题值直接复制到新单元格中,从而达到我们想要的效果。 在新增行各个单元格里填入数据,点击工具栏上的保存按钮,即可将数据保存入库。

2.2 删除操作

和插入操作一样,删除操作同样依赖于填报计算中产生的主格,这里就是B1单元格,当选中B1单元格为删除操作的参照单元格时,可以看到整条表单涉及到的四行数据皆被删除,但选择其它单元格时,则只能删除当前单元格所在行,如下图所示:

在选择B1单元格执行删除操作时,系统会尝试找到B1单元格及其子格所在行,并将其删除,所以我们能看到对应的三行数据记录,及下方的空行被删除;而选择其它单元格执行删除操作时,只能删除当前单元格所在行。 删除操作完成后点击工具栏上的保存按钮就可以实现将删除的记录保存入库。

需要注意的是,即使选择的不是B1单元格执行删除操作,虽然页面上只显示删除选择单元格所在一行记录,但保存后会发现对应的整条记录已被删除,这是因为其它非B1单元格都是B1单元格的左子格,所以删除时会将对应的B1单元格对应记录标识为删除状态,保存会整条记录会被删除;但为了和页面效果对应起来,我们还要选择B1单元格,然后再执行删除操作。

和之前一样,除新增记录外,主键值对应的单元格修改后保存是不生效的,原因同上。

3.横向扩展填报示例

同样使用示例数据库的employee表制作一张横向展开的报表模版,同时在绑定字段的单元格上绑定文本输入框,效果如下图所示:

针对这五个字段,配置一条填报项,并与这五个单元格绑定,同时设置好EMPLOYEE_ID字段为主键,设置好的填报项如下图所示: 最后在报表模版设置窗口中将填报相关工具加入到WEB预览工具栏中,这样就完成了一个横向扩展填报报表。

3.1 插入操作

选择不同的参照单元格后,点击工具栏上的插入按钮,效果如下图所示: 通过前面的示例,我们应该已经理解,对于这张横向扩展的填报报表,它的填报主格是B1单元格,B1单元格是它们的顶层父格,通过该单元格可以找到所有的单元格。同时B1及其它单元格的迭代方向都是向右的,所以在选择B1单元格插入数据时会直接在右侧插入一空列。 如果选择插入的参照单元格是B2,那么因为B1是B2的上父格,所以在执行插入操作时,B1单元格不会被复制,而是会将其跨列值加1,也就是将其横向拉大,对于B3、B4单元格,它们是B2单元格的子格,所以它们会被复制到新列中。 同样,如果选择B3单元格为插入的参照格,也会产生相同的效果,这里就不再赘述。

选中B1单元格插入新列后,填充好相关数据,再点击工具栏上的保存按钮,即可实现数据的插入保存。

3.2 删除操作

对于删除操作而言,参照单元格无论选择B1,还是B2、B3、B4、B5,其产生的效果都是一样的,都能把当前单元格所在列删除,保存后会发现数据库中对应的记录已被删除。这是因为B1~B5单元格都在一列当中,且列不存在跨列问题,所以可以选择B1~B5中任意一个单元格作为删除的参照单元格,操作效果如下图:

同样,除新插入数据外,在修改时不能对主键值进行修改。 对于这种横向扩展的填报报表,实现应用中可能不常见,这里只是通过这种示例,让大家理解BaskReport中填报实现模式,实际业务中更多的可能还是上面两种类型。

results matching ""

    No results matching ""