WCF醫院管理系統技術解析 (二)體檢登記(一)
體檢登記模塊
體檢登記這個模塊主要是記錄需要體檢的病人信息 ,如每次體檢的項目、和相關現金價格,以及項目類型和體檢狀態等等體檢信息。可以通過查詢病人姓名和病人卡號進行篩選查詢,還可以對“未登記”病人進行提交體檢登記 以及新增體檢病人、對新增的體檢病人進行前臺收費、關閉當前頁面和進入上下頁等。
界面效果圖:
2.9.8(圖1)
從界面上可以看到我們這裏用到的控件有
控件 |
說明 從工具箱中找到對應的控件,可以設置控件的一些屬性和事件。如顯示的文本,命名是規範
|
文本框 (TextBox) |
|
下拉框 (ComBobox) |
|
數據表格 (DataGridView) |
|
按鈕(Button) |
|
標籤 (Label) |
查詢功能實現:
第一步數據庫:
2.9.8(圖2)
2.9.8(圖3)
2.9.8(圖4)
2.9.8(圖5)
表1:員工表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)) |
有效否 |
表2:收費單表(PW_ChargeBillID)
用於對病人的處方單或者其他收費單進行收費的憑證
列名 |
數據類型 |
主鍵/外鍵 |
說明 |
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 |
|
是否經過處方 |
表3:體檢登記病人表(PW_PhysicalExaminationChargeBillPatientTable)
列名 |
數據類型 |
主鍵/外鍵 |
說明 |
PhysicalExaminationChargeBillPatientID |
Int |
主鍵 |
體檢登記病人ID |
PatientID |
Int |
外鍵 |
病人ID |
ChargeBillID |
Int |
外鍵 |
收費單ID |
AuxiliaryItemDetailID |
Int |
外鍵 |
輔助項目明細ID |
WhetherChargeBill |
Bit |
|
是否收費 |
表4輔助項目明細表 (PW_AuxiliaryItemDetailTable)
用於對病人設置體檢、化驗項目或組合
列名 |
數據類型 |
主鍵/外鍵 |
說明 |
AuxiliaryItemDetailID |
int |
主鍵 |
輔助明細項目ID |
RegisterID |
int |
外鍵 |
掛號ID |
AllItemID |
int |
外鍵 |
總項目ID |
ItemCategoryID |
int |
外鍵 |
項目類別ID |
WhetherEffective |
bit |
((1)) |
是否有效 |
AS_PhysicalExaminationRegisterID |
int |
外鍵 |
體檢登記ID |
OrdonnanceID |
int |
外鍵 |
處方單ID |
表5:項目類別表 (PW_ItemCategoryTable)
用於判斷病人的項目類別
列名 |
數據類型 |
主鍵/外鍵 |
說明 |
ItemCategoryID |
int |
主鍵 |
項目類別ID |
ItemCategoryName |
nchar (30) |
外鍵 |
項目類別名稱 |
表6:病人表(BT_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 |
|
是否體檢 |
表7:屬性明細表(BT_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)) |
有效否 |
表8:處方單表(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)) |
有效否 |
控件使用方法:
以Labe爲例(其他控件的使用方法大同小異)Label的使用方法如下:
點擊工具箱,拖動Label到界面
2.9.8(圖6)
右鍵設置該控件中的屬性樣式和事件等如圖:
2.9.8(圖7)
控件下拉框的數據綁定:下拉框主要綁定數據供用戶選擇合適需要的基礎數據
2.9.8(圖8)
數據庫中的儲存過程:(其他涉及到數據綁定的控件都需要用到對應的儲存過程,方法和這個類似,下面就不截圖了)
--綁定性別
IF @Type = 'FRM_TiJianDengJi_Main_cbo_AS_SexID'
BEGIN
SELECT RTRIM(AttributeDetailsID) AS AttributeDetailsID, RTRIM(AttributeDetailsName) AS AttributeDetailsName
FROM BT_AttributeDetailsTable
WHERE AttributeSetID = 2
END
BLL(邏輯層)中的方法:
與數據庫對應的BLL,方法都是找到對應的BLL在裏面寫代碼和這個類似,下面就不截圖了
2.9.8(圖10)
#region 綁定性別
[OperationContract]
public DataSet FRM_TiJianDengJi_Main_cbo_AS_SexID()
{
SqlParameter[] mySqlParameters = {
new SqlParameter("@Type",SqlDbType .Char ),
};
mySqlParameters[0].Value = "FRM_TiJianDengJi_Main_cbo_AS_SexID ";
DataTable dt = myDALMethod.QueryDataTable("TiJianZhongXin_TiJianDengJi_Main", mySqlParameters);
DataSet ds = new DataSet();
ds.Tables.Add(dt);
return ds;
}
#endregion
UIL(界面層)中的代碼:
cbo_AS_SexID.DataSource = myFRM_TiJianDengJi_MainClient.FRM_TiJianDengJi_Main_cbo_AS_SexID().Tables[0];//綁定性別
cbo_AS_SexID.DisplayMember = "AttributeDetailsName";
cbo_AS_SexID.ValueMember = "AttributeDetailsID";
數據表格(DataGridView)的界面:
2.9.8(圖11)
數據庫中的儲存過程(分頁涉及到了該儲存過程):
查詢體檢登記頁面中的病人登記信息
IF @Type = 'FRM_TiJianDengJi_Main_dgv_PhysicalExaminationRegisterOnYeShu'
BEGIN
--不經處方的病人
SELECT RTRIM( BT_StaffTable.StaffName) AS StaffName, RTRIM(BT_PatientTable.PatientCardNumber) AS PatientCardNumber , RTRIM(BT_PatientTable.PatientName) AS PatientName,
RTRIM(BT_AttributeDetailsTable_1.AttributeDetailsName) AS AttributeDetailsName, RTRIM(BT_PatientTable.AS_SexID) AS AS_SexID,RTRIM(PW_AuxiliaryItemDetailTable.
AS_PhysicalExaminationRegisterID) AS AS_PhysicalExaminationRegisterID, RTRIM(BT_AttributeDetailsTable.AttributeDetailsID) AS AttributeDetailsID,
RTRIM(BT_AttributeDetailsTable.AttributeDetailsName) AS 體檢登記, RTRIM('無') AS OrdonnanceNumber,RTRIM( BT_PatientTable.PatientID) AS PatientID,
RTRIM(PW_ChargeBillTable.Operator_StaffID) AS TreatmentDoctor_StaffID, RTRIM(0) AS OrdonnanceID, PW_ChargeBillTable.OperateTime AS PrescriptionDate,
RTRIM(PW_PhysicalExaminationChargeBillPatientTable.ChargeBillID) AS ChargeBillID
FROM PW_AuxiliaryItemDetailTable INNER JOIN
BT_PatientTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_1 ON BT_PatientTable.AS_SexID = BT_AttributeDetailsTable_1.AttributeDetailsID ON
PW_AuxiliaryItemDetailTable.OrdonnanceID = BT_PatientTable.PatientID INNER JOIN
BT_AttributeDetailsTable ON PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID = BT_AttributeDetailsTable.AttributeDetailsID INNER JOIN
PW_ItemCategoryTable ON PW_AuxiliaryItemDetailTable.ItemCategoryID = PW_ItemCategoryTable.ItemCategoryID INNER JOIN
PW_PhysicalExaminationChargeBillPatientTable ON PW_AuxiliaryItemDetailTable.AuxiliaryItemDetailID = PW_PhysicalExaminationChargeBillPatientTable.AuxiliaryItemDetailID AND
BT_PatientTable.PatientID = PW_PhysicalExaminationChargeBillPatientTable.PatientID INNER JOIN
BT_StaffTable INNER JOIN
PW_ChargeBillTable ON BT_StaffTable.StaffID = PW_ChargeBillTable.Operator_StaffID ON PW_PhysicalExaminationChargeBillPatientTable.ChargeBillID = PW_ChargeBillTable.ChargeBillID
WHERE (1 = 1) AND (PW_ItemCategoryTable.ItemCategoryID = 1) AND (PW_ChargeBillTable.WhetherOrdonnance = 0) AND (PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 0) OR
(PW_ItemCategoryTable.ItemCategoryID = 4) AND (PW_ChargeBillTable.WhetherOrdonnance = 0) AND (PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 0)
UNION
--經過處方的病人
SELECT RTRIM(BT_StaffTable.StaffName) AS StaffName, RTRIM(BT_PatientTable.PatientCardNumber) AS PatientCardNumber, RTRIM(BT_PatientTable.PatientName) AS PatientName,
RTRIM(BT_AttributeDetailsTable.AttributeDetailsName) AS AttributeDetailsName, RTRIM(BT_PatientTable.AS_SexID) AS AS_SexID,RTRIM(PW_AuxiliaryItemDetailTable.
AS_PhysicalExaminationRegisterID) AS AS_PhysicalExaminationRegisterID,RTRIM(BT_AttributeDetailsTable_1.AttributeDetailsID) AS AttributeDetailsID,
RTRIM(BT_AttributeDetailsTable_1.AttributeDetailsName) AS 體檢登記,RTRIM(PW_OrdonnanceTable.OrdonnanceNumber) AS OrdonnanceNumber,
RTRIM(PW_OrdonnanceTable.PatientID) AS PatientID, RTRIM(PW_OrdonnanceTable.TreatmentDoctor_StaffID) AS TreatmentDoctor_StaffID,
RTRIM(PW_AuxiliaryItemDetailTable.OrdonnanceID) AS OrdonnanceID,PW_OrdonnanceTable.PrescriptionDate, RTRIM(0) AS ChargeBillID
FROM BT_StaffTable INNER JOIN
PW_OrdonnanceTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_2 INNER JOIN
BT_AttributeDetailsTable INNER JOIN
BT_PatientTable ON BT_AttributeDetailsTable.AttributeDetailsID = BT_PatientTable.AS_SexID ON BT_AttributeDetailsTable_2.AttributeDetailsID = BT_PatientTable.AS_InsuredTypeID INNER JOIN
BT_MemberCategoryTable ON BT_PatientTable.MemberTypeID = BT_MemberCategoryTable.MemberCategoryID ON PW_OrdonnanceTable.PatientID = BT_PatientTable.PatientID INNER JOIN
PW_AuxiliaryItemDetailTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_1 ON PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID = BT_AttributeDetailsTable_1.AttributeDetailsID INNER JOIN
PW_ItemCategoryTable ON PW_AuxiliaryItemDetailTable.ItemCategoryID = PW_ItemCategoryTable.ItemCategoryID ON
PW_OrdonnanceTable.OrdonnanceID = PW_AuxiliaryItemDetailTable.OrdonnanceID ON BT_StaffTable.StaffID = PW_OrdonnanceTable.TreatmentDoctor_StaffID INNER JOIN
PW_ChargeBillTable ON PW_OrdonnanceTable.OrdonnanceID = PW_ChargeBillTable.OrdonnanceID
WHERE (1 = 1) AND PW_ItemCategoryTable.ItemCategoryID = 1 and PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 1
union
SELECT RTRIM(BT_StaffTable.StaffName) AS StaffName, RTRIM(BT_PatientTable.PatientCardNumber) AS PatientCardNumber, RTRIM(BT_PatientTable.PatientName) AS PatientName,
RTRIM(BT_AttributeDetailsTable.AttributeDetailsName) AS AttributeDetailsName, RTRIM(BT_PatientTable.AS_SexID) AS AS_SexID,
RTRIM(PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID) AS AS_PhysicalExaminationRegisterID, RTRIM(BT_AttributeDetailsTable_1.AttributeDetailsID)
AS AttributeDetailsID, RTRIM(BT_AttributeDetailsTable_1.AttributeDetailsName) AS 體檢登記, RTRIM(PW_OrdonnanceTable.OrdonnanceNumber) AS OrdonnanceNumber,
RTRIM(PW_OrdonnanceTable.PatientID) AS PatientID, RTRIM(PW_OrdonnanceTable.TreatmentDoctor_StaffID) AS TreatmentDoctor_StaffID,
RTRIM(PW_AuxiliaryItemDetailTable.OrdonnanceID) AS OrdonnanceID, PW_OrdonnanceTable.PrescriptionDate, RTRIM(0) AS ChargeBillID
FROM BT_StaffTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_2 INNER JOIN
BT_PatientTable INNER JOIN
BT_AttributeDetailsTable ON BT_PatientTable.AS_SexID = BT_AttributeDetailsTable.AttributeDetailsID INNER JOIN
BT_MemberCategoryTable ON BT_PatientTable.MemberTypeID = BT_MemberCategoryTable.MemberCategoryID ON
BT_AttributeDetailsTable_2.AttributeDetailsID = BT_PatientTable.AS_InsuredTypeID INNER JOIN
PW_ItemCategoryTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_1 INNER JOIN
PW_AuxiliaryItemDetailTable ON BT_AttributeDetailsTable_1.AttributeDetailsID = PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID ON
PW_ItemCategoryTable.ItemCategoryID = PW_AuxiliaryItemDetailTable.ItemCategoryID INNER JOIN
PW_OrdonnanceTable ON PW_AuxiliaryItemDetailTable.OrdonnanceID = PW_OrdonnanceTable.OrdonnanceID ON BT_PatientTable.PatientID = PW_OrdonnanceTable.PatientID ON
BT_StaffTable.StaffID = PW_OrdonnanceTable.TreatmentDoctor_StaffID INNER JOIN
PW_ChargeBillTable ON PW_OrdonnanceTable.OrdonnanceID = PW_ChargeBillTable.OrdonnanceID
WHERE (1 = 1) and PW_ItemCategoryTable.ItemCategoryID = 4 and PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 1 order by 體檢登記
BLL(邏輯層)中的方法:
(分頁也涉及了該BLL中的方法)
#region 體檢病人登記信息表格綁定
[OperationContract]
public DataSet FRM_TiJianDengJi_Main_dgv_PhysicalExaminationRegisterOnYeShu()
{
SqlParameter[] mySqlParameters = {
new SqlParameter("@Type",SqlDbType .Char ),
};
mySqlParameters[0].Value = "FRM_TiJianDengJi_Main_dgv_PhysicalExaminationRegisterOnYeShu ";
DataTable dt = myDALMethod.QueryDataTable("TiJianZhongXin_TiJianDengJi_Main", mySqlParameters);
DataSet ds = new DataSet();
ds.Tables.Add(dt);
return ds;
}
#endregion
UIL(界面層)中的代碼:
//查詢出來所有的病人信息
DataTable dtPhysicalExamination = myFRM_TiJianDengJi_MainClient.FRM_TiJianDengJi_Main_dgv_PhysicalExaminationRegisterOnYeShu().Tables[0];
dgv_PhysicalExaminationRegister.DataSource = dtPhysicalExamination;
UIL中涉及分頁中的界面以及數據表格用到的界面:
2.9.8(圖12)
按鈕Button中界面:點擊上一頁,數據表格中的數據會顯示出來的是前15條數據的內容,點擊下一頁,數據表格中出現的是下15條中的內容
2.9.8(圖12)
注意全局變量以及調用BLL:
BLL醫院管理系統.TiJianZhongXin.FRM_TiJianDengJi_Main.FRM_TiJianDengJi_MainClient myFRM_TiJianDengJi_MainClient =
new BLL醫院管理系統.TiJianZhongXin.FRM_TiJianDengJi_Main.FRM_TiJianDengJi_MainClient();
int pageNum = 1;//默認頁號
int pageSize =15;//默認頁面大小
int pageMaxNum;//最大頁號
int intPhysicalExaminationRegisterID = 0; int intOrdonnanceID = 0;
string strOrdonnanceNumber = ""; int intPatientID = 0;//該病人ID不經過掛號和處方
int intChargeBillID = 0;//體檢登記病人中的收費單ID(病人ID不經過掛號和處方時用)
UIL中涉及分頁的代碼:
//點擊上一頁
private void btn_Next_Click(object sender, EventArgs e)
{
if (pageNum > 1)//若不爲首頁
{
//頁號-1
pageNum--;
this.lblCurrentPage.Text = pageNum.ToString();//當前頁數
//根據頁號和頁面大小獲取數據
SkipPage(pageNum, pageSize);//自定義方法用於頁面跳轉
}
else
{
MessageBox.Show("已經是首頁了!");
}
}
//點擊下一頁
private void btn_Last_Click(object sender, EventArgs e)
{
if (pageNum < pageMaxNum)//若不爲尾頁
{
//頁號+1
pageNum++;
this.lblCurrentPage.Text = pageNum.ToString();//當前頁數
//根據頁號和頁面大小獲取數據
SkipPage(pageNum, pageSize);//自定義方法用於頁面跳轉
}
else
{
MessageBox.Show("已經是尾頁了!");
}
}
void SkipPage(int YeMa,int YeDaXiao)//自定義方法用於頁面跳轉
{
//查詢出來所有的病人信息
DataTable dtPhysicalExamination = myFRM_TiJianDengJi_MainClient.FRM_TiJianDengJi_Main_dgv_PhysicalExaminationRegisterOnYeShu().Tables[0];
dgv_PhysicalExaminationRegister.DataSource = dtPhysicalExamination;
DataTable dt = (DataTable)dgv_PhysicalExaminationRegister.DataSource;//把dgv_PhysicalExaminationRegister的數據源轉化爲表的格式賦值給空表
DataTable ALLPhysicalExaminationMessage = dt.Clone();
for (int i = (YeMa - 1) * YeDaXiao; i <= dtPhysicalExamination.Rows.Count - 1; i++)//根據傳入頁數的大小和頁碼 遍歷獲取dgv_PhysicalExaminationRegister中的數據,
{
if (i == (YeMa - 1) * YeDaXiao + YeDaXiao)//如果獲取的是需要的頁碼和頁大小
{
//就把獲取的頁碼和頁大小綁定到dgv中
dgv_PhysicalExaminationRegister.DataSource = ALLPhysicalExaminationMessage;
BangDingPriceAndItemCategoryName();//自定義方法綁定現金價格和項目類型的值
return;
}
DataRow dr = ALLPhysicalExaminationMessage.NewRow();//對空表添加空白行,並進行對應的賦值
dr["OrdonnanceID"] = dtPhysicalExamination.Rows[i]["OrdonnanceID"];
dr["OrdonnanceNumber"] = dtPhysicalExamination.Rows[i]["OrdonnanceNumber"];
dr["PatientID"] = dtPhysicalExamination.Rows[i]["PatientID"];
dr["TreatmentDoctor_StaffID"] = dtPhysicalExamination.Rows[i]["TreatmentDoctor_StaffID"];
dr["StaffName"] = dtPhysicalExamination.Rows[i]["StaffName"];
dr["PatientCardNumber"] = dtPhysicalExamination.Rows[i]["PatientCardNumber"];
dr["PatientName"] = dtPhysicalExamination.Rows[i]["PatientName"];
dr["AttributeDetailsName"] = dtPhysicalExamination.Rows[i]["AttributeDetailsName"];
dr["AS_SexID"] = dtPhysicalExamination.Rows[i]["AS_SexID"];
dr["AS_PhysicalExaminationRegisterID"] = dtPhysicalExamination.Rows[i]["AS_PhysicalExaminationRegisterID"];
dr["體檢登記"] = dtPhysicalExamination.Rows[i]["體檢登記"];
dr["PrescriptionDate"] = dtPhysicalExamination.Rows[i]["PrescriptionDate"];
dr["ChargeBillID"] = dtPhysicalExamination.Rows[i]["ChargeBillID"];
ALLPhysicalExaminationMessage.Rows.Add(dr);//把空白行添加到空表中去
}
//這裏就把獲取的最後頁碼和最後一個頁大小綁定到dgv中
dgv_PhysicalExaminationRegister.DataSource = ALLPhysicalExaminationMessage;
BangDingPriceAndItemCategoryName();////自定義方法綁定現金價格和項目類型的值
}
病人體檢的項目價格進行累加以及病人體檢的項目進行分類(該分類並沒有在數據庫中進行詳細的分類)所以在界面上自定義方法進行分類:代碼如下:
void BangDingPriceAndItemCategoryName()//自定義方法綁定現金價格個項目類型的值
{
DataTable dt = new DataTable();
for (int i = 0; i < dgv_PhysicalExaminationRegister.Rows.Count; i++)//遍歷循環體檢病人信息
{
int intSelect = 0; decimal decProjectPrice = 0; string strItemCategoryName = "";
int intChuFangID = Convert.ToInt32(dgv_PhysicalExaminationRegister.Rows[i].Cells["處方單ID"].Value);//獲取每一個病人的處方ID
if (intChuFangID != 0)
{
dt = myFRM_TiJianDengJi_MainClient.FRM_TiJianDengJi_Main_dgv_SetMealDetailMessageOnItemCategoryID(intChuFangID).Tables[0];//把每個病人的體檢項目查詢出來
}
else
{
int intBingRenID = Convert.ToInt32(dgv_PhysicalExaminationRegister.Rows[i].Cells["病人ID"].Value);
int intChargeBillID = Convert.ToInt32(dgv_PhysicalExaminationRegister.Rows[i].Cells["收費單ID"].Value);
dt = myFRM_TiJianDengJi_MainClient.FRM_QianTaoShouFei_dgv_SetMealDetailMessageOnItemCategoryID_OtherCharge(intBingRenID, intChargeBillID).Tables[0];//把每個病人的體檢項目查詢出來
}
for (int k = 0; k < dt.Rows.Count; k++)//遍歷病人體檢的項目表
{
if (Convert.ToInt32(dt.Rows[k]["ItemCategoryID"]) == 4)//如果病人體檢項目類型ID = 4
{
intSelect++;//變量累加
strItemCategoryName = dt.Rows[k]["ItemCategoryName"].ToString().Trim();//獲取體檢項目類型
}
else if (Convert.ToInt32(dt.Rows[k]["ItemCategoryID"]) == 1)//如果病人體檢項目類型ID = 1
{
strItemCategoryName = dt.Rows[k]["ItemCategoryName"].ToString().Trim();//獲取體檢項目類型
}
decProjectPrice += Convert.ToDecimal(dt.Rows[k]["ProjectPrice"]);//累加每一個項目的現金價格
}
dgv_PhysicalExaminationRegister.Rows[i].Cells["現金價格"].Value = decProjectPrice;//把某個病人總的項目的現金價格賦值給病人
if (intSelect == dt.Rows.Count)//如果體檢項目類型ID = 4 的變量累加的結果等於該病人的體檢項目的總數
{
dgv_PhysicalExaminationRegister.Rows[i].Cells["項目類型"].Value = strItemCategoryName;//那麼這個病人的體檢項目的類型全部堵是一樣的
}
if (intSelect < dt.Rows.Count && intSelect > 0)//如果體檢項目類型ID = 4 的變量累加的結果小於該病人的體檢項目的總數,並且變量不等於0,說明體檢項目中類型不一樣
{
dgv_PhysicalExaminationRegister.Rows[i].Cells["項目類型"].Value = "項目+ 體檢套餐";
}
else if (intSelect == 0)//如果體檢項目類型ID = 4 的變量爲0說明該病人的體檢項目類型爲全部爲另一種情況
{
dgv_PhysicalExaminationRegister.Rows[i].Cells["項目類型"].Value = strItemCategoryName;
}
}
}
但是該方法有一個不足之處就是,必須在窗體第一次加載時才能運行正常,否則就算執行該代碼,既不會提示報錯,也不會正常運行。只有在這個事件上調用該方法,就能解決這個不足之處:
點擊窗體,右鍵屬性,點擊下圖中的閃電符號,選擇窗體第一次顯示時發生的事件,如下圖:
點擊進去後,在裏面寫調用的代碼就可以了
//窗體第一次顯示時發生
private void FRM_TiJianDengJi_Main_Shown(object sender, EventArgs e)
{
BangDingPriceAndItemCategoryName();//自定義方法綁定現金價格個項目類型的值
}
根據病人姓名或者病人卡號的文本框輸入的值進行查詢對應的病人信息 如下圖:
2.9.8(圖14)
數據庫中的儲存過程爲:
--根據病人姓名或者病人卡號進行查詢對應的病人信息
IF @Type = 'FRM_TiJianDengJi_Main_dgvSetMealDetailMessageOnPainentNameOrNumber'
BEGIN
--不經過處方
SELECT BT_StaffTable.StaffName, BT_PatientTable.PatientCardNumber, BT_PatientTable.PatientName, BT_AttributeDetailsTable_1.AttributeDetailsName, BT_PatientTable.AS_SexID,
PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID, BT_AttributeDetailsTable.AttributeDetailsID, RTRIM(BT_AttributeDetailsTable.AttributeDetailsName) AS 體檢登記, RTRIM('無')
AS OrdonnanceNumber, BT_PatientTable.PatientID, RTRIM(PW_ChargeBillTable.Operator_StaffID) AS TreatmentDoctor_StaffID, RTRIM(0) AS OrdonnanceID,
PW_ChargeBillTable.OperateTime AS PrescriptionDate, PW_PhysicalExaminationChargeBillPatientTable.ChargeBillID
FROM PW_AuxiliaryItemDetailTable INNER JOIN
BT_PatientTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_1 ON BT_PatientTable.AS_SexID = BT_AttributeDetailsTable_1.AttributeDetailsID ON
PW_AuxiliaryItemDetailTable.OrdonnanceID = BT_PatientTable.PatientID INNER JOIN
BT_AttributeDetailsTable ON PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID = BT_AttributeDetailsTable.AttributeDetailsID INNER JOIN
PW_ItemCategoryTable ON PW_AuxiliaryItemDetailTable.ItemCategoryID = PW_ItemCategoryTable.ItemCategoryID INNER JOIN
PW_PhysicalExaminationChargeBillPatientTable ON PW_AuxiliaryItemDetailTable.AuxiliaryItemDetailID = PW_PhysicalExaminationChargeBillPatientTable.AuxiliaryItemDetailID AND
BT_PatientTable.PatientID = PW_PhysicalExaminationChargeBillPatientTable.PatientID INNER JOIN
BT_StaffTable INNER JOIN
PW_ChargeBillTable ON BT_StaffTable.StaffID = PW_ChargeBillTable.Operator_StaffID ON PW_PhysicalExaminationChargeBillPatientTable.ChargeBillID = PW_ChargeBillTable.ChargeBillID
WHERE (1 = 1) AND (PW_ItemCategoryTable.ItemCategoryID = 1) AND (PW_ChargeBillTable.WhetherOrdonnance = 0) AND (PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 0) AND
BT_PatientTable.PatientName LIKE +'%'+RTRIM(LTRIM(@PatientNameOrNumber)) + '%'OR (PW_ItemCategoryTable.ItemCategoryID = 1) AND (PW_ChargeBillTable.WhetherOrdonnance = 0)
AND (PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 0) AND BT_PatientTable.PatientCardNumber LIKE + '%'+RTRIM(LTRIM(@PatientNameOrNumber)) +'%' OR
(PW_ItemCategoryTable.ItemCategoryID = 4) AND (PW_ChargeBillTable.WhetherOrdonnance = 0) AND (PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 0)
AND BT_PatientTable.PatientName LIKE +'%'+RTRIM(LTRIM(@PatientNameOrNumber)) + '%'OR (PW_ItemCategoryTable.ItemCategoryID = 4) AND (PW_ChargeBillTable.WhetherOrdonnance = 0)
AND (PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 0) AND BT_PatientTable.PatientCardNumber LIKE + '%'+RTRIM(LTRIM(@PatientNameOrNumber)) +'%'
--經過處方
UNION
SELECT BT_StaffTable.StaffName, BT_PatientTable.PatientCardNumber, BT_PatientTable.PatientName, BT_AttributeDetailsTable.AttributeDetailsName, BT_PatientTable.AS_SexID,
PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID, BT_AttributeDetailsTable_1.AttributeDetailsID, BT_AttributeDetailsTable_1.AttributeDetailsName AS 體檢登記,
PW_OrdonnanceTable.OrdonnanceNumber, PW_OrdonnanceTable.PatientID, PW_OrdonnanceTable.TreatmentDoctor_StaffID, PW_AuxiliaryItemDetailTable.OrdonnanceID,
PW_OrdonnanceTable.PrescriptionDate, RTRIM(0) AS ChargeBillID
FROM BT_StaffTable INNER JOIN
PW_OrdonnanceTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_2 INNER JOIN
BT_AttributeDetailsTable INNER JOIN
BT_PatientTable ON BT_AttributeDetailsTable.AttributeDetailsID = BT_PatientTable.AS_SexID ON BT_AttributeDetailsTable_2.AttributeDetailsID = BT_PatientTable.AS_InsuredTypeID INNER JOIN
BT_MemberCategoryTable ON BT_PatientTable.MemberTypeID = BT_MemberCategoryTable.MemberCategoryID ON PW_OrdonnanceTable.PatientID = BT_PatientTable.PatientID INNER JOIN
PW_AuxiliaryItemDetailTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_1 ON PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID = BT_AttributeDetailsTable_1.AttributeDetailsID INNER JOIN
PW_ItemCategoryTable ON PW_AuxiliaryItemDetailTable.ItemCategoryID = PW_ItemCategoryTable.ItemCategoryID ON
PW_OrdonnanceTable.OrdonnanceID = PW_AuxiliaryItemDetailTable.OrdonnanceID ON BT_StaffTable.StaffID = PW_OrdonnanceTable.TreatmentDoctor_StaffID INNER JOIN
PW_ChargeBillTable ON PW_OrdonnanceTable.OrdonnanceID = PW_ChargeBillTable.OrdonnanceID
WHERE (1 = 1) AND PW_ItemCategoryTable.ItemCategoryID = 1 AND BT_PatientTable.PatientName LIKE +'%'+RTRIM(LTRIM(@PatientNameOrNumber)) + '%' and PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 1 OR
PW_ItemCategoryTable.ItemCategoryID = 1 AND BT_PatientTable.PatientCardNumber LIKE + '%'+RTRIM(LTRIM(@PatientNameOrNumber)) +'%' and PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 1
union
SELECT RTRIM(BT_StaffTable.StaffName) AS StaffName, RTRIM(BT_PatientTable.PatientCardNumber) AS PatientCardNumber, RTRIM(BT_PatientTable.PatientName) AS PatientName,
RTRIM(BT_AttributeDetailsTable.AttributeDetailsName) AS AttributeDetailsName, RTRIM(BT_PatientTable.AS_SexID) AS AS_SexID,
RTRIM(PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID) AS AS_PhysicalExaminationRegisterID, RTRIM(BT_AttributeDetailsTable_1.AttributeDetailsID) AS AttributeDetailsID,
RTRIM(BT_AttributeDetailsTable_1.AttributeDetailsName) AS 體檢登記, PW_OrdonnanceTable.OrdonnanceNumber, PW_OrdonnanceTable.PatientID, PW_OrdonnanceTable.TreatmentDoctor_StaffID,
PW_AuxiliaryItemDetailTable.OrdonnanceID, PW_OrdonnanceTable.PrescriptionDate, RTRIM(0) AS ChargeBillID
FROM BT_StaffTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_2 INNER JOIN
BT_PatientTable INNER JOIN
BT_AttributeDetailsTable ON BT_PatientTable.AS_SexID = BT_AttributeDetailsTable.AttributeDetailsID INNER JOIN
BT_MemberCategoryTable ON BT_PatientTable.MemberTypeID = BT_MemberCategoryTable.MemberCategoryID ON
BT_AttributeDetailsTable_2.AttributeDetailsID = BT_PatientTable.AS_InsuredTypeID INNER JOIN
PW_ItemCategoryTable INNER JOIN
BT_AttributeDetailsTable AS BT_AttributeDetailsTable_1 INNER JOIN
PW_AuxiliaryItemDetailTable ON BT_AttributeDetailsTable_1.AttributeDetailsID = PW_AuxiliaryItemDetailTable.AS_PhysicalExaminationRegisterID ON
PW_ItemCategoryTable.ItemCategoryID = PW_AuxiliaryItemDetailTable.ItemCategoryID INNER JOIN
PW_OrdonnanceTable ON PW_AuxiliaryItemDetailTable.OrdonnanceID = PW_OrdonnanceTable.OrdonnanceID ON BT_PatientTable.PatientID = PW_OrdonnanceTable.PatientID ON
BT_StaffTable.StaffID = PW_OrdonnanceTable.TreatmentDoctor_StaffID INNER JOIN
PW_ChargeBillTable ON PW_OrdonnanceTable.OrdonnanceID = PW_ChargeBillTable.OrdonnanceID
WHERE (1 = 1) AND PW_ItemCategoryTable.ItemCategoryID = 4 AND BT_PatientTable.PatientName LIKE +'%'+RTRIM(LTRIM(@PatientNameOrNumber)) + '%' and PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 1 OR
PW_ItemCategoryTable.ItemCategoryID = 4 AND BT_PatientTable.PatientCardNumber LIKE + '%'+RTRIM(LTRIM(@PatientNameOrNumber)) +'%'and PW_AuxiliaryItemDetailTable.WhetherOrdonnance = 1 order by 體檢登記 , PatientName
END
BLL中的方法:
//根據病人姓名或者病人卡號進行查詢對應的病人信息
[OperationContract]
public DataSet FRM_TiJianDengJi_Main_dgvSetMealDetailMessageOnPainentNameOrNumber(string strPatientNameOrNumber)
{
SqlParameter[] mySqlParameters = {
new SqlParameter("@Type",SqlDbType .Char ),
new SqlParameter ("@PatientNameOrNumber",SqlDbType .Char ),
};
mySqlParameters[0].Value = "FRM_TiJianDengJi_Main_dgvSetMealDetailMessageOnPainentNameOrNumber ";
mySqlParameters[1].Value = strPatientNameOrNumber;
DataTable dt = myDALMethod.QueryDataTable("TiJianZhongXin_TiJianDengJi_Main", mySqlParameters);
DataSet ds = new DataSet();
ds.Tables.Add(dt);
return ds;
}
UIL中的代碼:
//點擊查詢
private void btn_Inqure_Click(object sender, EventArgs e)
{
string strPatientCardNumberOrName = txt_PatientCardNumberOrName.Text.ToString().Trim();
dgv_PhysicalExaminationRegister.AutoGenerateColumns = false ;//dgv列不可改變
dgv_PhysicalExaminationRegister.DataSource = myFRM_TiJianDengJi_MainClient.FRM_TiJianDengJi_Main_dgvSetMealDetailMessageOnPainentNameOrNumber(strPatientCardNumberOrName).Tables[0];
BangDingPriceAndItemCategoryName();//自定義方法綁定現金價格個項目類型的值
}
運行界面小功能解析:
2.9.8(圖15)
DataGridView表格中的數據部分顏色改變以及dgv點擊單元格顯示數據:
第一步:點擊dgv數據表格,右鍵數組屬性, .找到DGV對應的點擊任意單元格是發生、需要設置單元格內容顯示格式時發生屬性事件 如下圖
第二步:編寫代碼
代碼如下:
//dgv單元格點擊顯示數據
private void dgv_PhysicalExaminationRegister_CellClick(object sender, DataGridViewCellEventArgs e)
{
intPhysicalExaminationRegisterID = Convert.ToInt32(dgv_PhysicalExaminationRegister.CurrentRow.Cells["體檢登記ID"].Value);
txt_PatientName.Text = dgv_PhysicalExaminationRegister.CurrentRow.Cells["病人姓名"].Value.ToString().Trim();
txt_PatientCardNumber.Text = dgv_PhysicalExaminationRegister.CurrentRow.Cells["病人卡號"].Value.ToString().Trim();
intOrdonnanceID = Convert.ToInt32(dgv_PhysicalExaminationRegister.CurrentRow.Cells["處方單ID"].Value);
strOrdonnanceNumber = dgv_PhysicalExaminationRegister.CurrentRow.Cells["處方單號"].Value.ToString().Trim();
intPatientID = Convert.ToInt32(dgv_PhysicalExaminationRegister.CurrentRow.Cells["病人ID"].Value);
txt_RegisterNumber.Text = dgv_PhysicalExaminationRegister.CurrentRow.Cells["處方單號"].Value.ToString().Trim();
cbo_AS_SexID.SelectedValue = Convert.ToInt32(dgv_PhysicalExaminationRegister.CurrentRow.Cells["性別ID"].Value);
cbo_Doctor_StaffID.SelectedValue = Convert.ToInt32(dgv_PhysicalExaminationRegister.CurrentRow.Cells["醫生ID"].Value);
intChargeBillID = Convert.ToInt32(dgv_PhysicalExaminationRegister.CurrentRow.Cells["收費單ID"].Value);
if (intOrdonnanceID == 0)//如果處方ID爲空,即說明該病人不經過處方,而只是體檢(即在體檢中心登記的) 查找該病人的體檢項目
{
dgv_SetMealDetailMessage.DataSource = myFRM_TiJianDengJi_MainClient.FRM_QianTaoShouFei_dgv_SetMealDetailMessageOnItemCategoryID_OtherCharge(intPatientID, intChargeBillID).Tables[0];
}
else
{
//如果處方ID不爲空,即說明該病人經過處方,單擊處方單,獲取該處方單下的體檢項目
dgv_SetMealDetailMessage.DataSource = myFRM_TiJianDengJi_MainClient.FRM_TiJianDengJi_Main_dgv_SetMealDetailMessageOnItemCategoryID(intOrdonnanceID).Tables[0];
}
}
#region dgv中單元格內容顯示格式事件
private void dgv_PhysicalExaminationRegister_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
//遍歷dgv中的行
for (int i = 0; i < dgv_PhysicalExaminationRegister.Rows.Count; i++)
{
//如果dgv中的行的單元格體檢狀態的值爲 == 爲“未登記“
if (dgv_PhysicalExaminationRegister.Rows[i].Cells["體檢狀態"].Value.ToString().Trim() == "未登記")
{
//那麼該單元格體檢狀態的前景色爲紅色
this.dgv_PhysicalExaminationRegister.Rows[i].Cells["體檢狀態"].Style.ForeColor = Color.Red;
}
//又如果dgv中的單元格體檢狀態的值爲 == 爲”登記未執行“
else if (dgv_PhysicalExaminationRegister.Rows[i].Cells["體檢狀態"].Value.ToString().Trim() == "登記未執行")
{
//那麼該但單元格體檢狀態的前景色爲藍色
this.dgv_PhysicalExaminationRegister.Rows[i].Cells["體檢狀態"].Style.ForeColor = Color.Blue;
}
else
{
//那麼該但單元格體檢狀態的前景色爲棕紅色
this.dgv_PhysicalExaminationRegister.Rows[i].Cells["體檢狀態"].Style.ForeColor = Color.DarkRed;
}
dgv_PhysicalExaminationRegister.Rows[i].Cells["現金價格"].Style.ForeColor = Color.Red;
}
}
#endregion
//設置單元格內容顯示格式時發生
private void dgv_SetMealDetailMessage_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
//體檢套餐明細中的現金價格中的值的前景色爲紅色
for (int k = 0; k < dgv_SetMealDetailMessage.Rows.Count; k++)
{
dgv_SetMealDetailMessage.Rows[k].Cells["現金價格1"].Style.ForeColor = Color.Red;
}
}
僅供學習,禁止用於商業用途,否則後果自負