2.测试环境已搭建好后的探索
2.1 数据库连接信息在KIS安装包的KDPRODUCT\MSDE\setup.ini文件中。SAPWD="kingdee"说明连接采用“SA”账户,密码为“kingdee”。
2.2 根据资料提示,MSDE库是允许局域网范围的链接访问的。访问方式与sqlserver2000一样,用sqlserver的查询分析器就可以访问,也可以用sqlserver的jar包。找到jar包,在Eclipse中建立一个简单的动态网站项目来进行数据访问。
2.3 用select语句通过简单写好的DAO,查询金蝶库中的任意表格数据,得到结果,说明查询管道建立成功。
2.4根据经验,软件都有用户表,用来存放用户的基本数据,因此用SQLServer2008的企业查询分析器直接查看数据库,看看相关的数据结构。简单记录结果如下:
用户库用来存放用户基本信息,包括用户名、密码。当下将用得着的字段罗列如下:
[FName] [varchar](30) NOT NULL 用户名,就是kingdee登陆界面上需要输入的那个用户名。
[FSID] [varchar](255) NULL 密码,就是kingdee登陆界面上需要输入的那个密码,可以为空。在数据库里村的数据是加密以后的密码。空字符串会被加密为“) F ", ,P T #8 *P!D &D 80!N &@ <0 C '< : !M &4 )0 ”;
[FUserID] [smallint] NOT NULL 用户ID,别处会有多处引用。
使用此信息与网上找到的数据字典进行对照,发现有版本差异,但是绝大部分的字段能够在数据字典中得到对应。
2.5根据惠众工作人员提供消息以及需求分析的信息,需要从金蝶数据库提取的数据基本基于它本身的“出库一览表”来进行统计分析。因此决定先用SQLServer2008带的事件查看器抓取“出库一览表”的SQL语句进行分析。
2.6成功抓取“出库一览表”的SQL语句,但是是两句,分别如下:
Select top 20000 u1.FDetailID as FListEntryID,(u1.FQty-u1.FAllHookQTY) as FHookQTY,v1.FVchInterID as FVchInterID,v1.FTranType as FTranType,v1.FInterID as FInterID,u1.FEntryID as FEntryID,case when v1.FCheckerID>0 then 'Y' when v1.FCheckerID<0 then 'Y' else '' end as FCheck,v1.Fdate as Fdate,CASE WHEN u1.FHookStatus=1 THEN 'P' WHEN u1.FHookStatus=2 THEN '√' ELSE '' END as FHookStatus,v1.FBillNo as FBillNo,u1.Fauxqty as Fauxqty,u1.Famount as Famount,v1.FStatus as FStatus,case when (u1.FQtyInvoice-u1.FQty)*sign(v1.FRob)>=0 then '√' else ' ' end as FInvoiced,u1.FAuxQtyInvoice as FAuxQtyInvoice,t30.FName as FBaseUnitID,u1.FAuxQtyMust as FAuxQtyMust,case when (v1.FROB <> 1) then 'Y' else '' end as FRedFlag,u1.FConsignAmount as FConsignAmount,u1.FSecQty as FSecQty,case when v1.FCancellation=1 then 'Y' else '' end as FCancellation,u1.FDiscountAmount as FDiscountAmount from ICStockBill v1 INNER JOIN ICStockBillEntry u1 ON v1.FInterID = u1.FInterID AND u1.FInterID <>0
INNER JOIN t_Organization t4 ON v1.FSupplyID = t4.FItemID AND t4.FItemID <>0
LEFT OUTER JOIN t_SubMessage t7 ON v1.FSaleStyle = t7.FInterID AND t7.FInterID <>0
INNER JOIN t_Stock t8 ON u1.FDCStockID = t8.FItemID AND t8.FItemID <>0
LEFT OUTER JOIN t_Emp t9 ON v1.FFManagerID = t9.FItemID AND t9.FItemID <>0
LEFT OUTER JOIN t_Emp t10 ON v1.FSManagerID = t10.FItemID AND t10.FItemID <>0
INNER JOIN t_User t11 ON v1.FBillerID = t11.FUserID AND t11.FUserID <>0
INNER JOIN t_ICItem t14 ON u1.FItemID = t14.FItemID AND t14.FItemID <>0
INNER JOIN t_MeasureUnit t17 ON u1.FUnitID = t17.FItemID AND t17.FItemID <>0
LEFT OUTER JOIN t_User t24 ON v1.Fcheckerid = t24.FUserID AND t24.FUserID <>0
INNER JOIN t_MeasureUnit t30 ON t14.FUnitID = t30.FItemID AND t30.FItemID <>0
LEFT OUTER JOIN t_SubMessage t40 ON v1.FMarketingStyle = t40.FInterID AND t40.FInterID <>0
LEFT OUTER JOIN v_ICTransType t70 ON u1.FSourceTranType = t70.FID AND t70.FID <>0
LEFT OUTER JOIN ICVoucherTpl t13 ON v1.FActualVchTplID = t13.FInterID AND t13.FInterID <>0
LEFT OUTER JOIN t_Department t105 ON v1.FDeptID = t105.FItemID AND t105.FItemID <>0
LEFT OUTER JOIN t_Emp t106 ON v1.FEmpID = t106.FItemID AND t106.FItemID <>0
LEFT OUTER JOIN t_AuxItem t112 ON u1.FAuxPropID = t112.FItemid AND t112.FItemid <>0
LEFT OUTER JOIN t_MeasureUnit t500 ON t14.FStoreUnitID = t500.FItemID AND t500.FItemID <>0
LEFT OUTER JOIN t_Currency t503 ON v1.FCurrencyID = t503.FCurrencyID AND t503.FCurrencyID <>0
LEFT OUTER JOIN ZPStockBill t523 ON v1.FInterID = t523.FRelateBillInterID AND t523.FRelateBillInterID <>0
LEFT OUTER JOIN t_MeasureUnit t552 ON t14.FSecUnitID = t552.FItemID AND t552.FItemID <>0
where 1=1 AND (v1.FTranType=21 AND (v1.FROB=1 and v1.FCancellation = 0)) order by v1.FInterID,u1.FEntryID
第二个:
select top 40 u1.FDetailID AS FListEntryID,'' AS FSel,t13.FName AS FActualVchTplName,v1.FPlanVchTplID AS FPlanVchTplID,v1.FActualVchTplID AS FActualVchTplID,(u1.FQty-u1.FAllHookQTY) AS FHookQTY,v1.FSupplyID AS FSupplyID,v1.FVchInterID AS FVchInterID,v1.FTranType AS FTranType,v1.FInterID AS FInterID,u1.FEntryID AS FEntryID,v1.Fdate AS Fdate,case when v1.FCheckerID>0 then 'Y' when v1.FCheckerID<0 then 'Y' else '' end AS FCheck,case when v1.FCancellation=1 then 'Y' else '' end AS FCancellation,v1.FBillNo AS FBillNo,t7.FName AS FSaleStyleName,t4.FName AS FSupplyIDName,t8.FName AS FDCStockIDName,t14.FNumber AS FFullNumber,t14.Fname AS FItemName,t14.Fmodel AS FItemModel,t17.FName AS FUnitIDName,u1.FBatchNo AS FBatchNo,u1.Fauxqty AS Fauxqty,u1.Fauxprice AS Fauxprice,u1.Famount AS Famount,t9.FName AS FFManagerIDName,t10.FName AS FSManagerIDName,t11.FName AS FuserName,t24.FName AS FCheckerName,t4.FItemID AS FCustID,case when v1.FVchInterID>0 then 'Y' when v1.FVchInterID<0 then 'Y' else '' end AS FVoucherStatus,u1.FNote AS FNote,(SELECT (SELECT FName FROM t_VoucherGroup WHERE FGroupID=t_Voucher.FGroupID)+'-'+CONVERT(Varchar(30),FNumber) FROM t_Voucher WHERE FVoucherid=v1.FVchInterID) AS FVoucherNumber,CASE WHEN u1.FHookStatus=1 THEN 'P' WHEN u1.FHookStatus=2 THEN '√' ELSE '' END AS FHookStatus,t40.FName AS FMarketingStyleName,v1.FMarketingStyle AS FMarketingStyle,u1.FOrderBillNo AS FOrderBillNo,u1.FSourceBillNo AS FSourceBillNo,t70.FName AS FSourceTranType,t105.FName AS FDeptIDName,t106.FName AS FEmpIDName,v1.FExplanation AS FExplanation,v1.FFetchAdd AS FFetchAdd, (CASE t112.FName WHEN '*' THEN '' ELSE t112.FName END) AS FAuxPropIDName,t14.FQtyDecimal AS FQtyDecimal,t14.FPriceDecimal AS FPriceDecimal,v1.FOrgBillInterID AS FOrgBillInterID,v1.FStatus AS FStatus,case when (v1.FOrgBillInterID <> 0) then 'Y' else null end AS FHasSplitBill,case when (u1.FQtyInvoice-u1.FQty)*sign(v1.FRob)>=0 then '√' else ' ' end AS FInvoiced,u1.FAuxQtyInvoice AS FAuxQtyInvoice,t30.FName AS FBaseUnitID,u1.FAuxQtyMust AS FAuxQtyMust,Case WHEN t14.FStoreUnitID=0 THEN '' Else t500.FName end AS FCUUnitName,Case When v1.FCurrencyID is Null Or v1.FCurrencyID='' then (Select FScale From t_Currency Where FCurrencyID=1) else t503.FScale end AS FAmountDecimal,case when (v1.FROB <> 1) then 'Y' else '' end AS FRedFlag,t523.FBillNo AS FZPBillNo,u1.FConsignPrice AS FConsignPrice,u1.FConsignAmount AS FConsignAmount,CASE WHEN v1.FTranStatus=1 THEN 'Y' ELSE '' END AS FTranStatus,t552.FName AS FSecUnitName,u1.FSecCoefficient AS FSecCoefficient,u1.FSecQty AS FSecQty,u1.FDiscountRate AS FDiscountRate,u1.FDiscountAmount AS FDiscountAmount from ICStockBill v1 INNER JOIN ICStockBillEntry u1 ON v1.FInterID = u1.FInterID AND u1.FInterID <>0
INNER JOIN t_Organization t4 ON v1.FSupplyID = t4.FItemID AND t4.FItemID <>0
LEFT OUTER JOIN t_SubMessage t7 ON v1.FSaleStyle = t7.FInterID AND t7.FInterID <>0
INNER JOIN t_Stock t8 ON u1.FDCStockID = t8.FItemID AND t8.FItemID <>0
LEFT OUTER JOIN t_Emp t9 ON v1.FFManagerID = t9.FItemID AND t9.FItemID <>0
LEFT OUTER JOIN t_Emp t10 ON v1.FSManagerID = t10.FItemID AND t10.FItemID <>0
INNER JOIN t_User t11 ON v1.FBillerID = t11.FUserID AND t11.FUserID <>0
INNER JOIN t_ICItem t14 ON u1.FItemID = t14.FItemID AND t14.FItemID <>0
INNER JOIN t_MeasureUnit t17 ON u1.FUnitID = t17.FItemID AND t17.FItemID <>0
LEFT OUTER JOIN t_User t24 ON v1.Fcheckerid = t24.FUserID AND t24.FUserID <>0
INNER JOIN t_MeasureUnit t30 ON t14.FUnitID = t30.FItemID AND t30.FItemID <>0
LEFT OUTER JOIN t_SubMessage t40 ON v1.FMarketingStyle = t40.FInterID AND t40.FInterID <>0
LEFT OUTER JOIN v_ICTransType t70 ON u1.FSourceTranType = t70.FID AND t70.FID <>0
LEFT OUTER JOIN ICVoucherTpl t13 ON v1.FActualVchTplID = t13.FInterID AND t13.FInterID <>0
LEFT OUTER JOIN t_Department t105 ON v1.FDeptID = t105.FItemID AND t105.FItemID <>0
LEFT OUTER JOIN t_Emp t106 ON v1.FEmpID = t106.FItemID AND t106.FItemID <>0
LEFT OUTER JOIN t_AuxItem t112 ON u1.FAuxPropID = t112.FItemid AND t112.FItemid <>0
LEFT OUTER JOIN t_MeasureUnit t500 ON t14.FStoreUnitID = t500.FItemID AND t500.FItemID <>0
LEFT OUTER JOIN t_Currency t503 ON v1.FCurrencyID = t503.FCurrencyID AND t503.FCurrencyID <>0
LEFT OUTER JOIN ZPStockBill t523 ON v1.FInterID = t523.FRelateBillInterID AND t523.FRelateBillInterID <>0
LEFT OUTER JOIN t_MeasureUnit t552 ON t14.FSecUnitID = t552.FItemID AND t552.FItemID <>0
where 1=1 AND (v1.FTranType=21 AND (v1.FROB=1 and v1.FCancellation = 0)) and ( (v1.FInterID=1944 and u1.FEntryID=12) or (v1.FInterID=1944 and u1.FEntryID=13) or (v1.FInterID=1946 and u1.FEntryID=1) or (v1.FInterID=1946 and u1.FEntryID=2) or (v1.FInterID=1946 and u1.FEntryID=3) or (v1.FInterID=1948 and u1.FEntryID=1) or (v1.FInterID=1948 and u1.FEntryID=2) or (v1.FInterID=1948 and u1.FEntryID=3) or (v1.FInterID=1948 and u1.FEntryID=4) or (v1.FInterID=1948 and u1.FEntryID=5) or (v1.FInterID=1948 and u1.FEntryID=6) or (v1.FInterID=1948 and u1.FEntryID=7) or (v1.FInterID=1948 and u1.FEntryID=8) or (v1.FInterID=1948 and u1.FEntryID=9) or (v1.FInterID=1948 and u1.FEntryID=10) or (v1.FInterID=1949 and u1.FEntryID=1) or (v1.FInterID=1950 and u1.FEntryID=1) or (v1.FInterID=1950 and u1.FEntryID=2) or (v1.FInterID=1950 and u1.FEntryID=3) or (v1.FInterID=1950 and u1.FEntryID=4) or (v1.FInterID=1950 and u1.FEntryID=5) or (v1.FInterID=1950 and u1.FEntryID=6) or (v1.FInterID=1950 and u1.FEntryID=7) or (v1.FInterID=1951 and u1.FEntryID=1) or (v1.FInterID=1957 and u1.FEntryID=1) or (v1.FInterID=1957 and u1.FEntryID=2) or (v1.FInterID=1957 and u1.FEntryID=3) or (v1.FInterID=1957 and u1.FEntryID=4) or (v1.FInterID=1958 and u1.FEntryID=1) or (v1.FInterID=1958 and u1.FEntryID=2) or (v1.FInterID=1958 and u1.FEntryID=3) or (v1.FInterID=1958 and u1.FEntryID=4) or (v1.FInterID=1958 and u1.FEntryID=5) or (v1.FInterID=1958 and u1.FEntryID=6) or (v1.FInterID=1958 and u1.FEntryID=7) or (v1.FInterID=1958 and u1.FEntryID=8) or (v1.FInterID=1958 and u1.FEntryID=9) or (v1.FInterID=1960 and u1.FEntryID=1)) order by v1.FInterID,u1.FEntryID