一、概述
目前,我省水情报汛系统采用北京燕禹公司的自测测报接收系统,通过水情交换系统对数据库系统的操作实现雨水情信息的共享。在雨水情信息采集后,需及时向防汛部门提供信息,对数据库进行检索,形成报表。在信息采集过程中,由于仪器设备的原因(故障或信号测试),造成部分伪信息,需要对数据的合理性进行对照。基于以上原因,利用
PowerBuider12.0
开发工具,
SQL Server
数据库完成了雨、水情信息管理系统的开发,旨在实现以下功能:
1、
时段雨量
-
日雨量表制作及合理性对照;
2、
日雨量
--
旬(月)表制作及合理性对照;
3、
分县雨量表的制作;
4、
日雨量分布图的制作;
5、
水情报表的制作;
6、
报表的导出(
Excel
)及打印;
7、
土壤墒情报文的发送;
8、
测站基本信息的浏览;
9、
实时数据与常年值的比较;
10、
其他。
二、总体设计
采用
PowerBuilder12.0
开发工具,
SQL Server
数据库系统,
PowerScript
语言开发完成。按照以上设定的目标,绘制了系统
HIPO
图。
三、数据库设计
1、
数据表的创建
系统采用实时雨水情数据库(
czhy.db
),即日常水情交换系统数据库,涉及数据库表如下:
St_pptn_r
为降水量表,用于存储时段降水量和日降水量;
St_river_r
为河道水情表,用于存储河道站的水情信息;
St_rsvr_r
为水库水情表,用于存储水库站的水情信息;
St_was_r
为堰闸水情表,用于存储堰闸站的水情信息;
St_soil_r
为土壤墒情表,用于存储土壤墒情及附属信息;
St_pstat_r
为降水量统计表,用于存储测站旬、月累计降水量。
2、
表结构设计
1)
降水量表(
st_pptn_r
)
降水量表表结构各字段描述如下:
测站编码:报送降水信息的水文测站编码。
时间:表示降水量值的截止时间。
时段降水量:表示指定时段内的降水量。
时段长:描述水文测站所报时段降水量的统计时段长度。
降水历时:描述指定时段的实际降雨时间。
日降水量:表示的是前一天
(24h)
的降水量。
天气状况:降水量值统计截止时的天气状况代码。天气状况的代码及意义仍按现行规定取值。
2
)降水量统计表
(ST_PSTAT_R)
降水量统计表表结构
各字段描述如下:
测站编码:雨量站(含测报雨量的其它站)测站编码。
标志时间:同前。
统计时段标志:统计时段标志字段。
累计降水量:统计时段内(标志时间前若干天)降水量累计值。
3
)测站设定表
功能:存储用户指定的测站。
各字段描述如下:
测站编码:全国统一编制的,用于标识某一水文测站的字符编码编码。测站编码是由数字和大写字母组成的
8
位字符串。
测站名称:测站编码所站的中文名称。
测站类型:标识水文测站类型的两位字母代码。水文测站类型代码由两位大写英文字母组成,第一位固定不变,表示大的水文测站类型,第二位根据情况可以扩展,表示大的水文测站类型的细分,如果没有细分的情况下,重复第一位。大的水文测站类型目前分为
8
种。水文测站类型及其代码按规定取值。
四、功能实现
1、界面设计
采用主流的
MDI界面,集成菜单栏、工具栏、帮助于一体,最大限度的与用户日常操作同步。
2、
程序设计
1
)时段雨量报表的制作
用户在完成雨情测站设置后,即可进行时段雨量报表的制作,系统根据用户的设定,得到相关雨量站的时段降雨量信息,并与发报后的日雨量进行合理性对照。
注意的几点:
A、
降水时间:用户选择的“降水日期”默认为发报的日期。这也与我们水情人员日常发报习惯相一致;
B、
雨量的分级显示:系统设定降水量≥
50mm
,显示为橙色;降水量≥
100mm
,显示为红色;降水量≥
200mm
,显示为蓝色;
C、
分屏显示:在用户窗口不能完全显示全时段降雨量时,用户可选择分屏显示方便对照,同时,高亮显示用户选定的数据行;
D、
合理性分析:全时段降雨量总和与发报的日量值应符合规定的逻辑关系,如出现逻辑错误,则在备注列以“
*
”标识,提醒用户进行数据分析。
部分程序代码如下:
dw_time.dataobject = "d_time"
dw_time.SetTransObject( SQLCA)
dw_pptn.SetTransObject(SQLCA)
integer li_m,li_colmn
long ll_i,ll_f
string ls_stcd,ls_date,ls_temp,ls_filter
if dw_info_user.rowcount( ) < 1 then
messagebox("
温馨提示:
","无雨量站基本信息,请设置后再执行查询操作!
")
return
end if
open(w_wait)
dw_time.object.t_bt.text = ""+string(RelativeDate(date(dp_date.value),-1)) +" 9:00
至
"+mid(string(date(dp_date.value)),6)+" 8:00 时段降水量统计表
"
ls_filter = ' string(tm,"yyyy-mm-dd") >= "'+string(RelativeDate(date(dp_date.value),-1),"yyyy-mm-dd")+'" and string(tm,"yyyy-mm-dd") <= "'+string(RelativeDate(date(dp_date.value),1),"yyyy-mm-dd")+'"'
dw_pptn.Retrieve( )
dw_pptn.SetFilter( ls_filter)
dw_pptn.filter( )
for ll_i = 1 to dw_info_user.rowcount( )
dw_time.InsertRow( 0)
dw_time.SetItem( ll_i,"stcd",dw_info_user.GetItemString(ll_i,"stcd"))
dw_time.SetItem( ll_i,"stnm",dw_info_user.GetItemString(ll_i,"stnm"))
ls_stcd = dw_time.GetItemString( ll_i, "stcd")
ls_date = string(RelativeDate(date(dp_date.value),-1)) + " 09:00:00"
ll_f = dw_pptn.find( "stcd = '"+ls_stcd+"' and string(tm) = '"+ls_date+"'",1,dw_pptn.rowcount())
if ll_f > 0 then
ls_temp = string(dw_pptn.GetItemDecimal(ll_f,"drp"))
dw_time.SetItem( ll_i,3, ls_temp)
end if
ls_date = string(date(dp_date.value)) //00
:
00量单独处理 注意:
0点的数据无“
00:
00
”
ll_f = dw_pptn.find( "stcd = '"+ls_stcd+"' and string(tm) = '"+ls_date+"'",1,dw_pptn.rowcount())
if ll_f > 0 then
ls_temp = string(dw_pptn.GetItemDecimal(ll_f,"drp"))
dw_time.SetItem( ll_i,18, ls_temp)
end if
for li_m = 10 to 23
ls_date = string(RelativeDate(date(dp_date.value),-1)) +" " + string(li_m) + ":00:00"
ll_f = dw_pptn.find( "stcd = '"+ls_stcd+"' and string(tm) = '"+ls_date+"'",1,dw_pptn.rowcount())
if ll_f > 0 then
ls_temp = string(dw_pptn.GetItemDecimal(ll_f,"drp"))
dw_time.SetItem( ll_i,li_m - 6, ls_temp)//4-17
列
end if
next
for li_m = 1 to 8
ls_date = string(date((dp_date.value))) +" 0" + string(li_m) + ":00:00"
ll_f = dw_pptn.find( "stcd = '"+ls_stcd+"' and string(tm) = '"+ls_date+"'",1,dw_pptn.rowcount())
if ll_f > 0 then
ls_temp = string(dw_pptn.GetItemDecimal(ll_f,"drp"))
dw_time.SetItem( ll_i,li_m + 18, ls_temp)//19-26
列
end if
next
ls_date = string(date(dp_date.value)) + " 08:00:00"//8
点的量单独处理
ll_f = dw_pptn.find( "stcd = '"+ls_stcd+"' and string(tm) = '"+ls_date+"'",1,dw_pptn.rowcount())
if ll_f > 0 then
ls_temp = string(dw_pptn.GetItemDecimal(ll_f,"dyp"))
dw_time.SetItem( ll_i,"swcv", ls_temp)//
写入发报的日量
end if
next
for ll_i = 1 to dw_time.Rowcount( )
if
dec(dw_time.getitemstring ( ll_i,"compute_3")) > dec(dw_time.getitemString( ll_i, "swcv")) then
dw_time.SetItem(ll_i,"yl_1","*")
else
dw_time.SetItem(ll_i,"yl_1","")
end if
next
ls_filter = ""
dw_pptn.setfilter(ls_filter)
dw_pptn.filter( )
close(w_wait)
2)
墒情发报功能
系统集成了墒情发报功能,对发报方法进行了改进,采用直接填写墒情数据——系统自动转换库表结构代码发报,改变了过去先编写编码格式的墒情信息——再转换成库表结构代码发报的易错方式。
五、结束语
基于
PB12.0的雨水情信息管理系统,界面美观、操作简便,提高了日常的雨水情信息管理工作的效率,为防汛部门提供简便、快捷的资料起到了辅助作用。
审稿:刘国强
|