WCF医院管理系统技术解析(十)体检报告结果打印(水晶报表)
对于已经完成体检的病人,对其进行体检结果的打印,其体检结果报告打印效果如图:
界面涉及到的控件有:
控件 |
说明
从工具箱中找到对应的报表控件,可以设置控件的一些属性。如显示的文本,命名是规范
|
文本对象 (Text) |
|
线条对象(Line) |
|
框对象 (Box) |
数据库中用到的表和关系有:
表1:病人表(PatientTable)
列名 |
数据类型 |
主键/外键 |
说明 |
PatientID |
int |
主键 |
病人ID |
PatientCardNumber |
nchar (50) |
|
病人卡号 |
PatientName |
nchar (30) |
|
病人名称 |
RegisterCategoryID |
int |
外键 |
挂号类别 ID |
AS_SexID |
int |
外键 |
性别ID |
Birthday |
datetime |
|
出生年月 |
IDCardNo |
nchar (50) |
|
身份证号 |
AS_MaritalStatusID |
int |
外键 |
婚姻情况ID |
Profession |
nchar (50) |
|
所在职业 |
MemberTypeID |
int |
外键 |
会员类型ID |
MedicareCardNumber |
nchar (50) |
|
医保卡号 |
AS_InsuredTypeID |
int |
外键 |
参保类型ID |
ContactTelephone |
nchar (30) |
|
联系电话 |
ContactAddress |
nchar (100) |
|
联系地址 |
DrugAllergyHistory |
nchar (100) |
|
药物过敏史 |
PatientCategoryID |
int |
外键 |
病人类别ID |
Age |
nchar (30) |
|
年龄 |
AlphabeticBrevityCode |
nchar (20) |
|
拼音简码 |
WubiInCode |
nchar (20) |
|
五笔简码 |
ContactMobilePhone |
nchar (30) |
|
联系手机 |
|
nchar (30) |
|
电子邮件 |
Introducer |
nchar (30) |
|
介绍人员 |
PersonalTaboo |
nchar (70) |
|
个人忌讳 |
HighestReputation |
nchar (70) |
|
信誉上限 |
NowIntegral |
nchar (50) |
|
当前积分 |
Debt |
decimal (18, 2) |
|
尚欠金额 |
ExpenseSum |
decimal (18, 2) |
|
消费金额 |
LastTime |
datetime |
|
上次时间 |
LastDoctor_StaffID |
int |
外键 |
上次医生 |
Prescriptions |
nchar (50) |
|
总处方数 |
PatientPhotos |
char (200) |
|
病人照片 |
WhetherEffective |
bit |
((1)) |
有效否 |
WhetherFromPhysicalExamination |
Bit |
|
是否体检 |
表2:属性明细表(AttributeDetailsTable):
列名 |
数据类型 |
主键/外键 |
说明 |
AttributeDetailsID |
int |
主键 |
属性明细ID |
AttributeDetailsID_F |
int |
外键 |
属性明细ID_F |
AttributeSetID |
int |
外键 |
属性明细ID |
AttributeDetailsName |
nchar (30) |
|
属性明细名称 |
Number |
nchar (30) |
|
编号 |
RetrievalInCode |
nchar (30) |
|
检索简码 |
BuiltInIdentifiers |
bit |
((0)) |
内置标识 |
Remarks |
nchar (100) |
|
备注 |
WhetherEffective |
bit |
((1)) |
有效否 |
表3:处方单表(PW_OrdonnanceTable)
列名 |
数据类型 |
主键/外键 |
说明 |
OrdonnanceID |
int |
主键 |
处方单ID |
OrdonnanceNumber |
nchar (30) |
|
处方单号 |
PatientID |
int |
外键 |
病人ID |
PrescriptionDate |
datetime |
|
处方时间 |
ClinicTechnicalOffices_TechnicalOfficesID |
int |
外键 |
就诊科室_科室ID |
TreatmentDoctor_StaffID |
int |
外键 |
就诊医生_员工ID |
AS_ChargeStatusID |
int |
外键 |
收费状态ID |
ChargeForPersonnel_StaffID |
int |
外键 |
收费人员_员工ID |
ChargeTime |
datetime |
|
收费时间 |
AS_TakeMedicineStatusID |
int |
外键 |
发药状态ID |
TakeMedicinePersonnel_StaffID |
int |
外键 |
发药人员_员工ID |
TakeMedicineTime |
datetime |
|
发药时间 |
BedID |
int |
外键 |
床位ID |
WhetherEffective |
bit |
((1)) |
有效否 |
表4:会员类别表(BT_MemberCategoryTable)
列名 |
数据类型 |
主键/外键 |
说明 |
MemberCategoryID |
int |
主键 |
会员类别 ID |
MemberCategoryNumber |
nchar (30) |
|
会员类别编号 |
MemberCategoryDiscount |
numeric (18, 2) |
|
会员类别折扣 |
MemberCategoryName |
nchar (30) |
|
会员类别名称 |
Remarks |
nchar (150) |
|
备注 |
WhetherEffective |
bit |
((1)) |
有效否 |
表5:项目表(BT_ItemTable)
列名 |
数据类型 |
主键/外键 |
说明 |
ItemID |
int |
主键 |
项目ID |
ItemName |
nchar (70) |
外键 |
项目名称 |
ItemCoding |
nchar (50) |
|
项目编号 |
AS_UserStatusID |
int |
外键 |
使用状态ID |
ProjectPrice |
decimal (18, 2) |
|
现金价格 |
TechnicalOfficesID |
int |
外键 |
科室ID |
DiscountProportion |
decimal (18, 2) |
|
折扣比例 |
WhetherEffective |
bit |
((1)) |
有效否 |
ItemRemarks |
nchar (100) |
|
项目备注 |
ItemUnit |
nchar (20) |
|
项目单位 |
表6:体检执行内容明细表[PW_PhysicalExaminationExecuteContentDetailTable】
列名 |
数据类型 |
主键/外键 |
说明 |
PhysicalExaminationExecuteContentDetailID |
int - Identity |
主键 |
体检执行内容明细ID |
PhysicalExaminationContentID |
int |
外键 |
体检执行内容ID |
ItemID |
int |
外键 |
项目ID |
PhysicalExaminationExecuteContentMessage |
nchar (250) |
体检执行内容信息 |
|
WhetherEffective |
bit |
((1)) |
有效否 |
PhysicalExaminationExecuteID |
int |
外键 |
体检执行ID |
ReportDoctor_StaffID |
int |
外键 |
报告医生ID |
ReportTime |
date |
报告时间 |
表:7: 体检执行表:【PhysicalExaminationExecuteTable】
列名 |
数据类型 |
主键/外键 |
说明 |
PhysicalExaminationExecuteID |
int |
主键 |
体检执行ID |
ChargeBillID |
int |
外键 |
收费单ID |
ExecuteDoctor_StaffID |
int |
外键 |
执行医生ID |
ExecuteNumber |
nchar (20) |
|
体检执行单号 |
Remarks |
nchar (200) |
|
备注 |
HealthSuggest |
nchar (200) |
|
健康建议 |
WhetherEffective |
bit |
((1)) |
是否有效 |
表8:员工 表(BT_StaffTable)
列名 |
数据类型 |
主键/外键 |
说明 |
StaffID |
int |
主键 |
员工ID |
TechnicalOfficesID |
int |
外键 |
科室ID |
StaffNumber |
nchar (20) |
|
员工编号 |
StaffName |
nchar (20) |
|
员工名称 |
WhetherOperator |
bit |
|
操作员否 |
AlphabeticBrevityCode |
nchar (20) |
|
拼音简码 |
WubiInCode |
nchar (20) |
|
五笔简码 |
AS_StaffPositionID |
int |
外键 |
员工职务ID |
AS_MedicalTitlesID |
int |
外键 |
医务职称ID |
AS_WorkingStatusID |
int |
外键 |
工作状态ID |
AS_SexID |
int |
外键 |
性别ID |
ContactTelephone |
nchar (50) |
|
联系电话 |
WhetherBuiltIn |
bit |
|
内置否 |
RegisteredSum |
decimal (18, 2) |
|
挂号金额 |
AS_IntoTheHobbyID |
int |
外键 |
录入爱好ID |
StaffPhotos |
char (200) |
|
员工照片 |
|
nchar (70) |
|
电子邮件 |
IDCardNo |
nchar (100) |
|
身份证号 |
ContactAddress |
nchar (100) |
|
联系地址 |
Birthday |
datetime |
|
出生日期 |
WhetherBirthdayRemind |
bit |
|
生日提醒否 |
WorkDate |
datetime |
|
工作日期 |
TerminationDate |
datetime |
|
离职日期 |
AS_OfficialAcademicCredentialsID |
int |
外键 |
最高学历ID |
StudySubject |
nchar (70) |
|
学习专业 |
AS_PoliticsStatusID |
int |
外键 |
政治面貌ID |
Remarks |
nchar (100) |
|
员工备注 |
WhetherEffective |
bit |
((1)) |
有效否 |
表9:收费单表(PW_ChargeBillTable)
列名 |
数据类型 |
主键/外键 |
说明 |
ChargeBillID |
int |
主键 |
收费单ID |
ReceiptNumber |
nchar (30) |
|
收据号 |
BillNumber |
nchar (30) |
|
发票号 |
AS_ChargeStatusID |
int |
外键 |
收费状态ID |
OrdonnanceID |
int |
外键 |
处方单ID |
Discount |
decimal (18, 2) |
|
折扣 |
CashPaySum |
decimal (18, 2) |
|
现金支付金额 |
MedicarePaySum |
decimal (18, 2) |
|
医保支付金额 |
BlockPaySum |
decimal (18, 2) |
|
卡付金额 |
TallyPaySum |
decimal (18, 2) |
|
记账支付金额 |
Operator_StaffID |
int |
外键 |
操作员_员工ID |
OperateTime |
datetime |
|
操作时间 |
WhetherCancel |
bit |
|
作废否 |
WhetherEffective |
bit |
((1)) |
有效否 |
WhetherOrdonnance |
Bit |
|
是否经过处方 |
表10:体检检查内容表(PW_PhysicalExaminationContentTable)
列名 |
数据类型 |
主键/外键 |
说明 |
PhysicalExaminationContentID |
int - Identity |
主键 |
体检检查内容ID |
PhysicalExaminationContentName |
nchar (100) |
|
体检检查内容名称 |
PhysicalExaminationTypeName |
nchar (100) |
|
体检检查分类 |
WhetherEffective |
bit |
|
有效否 |
该报表涉及到的储存过程有:
IF @TYPE = 'FRM_TiJianZhiXing_Main_提交打印ToolStripMenuItem_Click_OnChuFangDan'
BEGIN
SELECT distinct BT_ItemTable.ItemID, RTRIM(BT_ItemTable.ItemName) AS ItemName, PW_PhysicalExaminationExecuteContentDetailTable.PhysicalExaminationContentID,
PW_PhysicalExaminationExecuteContentDetailTable.PhysicalExaminationExecuteContentMessage, PW_PhysicalExaminationExecuteContentDetailTable.PhysicalExaminationExecuteID,
PW_PhysicalExaminationExecuteTable.HealthSuggest, PW_PhysicalExaminationExecuteContentDetailTable.PhysicalExaminationExecuteContentDetailID,
PW_PhysicalExaminationContentTable.PhysicalExaminationContentName, PW_PhysicalExaminationContentTable.PhysicalExaminationTypeName, BT_StaffTable.StaffName,
PW_PhysicalExaminationExecuteTable.ExecuteDoctor_StaffID, PW_PhysicalExaminationExecuteTable.Remarks, PW_PhysicalExaminationExecuteTable.ExecuteNumber,
PW_PhysicalExaminationExecuteContentDetailTable.ReportDoctor_StaffID, Convert(nchar(10) ,PW_PhysicalExaminationExecuteContentDetailTable.ReportTime,120) AS ReportTime , BT_StaffTable_1.StaffName AS 报告医生,
PW_PhysicalExaminationExecuteTable.ChargeBillID, BT_PatientTable.PatientID, BT_PatientTable.PatientName, BT_AttributeDetailsTable.AttributeDetailsName,
BT_MemberCategoryTable.MemberCategoryName, BT_AttributeDetailsTable_1.AttributeDetailsName AS 参保类型, BT_PatientTable.IDCardNo, PW_OrdonnanceTable.OrdonnanceID
FROM PW_PhysicalExaminationExecuteContentDetailTable INNER JOIN
BT_ItemTable ON PW_PhysicalExaminationExecuteContentDetailTable.ItemID = BT_ItemTable.ItemID INNER JOIN
PW_PhysicalExaminationExecuteTable ON
PW_PhysicalExaminationExecuteContentDetailTable.PhysicalExaminationExecuteID = PW_PhysicalExaminationExecuteTable.PhysicalExaminationExecuteID INNER JOIN
PW_PhysicalExaminationContentTable ON
PW_PhysicalExaminationExecuteContentDetailTable.PhysicalExaminationContentID = PW_PhysicalExaminationContentTable.PhysicalExaminationContentID INNER JOIN
BT_StaffTable ON PW_PhysicalExaminationExecuteTable.ExecuteDoctor_StaffID = BT_StaffTable.StaffID INNER JOIN
BT_StaffTable AS BT_StaffTable_1 ON PW_PhysicalExaminationExecuteContentDetailTable.ReportDoctor_StaffID = BT_StaffTable_1.StaffID INNER JOIN
PW_ChargeBillTable ON PW_PhysicalExaminationExecuteTable.ChargeBillID = PW_ChargeBillTable.ChargeBillID INNER JOIN
PW_OrdonnanceTable ON PW_ChargeBillTable.OrdonnanceID = PW_OrdonnanceTable.OrdonnanceID INNER JOIN
BT_PatientTable ON PW_OrdonnanceTable.PatientID = BT_PatientTable.PatientID INNER JOIN
BT_AttributeDetailsTable ON BT_PatientTable.AS_SexID = BT_AttributeDetailsTable.AttributeDetailsID INNER JOIN
BT_MemberCategoryTable ON BT_PatientTable.MemberTypeID = BT_MemberCategoryTable.MemberCategoryID INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_1 ON BT_PatientTable.AS_InsuredTypeID = BT_AttributeDetailsTable_1.AttributeDetailsID
WHERE PW_PhysicalExaminationExecuteTable. PhysicalExaminationExecuteID = @PhysicalExaminationExecuteID
END
BLL中对应的方法有:
//报表打印 经过处方单的报表打印
[OperationContract]
public DataSet FRM_TiJianZhiXing_Main_提交打印ToolStripMenuItem_Click_OnChuFangDan(int intPhysicalExaminationExecuteID)//根据最后一个体检执行单ID查询体检执行内容明细
{
SqlParameter[] mySqlParameters = {
new SqlParameter("@Type",SqlDbType .Char ),
new SqlParameter ("@PhysicalExaminationExecuteID",SqlDbType .Int ),
};
mySqlParameters[0].Value = "FRM_TiJianZhiXing_Main_提交打印ToolStripMenuItem_Click_OnChuFangDan ";
mySqlParameters[1].Value = intPhysicalExaminationExecuteID;
DataTable dt = myDALMethod.QueryDataTable("TiJianZhongXin_FRM_TiJianZhiXing_Main", mySqlParameters);
DataSet ds = new DataSet();
ds.Tables.Add(dt);
return ds;
}
报表打印在UIL中涉及到的强数据集,建立强数据集有如下几个过程:第一点击数据,然后点击添加数据源,如下图:
然后在数据源配载向导中点击新建连接
第三步:新建连接后,会出现如下窗体
选择服务器名和连接的数据库中对应的名称,再点击测试连接,会提示测试连接成功!
点击确定后弹出如下窗体:
点击数据源配置向导中的下一步,再弹出如下窗体
在表中的前面打上勾再输入数据集的名称,然后点击完成这样就建立好一个强数据集了。
第四步:在解决方案中(如下图所示)找到刚才添加的强数据集
点击刚才添加的强数据集会弹出该界面中的数据表:如下图:
点击添加会出现TableAdapter配置向导(如下图) 然后点击下一步:
出现如下界面后,继续点击下一步
在输入SQL语句中把数据库中用到的储存过程的复制下来,注意不要带WHERE条件中的储存过程也复制下来
把储存过程复制好后,会看到如下界面
然后点击完成
点击完成后,你会发现刚才添加的强数据集多的一张表,点击表头对其命名即可
第五步:右键点击添加新建项
点击后出现如下界面(如果没有安装水晶报表的不会出现如下的中的内容)
在对添加的水晶报表进行命名
命名完成后,点击添加,选择Crystal Reports库中的作为空白报表,再点击确定
出现水晶报表后,点击工具箱对水晶报表设置控件吧
在数据库字段右键点击数据库专家
找到ADO.NET数据集中刚才添加的表 选择该表后点击添加进选定的表中,再点击确定
会看到数据库字段中出现刚才添加的强数据集中的表
用数据库字段中的数据与工具箱中的工具对报表进行自定义布局
对水晶报表的界面用控件布局完成后添加一个窗体,把工具箱中报表设计中CrystalReportViewer的控件拉进界面中
最后在该窗体的Load事件中添加如下代码:
BLL医院管理系统.TiJianZhongXin.FRM_TiJianZhiXing_Main.FRM_TiJianZhiXing_MainClient myFRM_TiJianZhiXing_MainClient =
new BLL医院管理系统.TiJianZhongXin.FRM_TiJianZhiXing_Main.FRM_TiJianZhiXing_MainClient();
DataTable dt = new DataTable();//实例化一个数据表
dt = myFRM_TiJianZhiXing_MainClient.FRM_TiJianZhiXing_Main_提交打印ToolStripMenuItem_Click_OnChuFangDan(intPhysicalExaminationExecuteID).Tables[0];
//实例化强数据集
DS_TiJianZhiXin myDS_TiJianZhiXin = new DS_TiJianZhiXin();
//把查询的数据dt合并到强数据集对象里表名为BaoBiao_TiJianZhiXin_OnChuFang
myDS_TiJianZhiXin.Tables["BaoBiao_TiJianZhiXin_OnChuFang"].Merge(dt);
//实例化报表模板
BaoBiaoTongJi.CRP_TiJianZhiXin_OnChuFang myCRP_TiJianZhiXin_OnChuFang = new BaoBiaoTongJi.CRP_TiJianZhiXin_OnChuFang();
//设置模板的数据源
myCRP_TiJianZhiXin_OnChuFang.SetDataSource(myDS_TiJianZhiXin);
//设置报表控件的报表源
crystalReportViewer1.ReportSource = myCRP_TiJianZhiXin_OnChuFang;
这样一个完整的水晶报表就完成了。运行结果就为第一张图中所示了。
注意:该文章仅供与学习,禁止用于商业用途,否则后果自负!!!