摘要:該文介紹了應用Delphi與SQL數據庫技術,設為生產廠家收集數據的系統。它實現了按生產廠家要求的格式導出其商品的銷售、購進及庫存數據的功能。應用該系統,可以大大減輕操作人員的工作負擔。該系統將對醫藥商業公司為藥品生產廠家提供快速的信息服務具有一定的使用價值。
關鍵詞:Delphi;SQL數據庫;B/S架構;C/S架構
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2010)03-539-03
Based on Delphi and SQL Customer Data Design
WEN Zhen-yong
(Changzhou Pharmaceutical Co., Ltd. Changzhou 213003, China)
Abstract: This article describes the application of Delphi and SQL database technology, designed for manufacturers of data collection systems. It implements the format required by manufacturers to export their goods sales, purchasing and inventory data. Application of the system, can greatly reduce the operator workload. The system will be commercial pharmaceutical companies for drug manufacturers to provide fast information service has a certain value.
Key words: Delphi; SQL Database; B/S Architecture; C/S Architecture
1 概述
隨著計算機應用的普及和藥品生產廠家對藥品流通信息的重視,醫藥領域對信息及時性的要求也越來越高。現在藥品生產廠家希望醫藥商業公司(即:藥品的配送分銷單位)每天上傳自己生產藥品的銷售、購進及庫存信息。通過對這些信息的分析及時了解市場的波動情況,在市場競爭中掌握主動。
近年許多醫藥商業公司通過本公司網站統一上傳數據,由生產廠家訪問網站進行下載接收。但生產廠家為更快速掌握信息,且按照廠家內部格式提交數據,就要求商業公司在本地生成所需數據。生產EXECL文件后再由生產廠家提供的上傳工具逐一發送。對于醫藥商業公司來說,要實現此功能,就必須單獨為生產廠家開發藥品進、銷、存數據信息系統。它的目標是在充分利用現有ERP數據基礎上,為供應商按廠家進行藥品分類,批量產生需要的數據信息,解決手工方式一個個藥品單獨提取的問題。
供應商進銷存數據系統是在C/S架構下采用Delphi技術作為開發平臺。因該數據系統要在公司內部數據提供部門使用,C/S架構相對于B/S架構具有界面豐富、安全性、響應迅速等優點。
2 具體實現方法
該系統的實現過程重點在于SQL數據庫中存儲過程的書寫與Delphi中數據引出功能的設計。編程人員需要非常了解數據源,通過建立表間關聯,從數據源中提取生產廠家的銷售、購進及庫存信息。利用Delphi軟件編寫數據引出功能,要對SaveDialog控件與SaveDBGridEhToExportFile函數有一定了解。下面介紹實現過程并重點介紹這兩個關鍵問題的解決方法,以備大家參考。
1) 建立生產廠家對應商品表,生成藥品查詢基礎信息。
生產廠家對應商品表結構如表1。
ID_DW為生產廠家的單位內碼,ID_SP為對應商品的商品內碼。
通過對應表的設計,將生產廠家信息與商業公司內部流向信息一對多的進行關聯。再運用Delphi工具開發前臺界面,從備添加全部商品目錄中選擇廠家對應的商品并增加到廠家對應的商品目錄表中,用戶界面運行效果如圖1。
2) 在SQL中編寫存儲過程生成要查詢的數據。
在SQL數據庫中取出生產廠家的進銷存數據,這三類數據需根據生產廠家的指定格式進行設計,現以某藥品生產廠家為例,編寫”生產廠家進銷存”的存儲過程。它通過@TYPE變量來控制提取數據的類型。執行三次該存儲過程,依次產生銷售數據、采購數據和庫存數據,作為數據源引出。下面給出該存儲過程的參考代碼。
CREATE PROCEDURE 生產廠家進銷售存 @TYPE AS INT,@MID_DW AS INT,@MBDATE AS VARCHAR(20),@MEDATE AS VARCHAR(20)
/*生產廠家進銷存數據查詢 @TYPE數據類別(購、銷或庫存),@MID_DW 不同供應商*/
/*DYB存生產廠家及對應商品信息表, KPZ 企業內部進、銷數據流向表*/
/*@TYPE=1查詢銷售數據=2采購數據=3庫存數據*/
/* @MID_DW=1 1為某藥品生產廠家的單位內碼 */
AS
IF @TYPE<>3
BEGIN
SELECT RQ,PZHM,ID_DW,ID_SP,GXBJ,SL,ROUND((DJ*KL/100),2) AS DJ,PH,YXQ INTO #TMP10FROM KPZ WHERE RQ BETWEEN @MBDATE AND@MEDATE AND ID_SP IN (SELECTID_SP FROM DYB WHERE ID_DW=@MID_DW)
SELECT A.PZHM,A.ID_DW,A.RQ,B.DWBH,B.DWM,A.SL,A.DJ,A.PH,A.YXQ,A.GXBJ,B.SPBH,B.PM,B.GG,B.DW,
B.CD,B.BZ,B.SCCJ INTO #TMP11 FROM #TMP10 A INNER JOIN DYB B ON A.ID_DW=B.ID_DW ORDER BY B.SPBH,A.RQ
/*刪除非購進,非銷售的數據,并將標志改為中文*/
DELETE #TMP11 WHEREGXBJ<>'XD'AND GXBJ<>'GG'
UPDATE #TMP11 SET GXBJ='購進' WHERE GXBJ='GG'
UPDATE #TMP11 SET GXBJ='銷售' WHERE GXBJ='XD'
/*按照生產廠家要求的特定指定生成數據*/
IF (@MID_DW=1)
BEGIN
IF @TYPE=1
BEGIN
UPDATE #TMP11 SET YXQ=REPLACE(YXQ,'.','-'),RQ=REPLACE(RQ,'.','-')
SELECT PM AS 產品名稱,SPBH AS 產品ID,GG AS 產品規格,PH AS 批號,YXQ AS 產品效期,SL AS 銷售數量,DJ AS 價格,RQ AS 日期,DWM AS 客戶名稱,DWBH AS 客戶ID
FROM #TMP11 WHERE GXBJ='銷售'
END
IF @TYPE=2
BEGIN
UPDATE #TMP11 SET YXQ=REPLACE(YXQ,'.','-'),RQ=REPLACE(RQ,'.','-')
SELECT PM AS 產品名稱,SPBH AS 產品ID,GG AS 產品規格,PH AS 批號,YXQ AS 產品效期,SL AS 采購數量,DJ AS 訂單價格,RQ AS 入庫日期,DWM AS 供應商名稱 FROM #TMP11 WHERE GXBJ='購進' END
END
DROP TABLE #TMP10
DROP TABLE #TMP11
END
/*@TYPE=3 查詢商品庫存情況*/
IF @TYPE=3
BEGIN
SELECT ID_SP,SUM(SL*(CASE WHEN GXBJ='GG' OR GXBJ='SD' THEN 1 ELSE -1 END)) AS SL,PHINTO #TMP20 FROM KPZ WHERE RQ<=@MEDATE AND ID_SPIN SPML GROUP BY ID_SP,PH
SELECT A.*,ISNULL(B.YXQ,' ') AS YXQINTO #TMP21 FROM #TMP20 A LEFT OUTER JOIN(SELECT ID_SP,PH,MAX(YXQ) AS YXQ FROM KPZ WHEREID_SPIN (SELECT ID_SP FROM DYB WHERE ID_DW=@MID_DW) AND RQ<=@MEDATEGROUP BY ID_SP,PH) B ONA.ID_SP=B.ID_SP AND A.PH=B.PH
SELECT A.*,B.SPBH,B.PM,B.GG,B.DW,B.SCCJINTO #TMP22 FROM #TMP21 A INNER JOIN DYB B ON A.ID_SP=B.ID_SP WHERE SL<>0 ORDER BY B.SPBH,A.PH
/*按照生產廠家要求的指定格式生成庫存數據*/
IF (@MID_DW=1)
BEGIN
UPDATE #TMP22 SET YXQ=REPLACE(YXQ,'.','-')
SELECT PM AS 產品名稱,SPBH AS 產品ID,GG AS 產品規格,PH AS 批號,YXQ AS 產品效期,SL AS 庫存數量,(LEFT(@MEDATE,4)+'-'+SUBSTRING(@MEDATE,6,2)+'-'+SUBSTRING(@MEDATE,9,2)) AS 庫存日期,'可銷' AS 庫存狀態 FROM #TMP22
END
DROP TABLE #TMP20
DROP TABLE #TMP21
DROP TABLE #TMP22
END
GO
3) 在Delphi開發平臺上開發數據引出功能。
通過Delphi軟件編寫前臺界面,依次執行該存儲過程。得到廠家進銷存數據后,通過Delphi開發工具進行數據引出。引出EXCEL表格,再通過廠家提供的上傳工具發送給生產廠家。數據引出代碼如下,以備大家參考。
procedure TForm1.ToolButton1Click(Sender: TObject);
var
xlsfilename,mxm:string;
begin
self.SaveDialog1.Title:='保存數據為電子表格形式,請輸入名稱!';
self.SaveDialog1.Filter:='Excle File [*.xls]|*.xls';
self.SaveDialog1.FilterIndex:=0;
self.SaveDialog1.Execute;
xlsFilename:=self.SaveDialog1.FileName;
SaveDBGridEhToExportFile(TDBGridEhExportAsXLS,self.DBGridEh1,xlsFileName+'.xls',True);
end;
庫存數據引出運行效果如如圖2。
限于篇幅有限,這里不再將銷售與采購數據引出執行的圖片顯示給大家。相信大家已經解決了這些基礎問題,在此僅提供一種解決問題的思路。這些功能由程序員設計完成后,對操作人員的要求很低,只需打開程序對應好商品,再逐一取出,引出數據再上傳就可以了。
3 結論
基于Delphi與SQL進行的開發,簡便易行。各企業在ERP系統建設或內部數據信息挖掘中都可以作為開發工具進行應用。通過簡潔的編程就很容易解決了日常工作中單調和繁雜的工作,更有效的提升工作效率。
參考文獻:
[1] 求是科技.Delphi 7數據庫開發技術與工程實踐[M].北京:人民郵電出版社,2004:134-203.
[2] 四維科技,劉山,趙輝.Delphi 系統開發實例精粹[M].北京:人民郵電出版社,2005:165-252.
[3] 肖桂東等.SQL Server 疑難解析[M].北京:電子工業出版社,2003:89-114.
[4] 明日科技,孫明麗,王斌,劉瑩.SQL Server 2005 數據庫系統開發完全手冊[M].北京:人民郵電出版社,2007:156-217.