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;
这样一个完整的水晶报表就完成了。运行结果就为第一张图中所示了。
注意:该文章仅供与学习,禁止用于商业用途,否则后果自负!!!