Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 9718|回复: 14

大师帮忙啊,EXCEL直接从后台ORACLE数据库取数生成会计报表!

[复制链接]
发表于 2012-1-14 14:02 | 显示全部楼层 |阅读模式
本帖最后由 hxj710802 于 2012-1-14 14:16 编辑

前大多数财务软件都有电子报表模块,但生成的报表数据只能导出到EXCLEL中为静态数据,不能动态引用,小生试图绕过财务软件客户端,通过一定工具截获客户端发送到后台ORACLE数据库的生成科目余额表的SQL语句,在PL/SQL 工具软件中测试通过,生成的报表和在财务软件客户端中生成的完全一样.

  现在我想在EXCEL中直接生成科目余额表,利用引入外部数据功能结合MS QUERY 工具可以实现,但SQL语句中 '起始日期,结束日期,科目编码 '这三个常量无法从EXCEL单元格中取数.

不知用VBA 方式能不能解决?

附:1.截获SQL语句的工具
    2.操作具体流程的截图
 楼主| 发表于 2012-1-14 14:03 | 显示全部楼层

启动追踪器和财务软件

本帖最后由 hxj710802 于 2012-1-14 14:45 编辑

1.PNG








回复

使用道具 举报

 楼主| 发表于 2012-1-14 14:04 | 显示全部楼层
本帖最后由 hxj710802 于 2012-1-14 14:47 编辑

点击财务软件命令"会计科目余额表"

2.1.PNG


财务软件客户端生成的科目余额表:

4.PNG




回复

使用道具 举报

 楼主| 发表于 2012-1-14 14:07 | 显示全部楼层
本帖最后由 hxj710802 于 2012-1-14 14:48 编辑


查看下ORACLE追踪器,里边已经截获了财务软件客户端发送到后台ORACLE数据库的SQL语句,找下吧,一般以SELECT开头并且字符量最大的那句就是了..

5.PNG


选中代码CTRL+C,复制下来:

6.PNG

回复

使用道具 举报

 楼主| 发表于 2012-1-14 14:08 | 显示全部楼层
本帖最后由 hxj710802 于 2012-1-14 14:49 编辑

在ORACLE工具 PL/SQL中验证取得的SQL代码生成的报表数据是否和财务软件客户端生成的一样:
启动PL/SQL工具,用户名是GADATA0011,口令填上,数据库是ORADB
2.2.PNG




在SQL程序窗口中粘贴上刚才复制来的SQL代码,并运行
得出的报表数据和财务软件生成的完全一样:


8.PNG





回复

使用道具 举报

 楼主| 发表于 2012-1-14 14:09 | 显示全部楼层
本帖最后由 hxj710802 于 2012-1-14 14:10 编辑

