張未未,馬星光
(北京中醫(yī)藥大學(xué)信息中心,北京 100029)
配伍是中醫(yī)用藥的特點。《本經(jīng)》提出的“七情”為中藥配伍理論的總綱,指中藥配伍關(guān)系的7 個方面,包括單行、相須、相使、相殺、相惡、相反、相畏[1]?!跋喾础敝饕杆幮灾卓梗? 種藥物合用后,會產(chǎn)生毒性反應(yīng)或強烈的副作用,被視為配伍禁忌,如:半夏、法半夏、川貝母、湖北貝母、浙貝母、伊貝母、平貝母、瓜蔞、瓜蔞子、炒瓜蔞子、瓜蔞皮、天花粉、白及、白蘞、不宜與烏頭類藥材同用;“相畏”最初的含義是毒性被制約,與“相殺”并提,后發(fā)生衍變,常與“相惡”并提,含有性能被制約之意,亦常作為禁忌,如人參與五靈脂不宜配伍使用。此后,中藥配伍禁忌歸納為“十八反”、“十九畏”,并編成歌訣而廣為流傳[2]。
“十八反”在理論上雖屬于配伍禁忌,但從古到今的臨床實踐中,都有破禁的復(fù)方記載和使用,用于治療疑難雜?。?]。雖然現(xiàn)代臨床實踐的破禁運用不在少數(shù),但臨床工作人員還是盡量避免應(yīng)用。這主要是因為“十八反”機理不清,缺少理論上、法律上的支持。若想在臨床中應(yīng)用相反藥對配伍,則醫(yī)生須簽字蓋章,負完全責(zé)任。本文通過Access 數(shù)據(jù)宏的使用,實現(xiàn)在中藥組方過程中“相反”、“相畏”藥物的自動甄別,以提示醫(yī)生注意相關(guān)藥物的配伍使用。由于存在“相反”、“相畏”的藥對并不絕對禁止使用,因此本應(yīng)用不會限制醫(yī)生進行相關(guān)配伍。
由于數(shù)據(jù)宏是由表事件觸發(fā)而執(zhí)行的,因此也可以稱之為“事件驅(qū)動的數(shù)據(jù)宏”,其功能類似于大型數(shù)據(jù)庫中的DML 觸發(fā)器[4-5]。每當(dāng)在表中添加、更新或刪除數(shù)據(jù)時,都會發(fā)生對應(yīng)的表事件,數(shù)據(jù)宏可以在發(fā)生這3 種事件中的任何一種事件之后,或在發(fā)生刪除或更改事件之前運行。數(shù)據(jù)宏是自Access 2010以來的后續(xù)版本中添加的新功能,是對Access 數(shù)據(jù)庫在功能上的重大完善。
Access 中,數(shù)據(jù)宏按照被激活的時機不同,分為前期事件數(shù)據(jù)宏和后期事件數(shù)據(jù)宏。如圖1 所示是在Access 2013 中數(shù)據(jù)宏的添加位置。
圖1 數(shù)據(jù)宏的分類
前期事件數(shù)據(jù)宏中宏操作在數(shù)據(jù)修改事件發(fā)生、但還未保存之前被觸發(fā)執(zhí)行,用以實現(xiàn)數(shù)據(jù)修改的完整性邏輯驗證[6]。前期事件數(shù)據(jù)宏中可以決定數(shù)據(jù)是否允許被真正修改,還是顯示錯誤以停止修改。
前期事件數(shù)據(jù)宏根據(jù)觸發(fā)的事件不同又可以分為更改(Update)前數(shù)據(jù)宏和刪除(Delete)前數(shù)據(jù)宏。
1)更改前數(shù)據(jù)宏。
更改前數(shù)據(jù)宏在記錄更改動作發(fā)生且保存記錄之前運行,通常用來進行邏輯驗證,以決定記錄是否允許被修改或顯示錯誤以停止修改。
2)刪除前數(shù)據(jù)宏。
刪除前數(shù)據(jù)宏在記錄刪除動作發(fā)生且記錄被真正刪除之前運行,通常用來進行邏輯驗證,以決定記錄是否允許被刪除或顯示錯誤以停止刪除。
后期事件數(shù)據(jù)宏中宏操作在數(shù)據(jù)修改事件發(fā)生,且修改已保存之后被觸發(fā)執(zhí)行,用以實現(xiàn)數(shù)據(jù)表中不同字段以及不同數(shù)據(jù)表間數(shù)據(jù)的連動更新[7]。
后期事件數(shù)據(jù)宏根據(jù)觸發(fā)的事件不同又可以分為插入(Insert)后數(shù)據(jù)宏、更新(Update)后數(shù)據(jù)宏和刪除(Delete)后數(shù)據(jù)宏[8]。
1)插入后數(shù)據(jù)宏。
插入后數(shù)據(jù)宏是指在新記錄被添加到表后所運行的邏輯。
2)更新后數(shù)據(jù)宏。
更新后數(shù)據(jù)宏是指在現(xiàn)有記錄被更改后所運行的邏輯。
3)刪除后數(shù)據(jù)宏。
刪除后數(shù)據(jù)宏是指在記錄被刪除后所運行的邏輯。
[舊]或[Old]記錄集:該記錄集用于臨時保存表中被更改或刪除的記錄在更改或刪除前的值??梢酝ㄟ^[舊].[FieldName]來獲取該記錄不同字段的“舊”值。該對象通常用于更新后數(shù)據(jù)宏和刪除后數(shù)據(jù)宏[9]。
Updated(“Field Name”)函數(shù)用來判斷某個字段的值是否已更改。該函數(shù)通常用于更新后數(shù)據(jù)宏,可用于區(qū)分在不同字段值被更新后選擇執(zhí)行不同的宏操作[10]。
表1 為數(shù)據(jù)宏常用操作[11-13]。
表1 數(shù)據(jù)宏常用操作
如圖2 所示,為Access 數(shù)據(jù)庫中用于存放處方的數(shù)據(jù)表,表名“Tbl 處方組成”(注:表中處方并不具有真實性,請勿使用)。該表中以不同掛號ID 來區(qū)分不同的藥方,同一掛號ID 下的不同記錄代表同一處方的不同中藥組成。
圖2 “Tbl 處方組成”表
當(dāng)在某一處方中添加藥物時,會自動將該中藥與藥方中已有中藥進行對比,找出與新加入藥物存在“相反”或“相畏”的藥物,并將相應(yīng)信息添加在表中的“藥方中的反藥畏藥”字段中。如圖3 所示,當(dāng)添加“附子”后,“藥方中的反藥畏藥”字段會自動添加“浙貝母(反)半夏(反)”數(shù)據(jù),這是由數(shù)據(jù)宏自動甄別而完成的數(shù)據(jù)操作。
圖3 “相反”或“相畏”藥對自動甄別后的效果
另外,醫(yī)生在組方的過程中,難免會對已開具藥物進行調(diào)換或刪除。因此當(dāng)對藥物進行更新或刪除的操作時,數(shù)據(jù)宏也會完成相應(yīng)的甄別工作,來完成表中“藥方中的反藥畏藥”字段的數(shù)據(jù)修改。要實現(xiàn)以上效果,需為“Tbl 處方組成”表添加“插入后”、“更新后”和“刪除后”3 個數(shù)據(jù)宏。之所以選擇后期事件數(shù)據(jù)宏,是因為在對藥對進行相反或相畏甄別后,并不禁止醫(yī)生開具相應(yīng)藥物,只是以說明的形式進行備注以示提醒。
如圖4 所示,列出了數(shù)據(jù)庫中主要數(shù)據(jù)表之間的關(guān)系。
圖4 數(shù)據(jù)庫中主要數(shù)據(jù)表間關(guān)系圖
各數(shù)據(jù)表功能如表2 所示。
表2 數(shù)據(jù)庫中主要數(shù)據(jù)表功能描述
“Tbl 十八反十九畏”表中示例數(shù)據(jù)如圖5 所示。當(dāng)處方中新的藥物被開具后,可根據(jù)該表所保存反藥或畏藥藥對信息來甄別同一處方中是否出現(xiàn)相反或相畏的藥物。該表可以根據(jù)使用者經(jīng)驗進行藥對的添加或刪減。
圖5 “Tbl 十八反十九畏”表數(shù)據(jù)示例
插入后數(shù)據(jù)宏負責(zé)完成在處方中添加新藥時對可能出現(xiàn)的“相反”或“相畏”藥對的甄別。Access 2013 中所添加的宏操作代碼如圖6 所示。
圖6 插入后數(shù)據(jù)宏代碼
1)圖6 中變量“medicine”用于保存藥方中與當(dāng)前所添加的新藥存在“相反”或“相畏”關(guān)系的已經(jīng)開具的藥物名稱;變量“Insertmedicine”用于保存當(dāng)前所添加新藥的中藥ID;變量“CurrentID”用于保存當(dāng)前處方所屬的掛號ID。
2)代碼中的“對于所選對象中的每個記錄”對應(yīng)于常用數(shù)據(jù)宏操作中的“ForEachRecord”命令;“查找所選對象中的記錄”對應(yīng)于“LookupRecord”命令。在Access 2013 中文版中這2 個命令會以中文形式表述[14]。
圖6 所示代碼實現(xiàn)思路為:在對添加新藥的處方中依次遍歷每味已開具的中藥,將遍歷到的中藥放到“Tbl 十八反十九畏”數(shù)據(jù)表中查看是否與所添加新藥存在“相反”或“相畏”的關(guān)系。如果存在則將該中藥保存在“medicine”變量中。當(dāng)遍歷結(jié)束后,“medicine”變量中將保存所有與添加新藥存在“相反”或“相畏”關(guān)系的中藥藥名,并將“medicine”變量的值保存入新藥記錄的“藥方中的反藥畏藥”字段中。
更新后數(shù)據(jù)宏負責(zé)完成在處方中藥物進行更改時可能出現(xiàn)的“相反”或“相畏”藥對的甄別。具體過程分為2 步:
1)對更新后的新藥在藥方中尋找具有“相反”或“相畏”關(guān)系的藥對。宏操作代碼如圖7 所示,實現(xiàn)思路類似于4.3 節(jié)圖6 所示代碼,不再贅述。
圖7 更新后數(shù)據(jù)宏代碼部分—1
圖7 中使用Updated(“中藥ID”)操作用于判斷是否是中藥ID 字段被更新。如果是其他字段更新則該數(shù)據(jù)宏將不會繼續(xù)執(zhí)行。
2)將更改前的藥物已建立的“相反”或“相畏”關(guān)系的藥對信息從處方中相關(guān)藥物的“藥方中的反藥畏藥”字段中進行刪除。宏操作代碼如圖8 所示。
圖8 更新后數(shù)據(jù)宏代碼部分—2
圖8 中,公式(1)表示:
值=Left([處方組成].[藥方中的反藥畏藥],InStr([處方組成].[藥方中的反藥畏藥],[Delmedicine])-1)& Right([處方組成].[藥方中的反藥畏藥],Len([處方組成].[藥方中的反藥畏藥])-(InStr([處方組成].[藥方中的反藥畏藥],[Delmedicine])+Len([Delmedicine])+3))(1)
[舊].[中藥ID]用以獲得更改前的中藥ID,并將由此中藥ID 所對應(yīng)的藥名保存在“Delmedicine”變量中。
圖8 所示代碼實現(xiàn)思路為:遍歷所操作處方中其他未更改藥物,若發(fā)現(xiàn)有藥物的“藥方中的反藥畏藥”字段中存在“Delmedicine”變量所存藥名,則將該藥名從字段中刪除。
刪除后數(shù)據(jù)宏負責(zé)完成在刪除處方中某味中藥時,更改其他藥物與該中藥之前所建立的“相反”或“相畏”關(guān)系信息。所添加的宏操作代碼如圖9 所示。
圖9 刪除后數(shù)據(jù)宏代碼
圖9 所示代碼與4.4 節(jié)圖8 所示代碼實現(xiàn)思路類似,不再贅述。
在數(shù)據(jù)宏功能出現(xiàn)之前,要實現(xiàn)本文所介紹的“相反”或“相畏”藥物的自動甄別功能,通常會以添加Access 窗體對象或以第三方開發(fā)語言建立操作界面的方式,通過窗體或窗體控件事件的觸發(fā)來執(zhí)行藥對間判別以及數(shù)據(jù)寫入的VBA 代碼或第三方開發(fā)語言代碼。這種方法需要對程序設(shè)計語言具有一定程度的掌握,而且往往會涉及ADO(ActiveX Data Objects)編程,因此實現(xiàn)起來較為復(fù)雜[15]。由于存在窗體(前端)與數(shù)據(jù)庫(后臺)中不同數(shù)據(jù)表之間的頻繁數(shù)據(jù)交換,從而導(dǎo)致執(zhí)行效率不高。
由于數(shù)據(jù)宏類似于大型數(shù)據(jù)庫中的觸發(fā)器,因此采用數(shù)據(jù)宏的實現(xiàn)方法,對于表操作事件的觸發(fā)及宏操作的執(zhí)行始終處于數(shù)據(jù)庫(后臺)層中運行,從而省去了與前端窗體的數(shù)據(jù)交換過程,執(zhí)行效率更高[16]。而且數(shù)據(jù)宏中的基本操作書寫較程序設(shè)計語言簡單,易于學(xué)習(xí),比較適合Access 數(shù)據(jù)庫初中級使用者掌握。本文之所以選取Access 數(shù)據(jù)庫,正是因為該產(chǎn)品簡單易用的特性使其在非計算機專業(yè)人員特別是醫(yī)務(wù)工作者中具有廣泛的使用人群。而數(shù)據(jù)宏功能的出現(xiàn)極大地豐富了Access 數(shù)據(jù)庫軟件的功能,從某種程度來講,可以比肩專業(yè)的數(shù)據(jù)庫工具。
本文介紹了將Access 數(shù)據(jù)宏用于中藥組方中對于“相反”或“相畏”藥對的自動甄別的實現(xiàn)方法。數(shù)據(jù)宏是自Access 2010 版本后新增的宏對象類型,其功能類似于大型數(shù)據(jù)庫中的觸發(fā)器,是對Access 數(shù)據(jù)庫特別是表對象功能的極大補充,彌補了表對象在過程型數(shù)據(jù)完整性約束功能實現(xiàn)上的不足[17]。但目前介紹數(shù)據(jù)宏實際應(yīng)用的文獻還比較少,本文所介紹的方法也為在Access 數(shù)據(jù)庫中相似問題的解決提供了一定的思路及實現(xiàn)途徑。
[1]唐于平,吳起成,丁安偉,等.對中藥“十八反”、“十九畏”的現(xiàn)狀認識[J].中國實驗方劑學(xué)雜志,2009,15(6):79-81.
[2]范欣生,段金廒,王中越,等.“十八反”結(jié)構(gòu)形式上的中藥配伍禁忌研究[J].中醫(yī)雜志,2012,53(16):1360-1364.
[3]左艇,范欣生,蔣辰雪,等.基于數(shù)據(jù)挖掘?qū)Α笆朔础彼幬锱R床應(yīng)用的調(diào)查研究[J].中華中醫(yī)藥雜志,2015,30(5):1601-1603.
[4]王珊,薩師煊.數(shù)據(jù)庫系統(tǒng)概論[M].4 版.北京:高等教育出版社,2008.
[5]褚龍現(xiàn).DML 觸發(fā)器保持數(shù)據(jù)庫完整性應(yīng)用研究[J].計算機與現(xiàn)代化,2013(4):57-59.
[6]胡鶴年.SQL Server 觸發(fā)器在數(shù)據(jù)庫設(shè)計中的應(yīng)用[J].數(shù)據(jù)庫與信息管理,2012(8):37-38,83.
[7]劉維學(xué).對SQL Server 數(shù)據(jù)庫觸發(fā)器的深入研究[J].計算機技術(shù)與發(fā)展,2013,23(10):48-51.
[8]邢為民,董衛(wèi)軍,索琦.數(shù)據(jù)庫原理與實踐(Access 2013)[M].2 版.北京:電子工業(yè)出版社,2015.
[9]Ken Getz.在Access 2010 應(yīng)用程序中使用數(shù)據(jù)宏為數(shù)據(jù)附加邏輯[EB/OL].http://msdn.microsoft.com/zhcn/library/ff973807(v=office.14).aspx,2015-03-09.
[10]張未未,郭鳳英,韓愛慶.基于多種類型宏的Access 數(shù)據(jù)庫登錄身份驗證系統(tǒng)[J].計算機與現(xiàn)代化,2015(5):121-126.
[11]馬星光,劉仁權(quán).Access 2010 中醫(yī)藥數(shù)據(jù)庫實例教程[M].北京:中國中醫(yī)藥出版社,2012.
[12]科教工作室.Access 2010 數(shù)據(jù)庫應(yīng)用[M].2 版.北京:清華大學(xué)出版社,2011:137-138.
[13]于繁華,李民.Access 基礎(chǔ)教程[M].4 版.北京:中國水利水電出版社,2013:185-186.
[14]易葉青,闕清賢.Access 2010 數(shù)據(jù)庫應(yīng)用技術(shù)[M].北京:中國水利水電出版社,2014:55-76.
[15]汪星輝.基于Access 的教務(wù)管理系統(tǒng)的設(shè)計與應(yīng)用[J].計算機光盤軟件與應(yīng)用,2013(20):282-284.
[16]徐寶中.基于Access 和SQL Server 數(shù)據(jù)庫的項目成本管理系統(tǒng)[J].電腦開發(fā)與應(yīng)用,2014,27(6):71-74.
[17]王莉.Access 數(shù)據(jù)庫中數(shù)據(jù)完整性的實現(xiàn)[J].中國科技創(chuàng)新導(dǎo)刊,2013(1):181.