作业——一张复杂科室核算报表的制作过程.doc_第1页
作业——一张复杂科室核算报表的制作过程.doc_第2页
作业——一张复杂科室核算报表的制作过程.doc_第3页
作业——一张复杂科室核算报表的制作过程.doc_第4页
作业——一张复杂科室核算报表的制作过程.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一张复杂科室核算报表的制作过程编制:李群巍2001.10.24一、引言报表是 HIS 系统中一个很重要的组成部分。它牵涉的面也很广,主要用于财务核算、工资核算、医院业务数据查询,以及为医院领导提供必要的决策支持数据。所以,如何做高质量、容易查看的报表,对上好医院的整套HIS系统有很大的帮助。 下面就是一个例子,它提供了做报表的一般思路和一些在实际制作过程中的技巧。二、报表描述报表名称:住院科室核算报表主要功能及特点描述:1)查询一段时间内,住院每个临床科室各个收费项目的出院病人结算情况注意,出院病人计算日期按日汇总日期为准。 2)每个科室的每个项目又要体现不能执行可是及其子项归并下面是参考界面:3)项目、项目内容可支持表达式,科室都要能灵活设置补充说明:图中,手术费合计里有:手术费(分自己临床科室执行的和其他科室执行的)、手术材料费(分自己临床科室执行的和其他科室执行的)等。报表要体现这种关系。三、实现过程1、 实现的着手思路:我们知道,做程序关键在思路,思路好的话,可以事半功倍的。所以,我们试图用最简单的方法去实现这个报表。但是,现在我们可能遇到的难题是没有现成的代码可以参考。否则,引用别人的代码就可以了。现在,这个偷懒的办法无效了。公司以前的程序中可能没有这样的报表,至少我以前没看到过。放在我们面前的问题还有,项目、项目内容可支持表达式,科室都要能灵活设置,这个又增加了我们写程序的难度了。但是,有一点我们可以明确的是,我们可以将上面的问题分解。我们可以将复杂的问题逐个分解,这是过程化程序设计的基础思想,同样也是面向对象程序设计的基础。我们,现在就将问题分解:1) 先考虑这张二维表的格式若将项目放在横列,因为要同时考虑归并和同个项目不同执行科室,觉得太复杂。但如果,我们将临床科室(即病区)放在横列,而项目放在纵列。我们知道,数据控制行的动态变化,要比控制列的动态变化容易的多。到次,我们基本确认了外观格式,是型如:科室1 科室2 。项目1 项目1的子项目1执行科室1执行科室2 项目1的子项目2。这样的格式2) 知道了格式后,我们来考虑数据如何获取我们知道,我们可以将一个外部数据源的datawindow (其中带了很多的列,足够多,不会导致列不够用,这里30来个就差不多了,因为医院科室一般就10多个的样子)。 然后,我们在从别的数据窗口中获得数据根据上面指定的格式往里面填写。这个是我们填写数据的基本思路,当然,到这个时候了,我们还不知道填写的具体规则。3) 我们需要从多个数据源中获得数据,往里面填写。经过分析,容易得到,我们大概需要这样的一些数据:科室代码数据 可从 GY_KSDM 表中取项目数据 - 可从 GY_SFXM 表取执行科室数据 可指定,而不是每个科室都显示出来,因为,一般一个项目在哪几个科室可能被执行是范围确定的 项目和子项目的归并关系 可以从 GY_SFXM 表中获得,但是,为了灵活其间,我这里是让用户自行定义 费用数据 - 从 ZY_FYMX、ZY_FYMX_CY 表中获得,需要和 ZY_ZYJS 表关联,然后根据 ZY_ZYJS 中的 HZRQ 查询数据 4) 定义用户规则表是关键:根据第三步的思路,我们知道,项目和子项目的归并关系,以及对一个项目要显示不同科室的数据。要完成这个,用户规则表的制定是关键。因为,如果,规则表的设计的好,我们遵循的规则就简单,取数据就容易了。反之,我们下面的程序设计就很困难了。前面知道,列向只是每个科室的数据罗列,所以,我们知道了,一个科室的获取数据的方法,也就知道了所有科室获取数据的方法了。所以,我们的突破口在于定义一个科室的数据存取规则。关于表达式的实现,我们在设计规则时只要考虑利于取数据时的分析判断就可以了。 下面的图表就是本人设计的规则表。我来介绍一下特点:执行科室 = 0 只限制临床科室, 执行科室= -1 临床科室自己的费用,执行科室 0 医技科室代码 明细项目请在 明细 处打钩,区分下面在算合计的时候要不要将这一行算在内,打钩的不算,不打钩的算,因为大项已经包含了小项的费用,一起都算的话,将导致合计的金额重复多算了。表达式前加 DEC 特殊科室药品前加 KSYP 如:第9行表示的是:所有归并到 6 号项目的费用,我们将这些费用的名称取为“检查费合计”,当然你也可取其他的名字。它是第一层的大项,所以,我们在“明细”处不打钩第10行表示的是:所有归并到 8 号项目的费用,它同时是归并在第9行的费用下的,所以,我们在“明细”处打钩第12行表示的是:所有归并到所定义的表达式的费用,它同时是归并在第9行的费用下的,所以,我们在“明细”处打钩表达式的意思是,扣除了 8、18、19、20、17这些项目的作为其他检查费的金额第13 行表示的是:所有归并到 18 号项目的费用,它同时是归并在第9行的费用下的,所以,我们在“明细”处打钩并且,它是只是在本科室执行的费用,因为“科室 = -1”5)设计报表,编写代码前面的准备工作都做好了,我们写程序就容易了。到现在,写程序的时候,应该很有思路了,如果你没有,说明你写程序的基本功不扎实了,应该好好的看看书了,哈哈。主要分下面的几步:1) 填写临床科室代码基本思想是,一个科室对应一列,没填完的列隐藏,从左到右填写,当然,科室代码列表最好保存在其他地方,如下面的已经保存在 ila_ksdm 这个数组中了,它记录了从左到右的每个科室的科室代码。下面是参考代码:int iint li_countstring ls_ksmc for i = 1 to 50ila_ksdmi = 0nextli_count = dw_ksdm.rowcount() for i = 1 to li_countls_ksmc = dw_ksdm.object.ksmciila_ksdmi = dw_ksdm.object.ksdmi dw_1.modify(fy+string(i) + _t.text = + ls_ksmc + )nextif li_count 0 then / 是个项目 ll_fyxh=long(ls_valstr)ld_je = event ue_get_itemdata(sfxm=+string(ll_fyxh)+ or rbtj=+string(LL_fyxh), ll_ksdm, ll_index )else / 是分类表达式choose case trim(ls_valstr)case SUM ALLld_je = event ue_get_itemdata(, ll_ksdm, ll_index )case SUM 1ld_je = event ue_get_itemdata(fyfl=1, ll_ksdm, ll_index )case SUM 2ld_je = event ue_get_itemdata(fyfl=2, ll_ksdm, ll_index )case SUM 3ld_je = event ue_get_itemdata(fyfl=3, ll_ksdm, ll_index )case elsesetnull(ld_je)end chooseend ifls_valstr = trim(ls_valstr)/处理混合表达式, 加法优先减法/ -if left(ls_valstr,3)=DEC thenld_je=0ls_valstr=right(ls_valstr,len(ls_valstr) - 3)int li_pos,li_jjbz=0string ls_lsstrdouble ld_je1li_pos=Pos(ls_valstr, +)if li_pos0 thenll_fyxh=long(left(ls_lsstr,li_pos - 1)ld_je1 = event ue_get_itemdata(sfxm=+string(ll_fyxh)+ or rbtj=+string(LL_fyxh), ll_ksdm, ll_index )elsechoose case trim(ls_lsstr)case SUM ALLld_je1 = event ue_get_itemdata(, ll_ksdm, ll_index ) case SUM 1ld_je1 = event ue_get_itemdata(fyfl=1, ll_ksdm, ll_index ) case SUM 2ld_je1 = event ue_get_itemdata(fyfl=2, ll_ksdm, ll_index )case SUM 3ld_je1 = event ue_get_itemdata(fyfl=3, ll_ksdm, ll_index )case else ld_je1=0 end choose end ifif isnull(ld_je1) then ld_je1=0if li_jjbz0 thenld_je=ld_je - ld_je1elseld_je=ld_je + ld_je1end if if li_poslen(ls_valstr) then exitif mid(ls_valstr,li_pos,1)=- and mid(ls_valstr,li_pos,1) then li_jjbz=1if mid(ls_valstr,li_pos,1)=+ and mid(ls_valstr,li_pos,1) then li_jjbz=0ls_valstr=right(ls_valstr,len(ls_valstr) - li_pos)li_pos=Pos(ls_valstr, +)if li_pos1 then li_pos=Pos(ls_valstr, -) if li_pos1 then li_pos=len(ls_valstr)+1ls_lsstr=ls_lsstr+-end ifend ifloopend if/ -dw_1.setitem(row,fy + string(ll_index), ld_je)li_jjbz=0 next / 项目循环next/ 科室循环/ 填写合计dec lc_hjjedec lc_jefor i = 1 to li_countlc_hjje = 0for ll_index = 1 to dw_ksdm.rowcount()lc_je = dw_1.GetItemDecimal ( i, fy+string(ll_index)if isnull(lc_je) then lc_je = 0lc_hjje += lc_jenextdw_1.setitem(i, fy + string(dw_ksdm.rowcount() + 1), lc_hjje)nextgf_waiting(正在读取数据., 100)gf_waiting(正在读取数据., -1)SetPointer(Arrow!)dw_1.setredraw(true)ii)下面是获得一个格子的数据的参考代码即 ue_get_itemdata 的参考代码 / 获得每个分组的数据dec ld_jestring ls_filter, ls_textif al_ksdm = 0 then / 只限制临床科室ls_filter = fyks = + string(ila_ksdmai_index)elseif al_ksdm 0 then / 限制临床科室和执行科室2(临床科室执行科室) if ib_get_tsyy then / 特殊科室 ls_filter = fyks = + string(ila_ksdmai_index) + and tsks = + string(al_ksdm)else ls_filter = fyks = + string(ila_ksdmai_index) + and zxks = + string(al_ksdm)end if end ifdatawindow ldw_tempif ib_get_tsyy then ldw_temp = dw_tsyydataelseldw_temp = dw_srdat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论