上传下截取的生成会计科目余额表的SQL语句

  1. select ACCOUNT.STRACCOUNTCODE As "科目编码",ACCOUNT.STRACCOUNTNAME As "科目名称",SUM(DECODE(ACCOUNT.INTDIRECTION,1,1,0)*DECODE(SIGN(TO_DATE(ACCOUNTDAILY.STRDATE,'YYYY-MM-DD')-TO_DATE('2011-12-01','YYYY-MM-DD')),-1,1,0)*((dblUnPostedDebit+dblPostedDebit)-(dblUnPostedCredit+dblPostedCredit)))+SUM(DECODE(ACCOUNT.INTDIRECTION,-1,1,0)*DECODE(SIGN(TO_DATE(ACCOUNTDAILY.STRDATE,'YYYY-MM-DD')-TO_DATE('2011-12-01','YYYY-MM-DD')),-1,1,0)*((dblUnPostedCredit+dblPostedCredit)-(dblUnPostedDebit+dblPostedDebit))) As "期初余额本币金额",SUM(DECODE(SIGN(TO_DATE(ACCOUNTDAILY.STRDATE,'YYYY-MM-DD')- TO_DATE('2011-12-01','YYYY-MM-DD')),-1,0,1)*DECODE(SIGN(TO_DATE(ACCOUNTDAILY.STRDATE,'YYYY-MM-DD')- TO_DATE('2011-12-31','YYYY-MM-DD')),1,0,1)*(dblUnPostedDebit+dblPostedDebit)) As "本期借方发生额本币金额",SUM(DECODE(SIGN(TO_DATE(ACCOUNTDAILY.STRDATE,'YYYY-MM-DD')- TO_DATE('2011-12-01','YYYY-MM-DD')),-1,0,1)*DECODE(SIGN(TO_DATE(ACCOUNTDAILY.STRDATE,'YYYY-MM-DD')- TO_DATE('2011-12-31','YYYY-MM-DD')),1,0,1)*(dblUnPostedCredit+dblPostedCredit)) As "本期贷方发生额本币金额",DECODE(ACCOUNT.INTDIRECTION,1,'借','贷') As "方向",SUM(DECODE(ACCOUNT.INTDIRECTION,1,1,0)*DECODE(SIGN(TO_DATE(ACCOUNTDAILY.STRDATE,'YYYY-MM-DD')-TO_DATE('2011-12-31','YYYY-MM-DD')),1,0,1)*((dblUnPostedDebit+dblPostedDebit)-(dblUnPostedCredit+dblPostedCredit)))+SUM(DECODE(ACCOUNT.INTDIRECTION,-1,1,0)*DECODE(SIGN( TO_DATE(ACCOUNTDAILY.STRDATE,'YYYY-MM-DD')-TO_DATE('2011-12-31','YYYY-MM-DD')),1,0,1)*((dblUnPostedCredit+dblPostedCredit)-(dblUnPostedDebit+dblPostedDebit))) As "期末余额本币金额",max(Account.blnIsDetail),max(Account.intLevel),Max(Account.lngAccountTypeID) From Account,AccountDaily,Currencys,Customer,CustomerType,Employee,Organization,Organization OrganizationAux Where ((Upper(Account.strAccountCode)=Upper('521') Or Account.strAccountCode Like '521-%')) And Account.lngAccountID=AccountDaily.lngAccountID And Currencys.lngCurrencyID(+)=AccountDaily.lngCurrencyID And Customer.lngCustomerID(+)=AccountDaily.lngCustomerID And Customer.lngCustomerTypeID = CustomerType.lngCustomerTypeID(+) And Employee.lngEmployeeID(+)=AccountDaily.lngEmployeeID AND AccountDaily.lngOrganizationID = Organization.lngOrganizationID(+) AND AccountDaily.lngSourceOrganizationID = OrganizationAux.lngOrganizationID(+) And Abs(dblPostedDebit)+ Abs(dblUnPostedDebit)+Abs(dblPostedCredit)+Abs(dblUnPostedCredit)+ Abs(dblCurrencyPostedDebit)+Abs(dblCurrencyUnPostedDebit)+Abs(dblCurrencyPostedCredit)+Abs(dblCurrencyUnPostedCredit)+Abs(dblQuantityPostedDebit)+Abs(dblQuantityUnPostedDebit)+Abs(dblQuantityPostedCredit)+Abs(dblQuantityUnPostedCredit)<>0 AND AccountDaily.strDate <= '2011-12-31' Group By ACCOUNT.STRACCOUNTCODE,ACCOUNT.STRACCOUNTNAME,ACCOUNT.INTDIRECTION Order By ACCOUNT.STRACCOUNTCODE,ACCOUNT.STRACCOUNTNAME,ACCOUNT.INTDIRECTION
复制代码

回复

使用道具 举报

 楼主| 发表于 2012-1-14 14:10 | 显示全部楼层
本帖最后由 hxj710802 于 2012-1-14 14:50 编辑

问题求解:

上面用PS/SQL工具生成了和财务软件一样的报表,但我想在EXCEL中生成,这样就可以动态引用报表数据了.
具体要求如下:
将下图代码中的代表开始日期的红色日期值"2011-12-01",取EXCEL电子表中F2单元格值,将代表结束日期 的绿色日期值'2011-12-31',取H2单元格值,将黄色标示的会计科目代码'521'取B2单元格中的值.并从A3单元格开始生成报表.

要替换的常量(带颜色的部分):


9.PNG



EXCEL电子表格式:


12.PNG

回复

使用道具 举报

 楼主| 发表于 2012-1-14 14:12 | 显示全部楼层
本帖最后由 hxj710802 于 2012-1-14 14:52 编辑

说明下,SQL代码中日期常量(2011-12-01和2011-12-31)和会计科目代码(521)常量产生的原因:
1.日期常量是因为在财务软件客户端会计科目余额生成时选取起止日期产生的如下图所示:


10.PNG


2.会计科目代码是因为在财务软件客户端生成会计科目余额表时选取科目产生的如下图所示:
11.PNG



以上常量通过ORACLE追踪器截获遗留在SQL代码中.
我们要做的就是想将这几个常量通过EXCEL变成取单元格值中变量,这样就可以生成任意时间段和任意科目的数据了..哈哈!


回复

使用道具 举报

 楼主| 发表于 2012-1-14 20:04 | 显示全部楼层
请各位大师百忙中写段代码VBA+ADO,不胜感激
回复

使用道具 举报

发表于 2012-1-16 10:19 | 显示全部楼层
ORACLE 数据库没用过,但据经验估计,可能是你在VBA中表示时间的方式不对, VBA访问ORACLE中的代码用#代替试试,比如,#2012/1/16#,至于科目也许一样的原因
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-4 19:24 , Processed in 0.308797 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表