本帖最后由 bswendy 于 2010-12-14 05:13:41 编辑

解决方案 »

  1.   

    贴子过长,接上:--5、辅助账横表T_BD_ASSISTANTHG:FID、客户ID(FCUSTOMERID=t_bd_customer.FID)、供应商ID(FProviderID=t_bd_supplier.Fid)create table T_BD_ASSISTANTHG
    (
      FID                     VARCHAR2(44) not null,
      FCUSTOMERID             VARCHAR2(44),
      FPROVIDERID             VARCHAR2(44)
    )insert into t_bd_assistanthg (FID, FCUSTOMERID, FPROVIDERID)
    values ('1eMNUUmfR925jC2W+GK5f0GKbLs=', '', 'GJ8Z5OVyT3+ycES72ZPpKzfGffw=');insert into t_bd_assistanthg (FID, FCUSTOMERID, FPROVIDERID)
    values ('2LC9qDgBShmzZzUWcjaNREGKbLs=', 'f4A7uDShSpiuGP7F0mPflL8MBA4=', '');insert into t_bd_assistanthg (FID, FCUSTOMERID, FPROVIDERID)
    values ('FFrCI0VUQ+6VpaFmwZWF9kGKbLs=', '', 'GJ8Z5OVyT3+ycES72ZPpKzfGffw=');insert into t_bd_assistanthg (FID, FCUSTOMERID, FPROVIDERID)
    values ('R5CYhF9hQNqjX8vt9kFdiUGKbLs=', 'f4A7uDShSpiuGP7F0mPflL8MBA4=', '');insert into t_bd_assistanthg (FID, FCUSTOMERID, FPROVIDERID)
    values ('SYqPncg7Qd64uG8k5Ss67EGKbLs=', '', '');insert into t_bd_assistanthg (FID, FCUSTOMERID, FPROVIDERID)
    values ('kjwvzfbDQnSWM3nfHXqbGkGKbLs=', 'MnDNTbz/SICkjZbOf9INYL8MBA4=', '');insert into t_bd_assistanthg (FID, FCUSTOMERID, FPROVIDERID)
    values ('v/1yDNH/Qp2pjsH3X4J3D0GKbLs=', 'MnDNTbz/SICkjZbOf9INYL8MBA4=', '');
    --6、客户表T_BD_CUSTOMER:FID、姓名、编号
    create table T_BD_CUSTOMER
    (
      FID                VARCHAR2(44) not null,
      FNUMBER            NVARCHAR2(80) not null,
      FNAME_L2           NVARCHAR2(255)
    )insert into t_bd_customer (FID, FNUMBER, FNAME_L2)
    values ('MnDNTbz/SICkjZbOf9INYL8MBA4=', 'L-00068', '林金兰');insert into t_bd_customer (FID, FNUMBER, FNAME_L2)
    values ('f4A7uDShSpiuGP7F0mPflL8MBA4=', 'C-00007', '陈凤');--7、供应商表T_BD_SUPPLIER:FID、供应商名称、供应商编码
    create table T_BD_SUPPLIER
    (
      FID                VARCHAR2(44) not null,
      FNUMBER            NVARCHAR2(80) not null,
      FNAME_L2           NVARCHAR2(255)
    )
    insert into t_bd_supplier (FID, FNUMBER, FNAME_L2)
    values ('GJ8Z5OVyT3+ycES72ZPpKzfGffw=', '6102-01055', '广东世源集团');insert into t_bd_supplier (FID, FNUMBER, FNAME_L2)
    values ('71AFW+KIQxmEbMLwwn/OhzfGffw=', '3182-02305', '北京巨富公司');--8、凭证辅助账明细表:FID、凭证ID(FBILLID=T_GL_VOUCHER.FID)、辅助账横表ID(FASSGRPID=T_GL_ASSISTBALANCE.FASSISTGRPID)、业务日期、描述create table T_GL_VOUCHERASSISTRECORD
    (
      FID                 VARCHAR2(44) not null,  
      FBILLID             VARCHAR2(44),
      FASSGRPID           VARCHAR2(44),
      FBIZDATE            TIMESTAMP(6) not null,
      FDESCRIPTION        NVARCHAR2(200)
    )insert into T_GL_VoucherAssistRecord (FID, FBILLID, FASSGRPID, FBIZDATE, FDESCRIPTION)
    values ('HHvaWvRsToW+4CEcvflJmA//vKo=', '', '1eMNUUmfR925jC2W+GK5f0GKbLs=', '01-JAN-10 12.00.00.000000 AM', '应付工程款项目AA1000元');insert into T_GL_VoucherAssistRecord (FID, FBILLID, FASSGRPID, FBIZDATE, FDESCRIPTION)
    values ('sLbd4D4qQSy55esg9O0p6g//vKo=', '7LrCcCV2RKaMO8WtqdnJtSZS4B4=', '1eMNUUmfR925jC2W+GK5f0GKbLs=', '31-JAN-10 12.00.00.000000 AM', '20101213做的凭证辅助账');insert into T_GL_VoucherAssistRecord (FID, FBILLID, FASSGRPID, FBIZDATE, FDESCRIPTION)
    values ('QK0jfExkQ4SY2MlFVOaTQw//vKo=', '', '2LC9qDgBShmzZzUWcjaNREGKbLs=', '01-JAN-10 12.00.00.000000 AM', '应收工程款项目AA1000元');insert into T_GL_VoucherAssistRecord (FID, FBILLID, FASSGRPID, FBIZDATE, FDESCRIPTION)
    values ('KhGYD28TSHKSw4DoEvZucw//vKo=', '7LrCcCV2RKaMO8WtqdnJtSZS4B4=', '2LC9qDgBShmzZzUWcjaNREGKbLs=', '31-JAN-10 12.00.00.000000 AM', '20101213做的凭证');insert into T_GL_VoucherAssistRecord (FID, FBILLID, FASSGRPID, FBIZDATE, FDESCRIPTION)
    values ('BlXN9nDxTLa9JGh+LJ/nYA//vKo=', '', 'R5CYhF9hQNqjX8vt9kFdiUGKbLs=', '01-JAN-10 12.00.00.000000 AM', '');insert into T_GL_VoucherAssistRecord (FID, FBILLID, FASSGRPID, FBIZDATE, FDESCRIPTION)
    values ('4iA/TyxhREGLg9VBPHCuEg//vKo=', 'NblocXPKTTOC/+jKYVpVwyZS4B4=', 'R5CYhF9hQNqjX8vt9kFdiUGKbLs=', '31-MAR-10 12.00.00.000000 AM', '');insert into T_GL_VoucherAssistRecord (FID, FBILLID, FASSGRPID, FBIZDATE, FDESCRIPTION)
    values ('+xNAEqptS8G0u0EOAoGj4A//vKo=', 'jFVs2y9KQc21SWjiJVKXWiZS4B4=', 'SYqPncg7Qd64uG8k5Ss67EGKbLs=', '08-JAN-10 12.00.00.000000 AM', 'cxf20100108做的凭证金融机构');insert into T_GL_VoucherAssistRecord (FID, FBILLID, FASSGRPID, FBIZDATE, FDESCRIPTION)
    values ('kwLPp6yTR6azR4bjN5V+lA//vKo=', 'jFVs2y9KQc21SWjiJVKXWiZS4B4=', 'v/1yDNH/Qp2pjsH3X4J3D0GKbLs=', '08-JAN-10 12.00.00.000000 AM', 'cxf20100108做的凭证客户林金兰');--9、凭证表T_GL_VOUCHER: FID、凭证编号、业务日期、记账日期、组织ID(FcompanyID=t_org_baseUnit.FID)
    create table T_GL_VOUCHER
    (
      FID                    VARCHAR2(44) not null,
      FNUMBER                NVARCHAR2(80),
      FBIZDATE               TIMESTAMP(6) not null,
      FBOOKEDDATE            TIMESTAMP(6) not null,
      FCOMPANYID             VARCHAR2(44) not null
    )insert into T_GL_Voucher (FID, FNUMBER, FBIZDATE, FBOOKEDDATE, FCOMPANYID)
    values ('7LrCcCV2RKaMO8WtqdnJtSZS4B4=', '0001', '31-JAN-10 12.00.00.000000 AM', '31-JAN-10 12.00.00.000000 AM', '93CqeTWeRSm6pE1rMA5Yu8znrtQ=');insert into T_GL_Voucher (FID, FNUMBER, FBIZDATE, FBOOKEDDATE, FCOMPANYID)
    values ('jFVs2y9KQc21SWjiJVKXWiZS4B4=', '0002', '08-JAN-10 12.00.00.000000 AM', '09-JAN-10 12.00.00.000000 AM', '93CqeTWeRSm6pE1rMA5Yu8znrtQ=');--10、初始余额表T_GL_ACCTCUSSENT:FID、凭证辅助账记录表ID(FVCHASSISTRECORDID=T_GL_VoucherAssistRecord.FID)、是否初始化(=1表示初始化数据)、单位ID(FcompanyID=T_org_baseUnit.Fid)
    create table T_GL_ACCTCUSSENT
    (
      FID                      VARCHAR2(44) not null,  
      FVCHASSISTRECORDID       VARCHAR2(44), 
      FISINIT                  NUMBER(10) default 0 not null,
      FCOMPANYID               VARCHAR2(44) not null
    )insert into t_gl_acctcussent (FID, FVCHASSISTRECORDID, FISINIT, FCOMPANYID)
    values ('qJOjmIotS3yzVdGGfGWXN84thQo=', 'QK0jfExkQ4SY2MlFVOaTQw//vKo=', 1, '93CqeTWeRSm6pE1rMA5Yu8znrtQ=');insert into t_gl_acctcussent (FID, FVCHASSISTRECORDID, FISINIT, FCOMPANYID)
    values ('s9hdbsFRQtqnqt6atCGXYs4thQo=', 'HHvaWvRsToW+4CEcvflJmA//vKo=', 1, '93CqeTWeRSm6pE1rMA5Yu8znrtQ=');
      

  2.   

    你这是用Oracle 写一个存储过程,然后写一个excel文档出来吧,这个我写过,不过你这逻辑太长了,不好看啊,
      

  3.   

    这位兄弟有来提问了啊?哎。。你这个也太复杂了嘛,干脆你把你的工资给我们做算了,呵呵
    还没理解你的具体逻辑需求,特别是那个excel 看起来很费劲,能不能上传一个你弄好的excel,不要图片,可供我们下载啊
    csdn个人资源里你上传一个excel就可以的
      

  4.   

    噢,可以直接复制后粘贴到我们的excel中,嘿嘿刚粘贴到excel中了,慢慢看下
      

  5.   

    哥们,你的初始数据还有问题,日期格式都不转换好,你数据时字符串,要转换成timestamp类型才行啊
    哎,费劲啊
    --3、会计期间表t_bd_period(期间起始时间,期间结束时间)
    --8、凭证辅助账明细表:业务日期
    --9、凭证表T_GL_VOUCHER: 业务日期、记账日期
      

  6.   

    回楼上这位兄弟,这三个表的日期都是timestamp类型,参数也可以是timestamp类型。
      

  7.   

    回兄弟,我已经上传资源到CSDN我的资源里了,但还查看不到呢,不知道是不是要审核。
    非常谢谢了,兄弟。
      

  8.   

    你先把你那三个表的对应的timestap类型的数据,转换一下,然后再贴出你的修改后的数据,不然不好给你转换的
    逻辑还要看看,没搞清楚,比较难理解。
      

  9.   

    我不知道你说的转换是什么??转成什么呢?我是直接从数据库里导出数据的没有修改过。
    类似'09-JAN-10 12.00.00.000000 AM  是表示2010-01-09号上午12点
      

  10.   


    我改了,谢谢~~
    --3、会计期间表t_bd_period(FID,期间编号,期间起始时间,期间结束时间)
    create table T_BD_PERIOD
    (
      FID               VARCHAR2(44) not null,
      FNUMBER           NUMBER(10) default 200801 not null,
      FBEGINDATE        TIMESTAMP(6) not null,
      FENDDATE          TIMESTAMP(6) not null
    )insert into t_bd_period (FID, FNUMBER, FBEGINDATE, FENDDATE)
    values ('rc4UK8e6QrK6gJbq34IuaII4jEw=', 201001, to_timestamp('2010-01-01 0.00.00', 'yyyy-mm-dd hh24.mi.ss'), to_timestamp('2010-01-31 0.00.00', 'yyyy-mm-dd hh24.mi.ss'));insert into t_bd_period (FID, FNUMBER, FBEGINDATE, FENDDATE)
    values ('K2hDrW1OQXKI3K085Np6vII4jEw=', 201002, to_timestamp('2010-02-01 0.00.00', 'yyyy-mm-dd hh24.mi.ss'), to_timestamp('2010-02-28 0.00.00', 'yyyy-mm-dd hh24.mi.ss'));insert into t_bd_period (FID, FNUMBER, FBEGINDATE, FENDDATE)
    values ('br1XHiSiR9e+KHMjV1g9wYI4jEw=', 201003, to_timestamp('2010-03-01 0.00.00', 'yyyy-mm-dd hh24.mi.ss'), to_timestamp('2010-03-31 0.00.00', 'yyyy-mm-dd hh24.mi.ss'));--9、凭证辅助账明细表:FID、凭证ID(FBILLID=T_GL_VOUCHER.FID)、辅助账横表ID(FASSGRPID=t_bd_assistanthg.fid)、业务日期、描述create table T_GL_VOUCHERASSISTRECORD
    (
      FID                 VARCHAR2(44) not null,  
      FBILLID             VARCHAR2(44),
      FASSGRPID           VARCHAR2(44),
      FBIZDATE            TIMESTAMP(6) not null,
      FDESCRIPTION        NVARCHAR2(200)
    )insert into T_GL_VoucherAssistRecord (FID, FBILLID, FASSGRPID, FBIZDATE, FDESCRIPTION)
    values ('HHvaWvRsToW+4CEcvflJmA//vKo=', '', '1eMNUUmfR925jC2W+GK5f0GKbLs=', to_timestamp('2010-01-01 0.00.00', 'yyyy-mm-dd hh24.mi.ss'), '应付工程款项目AA1000元');insert into T_GL_VoucherAssistRecord (FID, FBILLID, FASSGRPID, FBIZDATE, FDESCRIPTION)
    values ('sLbd4D4qQSy55esg9O0p6g//vKo=', '7LrCcCV2RKaMO8WtqdnJtSZS4B4=', '1eMNUUmfR925jC2W+GK5f0GKbLs=', to_timestamp('2010-01-31 0.00.00', 'yyyy-mm-dd hh24.mi.ss'), '20101213做的凭证辅助账');insert into T_GL_VoucherAssistRecord (FID, FBILLID, FASSGRPID, FBIZDATE, FDESCRIPTION)
    values ('QK0jfExkQ4SY2MlFVOaTQw//vKo=', '', '2LC9qDgBShmzZzUWcjaNREGKbLs=', to_timestamp('2010-01-01 0.00.00', 'yyyy-mm-dd hh24.mi.ss'), '应收工程款项目AA1000元');insert into T_GL_VoucherAssistRecord (FID, FBILLID, FASSGRPID, FBIZDATE, FDESCRIPTION)
    values ('KhGYD28TSHKSw4DoEvZucw//vKo=', '7LrCcCV2RKaMO8WtqdnJtSZS4B4=', '2LC9qDgBShmzZzUWcjaNREGKbLs=', to_timestamp('2010-01-31 0.00.00', 'yyyy-mm-dd hh24.mi.ss'), '20101213做的凭证');insert into T_GL_VoucherAssistRecord (FID, FBILLID, FASSGRPID, FBIZDATE, FDESCRIPTION)
    values ('BlXN9nDxTLa9JGh+LJ/nYA//vKo=', '', 'R5CYhF9hQNqjX8vt9kFdiUGKbLs=', to_timestamp('2010-01-31 0.00.00', 'yyyy-mm-dd hh24.mi.ss'), '');insert into T_GL_VoucherAssistRecord (FID, FBILLID, FASSGRPID, FBIZDATE, FDESCRIPTION)
    values ('4iA/TyxhREGLg9VBPHCuEg//vKo=', 'NblocXPKTTOC/+jKYVpVwyZS4B4=', 'R5CYhF9hQNqjX8vt9kFdiUGKbLs=', to_timestamp('2010-03-31 0.00.00', 'yyyy-mm-dd hh24.mi.ss'), '');insert into T_GL_VoucherAssistRecord (FID, FBILLID, FASSGRPID, FBIZDATE, FDESCRIPTION)
    values ('+xNAEqptS8G0u0EOAoGj4A//vKo=', 'jFVs2y9KQc21SWjiJVKXWiZS4B4=', 'SYqPncg7Qd64uG8k5Ss67EGKbLs=', to_timestamp('2010-01-08 0.00.00', 'yyyy-mm-dd hh24.mi.ss'), 'cxf20100108做的凭证金融机构');insert into T_GL_VoucherAssistRecord (FID, FBILLID, FASSGRPID, FBIZDATE, FDESCRIPTION)
    values ('kwLPp6yTR6azR4bjN5V+lA//vKo=', 'jFVs2y9KQc21SWjiJVKXWiZS4B4=', 'v/1yDNH/Qp2pjsH3X4J3D0GKbLs=', to_timestamp('2010-01-08 0.00.00', 'yyyy-mm-dd hh24.mi.ss'), 'cxf20100108做的凭证客户林金兰');--8、凭证表T_GL_VOUCHER: FID、凭证编号、业务日期、记账日期、组织ID(FcompanyID=t_org_baseUnit.FID)create table T_GL_VOUCHER
    (
      FID                    VARCHAR2(44) not null,
      FNUMBER                NVARCHAR2(80),
      FBIZDATE               TIMESTAMP(6) not null,
      FBOOKEDDATE            TIMESTAMP(6) not null,
      FCOMPANYID             VARCHAR2(44) not null
    )insert into T_GL_Voucher (FID, FNUMBER, FBIZDATE, FBOOKEDDATE, FCOMPANYID)
    values ('7LrCcCV2RKaMO8WtqdnJtSZS4B4=', '0001', to_timestamp('2010-01-31 0.00.00', 'yyyy-mm-dd hh24.mi.ss'), to_timestamp('2010-01-31 0.00.00', 'yyyy-mm-dd hh24.mi.ss'), '93CqeTWeRSm6pE1rMA5Yu8znrtQ=');insert into T_GL_Voucher (FID, FNUMBER, FBIZDATE, FBOOKEDDATE, FCOMPANYID)
    values ('jFVs2y9KQc21SWjiJVKXWiZS4B4=', '0002', to_timestamp('2010-01-08 0.00.00', 'yyyy-mm-dd hh24.mi.ss'), to_timestamp('2010-01-09 0.00.00', 'yyyy-mm-dd hh24.mi.ss'), '93CqeTWeRSm6pE1rMA5Yu8znrtQ=');
      

  11.   

    --存储过程如下:
    CREATE OR REPLACE PROCEDURE get_infoco(
                                          p_ForgNum     IN  VARCHAR2       --公司      如:'01.01'
                                         ,p_FSearchDate IN  DATE           --具体日期  如:2010-1-20
                                         ,p_FAccountNum IN  VARCHAR2       --科目代码  如:1121
                                         ,resultSet     OUT sys_refcursor  --返回结果集
    )
    IS
      --定义一个类型,用来指明中间表的结果
      TYPE T_TABLE IS RECORD (
         FBalType            T_GL_AssistBalance.FBalType%TYPE,
         FOrgUnitID          T_GL_AssistBalance.FOrgUnitID%TYPE,
         FPeriodID           T_GL_AssistBalance.FPeriodID%TYPE,
         FAccountID          T_GL_AssistBalance.FAccountID%TYPE,
         FAssistGrpID        T_GL_AssistBalance.FAssistGrpID%TYPE,
         FBeginBalanceFor    T_GL_AssistBalance.FBeginBalanceFor%TYPE,
         FEndBalanceFor      T_GL_AssistBalance.FEndBalanceFor%TYPE,
         ForgNum             T_ORG_BaseUnit.FNumber%TYPE,
         ForgName            T_ORG_BaseUnit.FName_L2%TYPE,
         FPrdBegDate         T_BD_Period.FBeginDate%TYPE,
         FPrdEndDate         T_BD_Period.FEndDate%TYPE,
         FPrdNum             T_BD_Period.Fnumber%TYPE,
         FAccountNum         T_BD_AccountView.FNumber%TYPE,
         FAccountName        T_BD_AccountView.FName_L2%TYPE,
         FAccountFDC         T_BD_AccountView.FDC%TYPE,
         FHGCstmID           T_BD_AssistantHG.FCustomerID%TYPE,
         FHGPrvdID           T_BD_AssistantHG.FProviderID%TYPE,
         FCstmNum            T_BD_Customer.FNumber%TYPE,
         FCstmName           T_BD_Customer.FName_L2%TYPE,
         FSplrNum            T_BD_Supplier.FNumber%TYPE,
         FSplrName           T_BD_Supplier.FName_L2%TYPE);
    rs  T_TABLE;   --获取游标结果集的类型变量
    --定义游标,根据入参查询结果集
    CURSOR cur IS SELECT  DISTINCT  T_GL_AssistBalance.FBalType, T_GL_AssistBalance.FOrgUnitID, T_GL_AssistBalance.FPeriodID, T_GL_AssistBalance.FAccountID,
                          T_GL_AssistBalance.FAssistGrpID, T_GL_AssistBalance.FBeginBalanceFor, T_GL_AssistBalance.FEndBalanceFor,
                          T_ORG_BaseUnit.FNumber AS ForgNum, T_ORG_BaseUnit.FName_L2 AS ForgName, T_BD_Period.FBeginDate AS FPrdBegDate,
                          T_BD_Period.FEndDate AS FPrdEndDate, T_BD_Period.Fnumber AS FPrdNum, T_BD_AccountView.FNumber AS FAccountNum,
                          T_BD_AccountView.FName_L2 AS FAccountName, T_BD_AccountView.FDC AS FAccountFDC, T_BD_AssistantHG.FCustomerID AS FHGCstmID,
                          T_BD_AssistantHG.FProviderID AS FHGPrvdID, T_BD_Customer.FNumber AS FCstmNum, T_BD_Customer.FName_L2 AS FCstmName,
                          T_BD_Supplier.FNumber AS FSplrNum, T_BD_Supplier.FName_L2 AS FSplrName
                  FROM  T_BD_Customer RIGHT OUTER JOIN
                        T_BD_Supplier RIGHT OUTER JOIN
                        T_BD_AssistantHG ON T_BD_Supplier.FID = T_BD_AssistantHG.FProviderID ON
                        T_BD_Customer.FID = T_BD_AssistantHG.FCustomerID RIGHT OUTER JOIN
                        T_GL_AssistBalance ON T_BD_AssistantHG.FID = T_GL_AssistBalance.FAssistGrpID LEFT OUTER JOIN
                        T_BD_AccountView ON T_GL_AssistBalance.FAccountID = T_BD_AccountView.FID LEFT OUTER JOIN
                        T_BD_Period ON T_GL_AssistBalance.FPeriodID = T_BD_Period.FID LEFT OUTER JOIN
                        T_ORG_BaseUnit ON T_GL_AssistBalance.FOrgUnitID = T_ORG_BaseUnit.FID CROSS JOIN
                        T_GL_AcctCussent CROSS JOIN
                        T_GL_Voucher CROSS JOIN
                        T_GL_VoucherAssistRecord
                  WHERE T_ORG_BaseUnit.FNumber = p_ForgNum AND T_BD_ACCOUNTVIEW.Fnumber like p_FAccountNum||'%';--定义全局变量
    v_FGLVARID             T_GL_VoucherAssistRecord.FID%TYPE ;
    v_FBillID              T_GL_VoucherAssistRecord.FBillID%TYPE;
    v_FDescription         T_GL_VoucherAssistRecord.FDescription%TYPE;
    v_FBizDate             T_GL_VoucherAssistRecord.FBizDate%TYPE;
    v_FVouchNum            T_GL_Voucher.FNumber%TYPE;
    v_FVouchBizDate        T_GL_Voucher.FBizDate%TYPE;
    v_FVouchBookedDate     T_GL_Voucher.FBookedDate%TYPE;--过程begin
    BEGIN
         OPEN cur ;
         LOOP
            FETCH cur INTO rs ;
            EXIT WHEN cur%NOTFOUND;
            IF rs.FBeginBalanceFor<>rs.FEndBalanceFor AND rs.FEndBalanceFor <>0 THEN
                BEGIN
                    SELECT FGLVARID,  FBillID,  FDescription,  FBizDate,  FVouchNum,  FVouchBizDate,  FVouchBookedDate
                      INTO v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate,v_FVouchNum,v_FVouchBizDate,v_FVouchBookedDate
                    FROM (
                          SELECT ROWNUM rn,T_GL_VoucherAssistRecord.FID AS FGLVARID, T_GL_VoucherAssistRecord.FBillID,T_GL_VoucherAssistRecord.FDescription,
                                          T_GL_VoucherAssistRecord.FBizDate,T_GL_Voucher.FNumber AS FVouchNum,
                                          T_GL_Voucher.FBizDate AS FVouchBizDate, T_GL_Voucher.FBookedDate AS FVouchBookedDate
                          FROM   T_GL_VoucherAssistRecord LEFT OUTER JOIN T_GL_Voucher
                                ON T_GL_VoucherAssistRecord.FBillID = T_GL_Voucher.FID
                          WHERE  T_GL_VoucherAssistRecord.FbillID IS NOT NULL
                                AND T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID
                          ORDER BY FVouchBookedDate DESC nulls last
                    )WHERE rn=1;
                    --向临时表插入数据:
                    INSERT INTO tempco(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,
                                      FGLVARID,FBillID,FDescription,FBizDate,FVouchNum,FVouchBizDate,FVouchBookedDate)
                               VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,
                                      v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate,v_FVouchNum,v_FVouchBizDate,v_FVouchBookedDate);
                EXCEPTION WHEN no_data_found THEN
                         Raise_Application_Error('-20001','can not find data in T_GL_VoucherAssistRecord where FAssistGrpID='||rs.FAssistGrpID);
                END;
            END IF;
            IF rs.FBeginBalanceFor<>0 AND rs.FEndBalanceFor = rs.FEndBalanceFor THEN
               Dbms_Output.put_line(' 222222 ');
               BEGIN
                    --在往来账表t_gl_acctcussent存在
                    SELECT   T_GL_VoucherAssistRecord.FID AS FGLVARID, T_GL_VoucherAssistRecord.FBillID,
                             T_GL_VoucherAssistRecord.FDescription,T_GL_VoucherAssistRecord.FBizDate
                        INTO  v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate
                    FROM  T_GL_VoucherAssistRecord
                    WHERE T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID
                        AND EXISTS(SELECT 1 FROM T_GL_AcctCussent WHERE T_GL_AcctCussent.FVchAssistRecordID=T_GL_VoucherAssistRecord.FID);
                    --向临时表插入数据:
                    INSERT INTO tempco(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,
                                      FGLVARID,FBillID,FDescription,FBizDate)
                               VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,
                                      v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate);
                EXCEPTION WHEN no_data_found THEN
                         --在往来账表t_gl_acctcussent存在
                         --向临时表插入数据:
                         INSERT INTO tempco(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,FBizDate)
                                    VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,rs.FPrdEndDate);
                END;
            END IF;
         END LOOP;
         CLOSE cur;
         --最后对临时表数据进行分类汇总
         OPEN resultSet FOR
         select FcstmName 客户或供应商,
                FDescription 摘要,
                CASE WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy')) <1 THEN '小于1年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))>=1 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))<2 THEN '1-2年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))>=2 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))<3 THEN '2-3年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))>=3 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))<4 THEN '3-4年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))>=4 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))<5 THEN '4-5年'
                     ELSE '五年以上'
                END 发生年限,
                CASE WHEN Sum_FEndBalanceFor>0 THEN Sum_FEndBalanceFor ELSE NULL END  借方,
                CASE WHEN Sum_FEndBalanceFor<0 THEN Sum_FEndBalanceFor ELSE NULL END  贷方
         FROM(
              SELECT FcstmName,FBizDate,FDescription,
                     Sum(FEndBalanceFor)over(PARTITION BY FcstmName) AS Sum_FEndBalanceFor,
                     Row_Number()over(PARTITION BY FcstmName ORDER BY FBizDate DESC ) rn
              FROM tempco)
         WHERE rn=1;
         COMMIT;
    END;
      

  12.   

    --测试:
    Connected to:
    Oracle Database 10g Release 10.1.0.2.0 - ProductionSQL> --创建会话级临时表 
    SQL> CREATE global temporary TABLE tempco
      2  (
      3       FAssistGrpID        VARCHAR2(44),
      4       FBeginBalanceFor    NUMBER(19,4),
      5       FEndBalanceFor      NUMBER(19,4),
      6       FCstmNum            NVARCHAR2(80) ,
      7       FCstmName           NVARCHAR2(255),
      8       FSplrNum            NVARCHAR2(80) ,
      9       FSplrName           NVARCHAR2(255),
     10       ForgNum             NVARCHAR2(80),
     11       ForgName            NVARCHAR2(255),
     12       FPrdBegDate         TIMESTAMP(6),
     13       FPrdEndDate         TIMESTAMP(6),
     14       FGLVARID            VARCHAR2(44),
     15       FBillID             VARCHAR2(44),
     16       FDescription        NVARCHAR2(200),
     17       FBizDate            TIMESTAMP(6),
     18       FVouchNum           NVARCHAR2(80),
     19       FVouchBizDate       TIMESTAMP(6) ,
     20       FVouchBookedDate    TIMESTAMP(6)
     21  ) on commit preserve rows ;Table created.SQL> set serveroutput on
    SQL> col 客户或供应商 format a8
    SQL> col 摘要 format a30
    SQL> col 发生年限 format a8
    SQL> col 借方 format 9999
    SQL> col 贷方 format 9999
    SQL> var cur refcursor
    SQL> EXEC  get_infoco('01.01',To_Date('2010-01-20','yyyy-mm-dd'),'1121',:cur) ;PL/SQL procedure successfully completed.SQL> print cur客户或供 摘要                           发生年限  借方  贷方
    -------- ------------------------------ -------- ----- -----
    林金兰   cxf20100108做的凭证客户林金兰  小于1年   2100
    陈凤                                    小于1年   1500SQL> 
      

  13.   

    谢谢gelyon,你可帮了我一个大忙了,我调试看看
      

  14.   


    这里其实还有很多地方要修改的,
    比如,我临时表tempco,可以直接将excel中的A-AF列创建成临时表tempco,
    这样在最后对临时表数据进行分类汇总的时候,所有字段都有就比较方便,根据你的逻辑来写就容易多了
    这里我有些逻辑没理顺,所以创建临时表tempco的时候少考虑了后面的内容,比如客户或供应商药根据
    T列FCustomerID、U列Fproviderid是否为空 来判断,这里我临时表tempco里没加入这两栏位,直接根据的FcstmName
    来汇总的你可以再循环RS的时候将游标结果集中数据全部插入临时表,这样后面处理就好了,你再修改下吧
    有问题再讨论
      

  15.   


    --修改了下过程中一些问题:逻辑二,逐笔循环判断是否在往来账表t_gl_acctcussent中存在
    --之前逻辑理解错了,你现在看看呢
    CREATE OR REPLACE PROCEDURE get_infoco(
                                          p_ForgNum     IN  VARCHAR2       --公司      如:'01.01'
                                         ,p_FSearchDate IN  DATE           --具体日期  如:2010-1-20
                                         ,p_FAccountNum IN  VARCHAR2       --科目代码  如:1121
                                         ,resultSet     OUT sys_refcursor  --返回结果集
    )
    IS
      --定义一个类型,用来指明中间表的结果
      TYPE T_TABLE IS RECORD (
         FBalType            T_GL_AssistBalance.FBalType%TYPE,
         FOrgUnitID          T_GL_AssistBalance.FOrgUnitID%TYPE,
         FPeriodID           T_GL_AssistBalance.FPeriodID%TYPE,
         FAccountID          T_GL_AssistBalance.FAccountID%TYPE,
         FAssistGrpID        T_GL_AssistBalance.FAssistGrpID%TYPE,
         FBeginBalanceFor    T_GL_AssistBalance.FBeginBalanceFor%TYPE,
         FEndBalanceFor      T_GL_AssistBalance.FEndBalanceFor%TYPE,
         ForgNum             T_ORG_BaseUnit.FNumber%TYPE,
         ForgName            T_ORG_BaseUnit.FName_L2%TYPE,
         FPrdBegDate         T_BD_Period.FBeginDate%TYPE,
         FPrdEndDate         T_BD_Period.FEndDate%TYPE,
         FPrdNum             T_BD_Period.Fnumber%TYPE,
         FAccountNum         T_BD_AccountView.FNumber%TYPE,
         FAccountName        T_BD_AccountView.FName_L2%TYPE,
         FAccountFDC         T_BD_AccountView.FDC%TYPE,
         FHGCstmID           T_BD_AssistantHG.FCustomerID%TYPE,
         FHGPrvdID           T_BD_AssistantHG.FProviderID%TYPE,
         FCstmNum            T_BD_Customer.FNumber%TYPE,
         FCstmName           T_BD_Customer.FName_L2%TYPE,
         FSplrNum            T_BD_Supplier.FNumber%TYPE,
         FSplrName           T_BD_Supplier.FName_L2%TYPE);
    rs  T_TABLE;   --获取游标结果集的类型变量
    --定义游标,根据入参查询结果集
    CURSOR cur IS SELECT  DISTINCT  T_GL_AssistBalance.FBalType, T_GL_AssistBalance.FOrgUnitID, T_GL_AssistBalance.FPeriodID, T_GL_AssistBalance.FAccountID,
                          T_GL_AssistBalance.FAssistGrpID, T_GL_AssistBalance.FBeginBalanceFor, T_GL_AssistBalance.FEndBalanceFor,
                          T_ORG_BaseUnit.FNumber AS ForgNum, T_ORG_BaseUnit.FName_L2 AS ForgName, T_BD_Period.FBeginDate AS FPrdBegDate,
                          T_BD_Period.FEndDate AS FPrdEndDate, T_BD_Period.Fnumber AS FPrdNum, T_BD_AccountView.FNumber AS FAccountNum,
                          T_BD_AccountView.FName_L2 AS FAccountName, T_BD_AccountView.FDC AS FAccountFDC, T_BD_AssistantHG.FCustomerID AS FHGCstmID,
                          T_BD_AssistantHG.FProviderID AS FHGPrvdID, T_BD_Customer.FNumber AS FCstmNum, T_BD_Customer.FName_L2 AS FCstmName,
                          T_BD_Supplier.FNumber AS FSplrNum, T_BD_Supplier.FName_L2 AS FSplrName
                  FROM  T_BD_Customer RIGHT OUTER JOIN
                        T_BD_Supplier RIGHT OUTER JOIN
                        T_BD_AssistantHG ON T_BD_Supplier.FID = T_BD_AssistantHG.FProviderID ON
                        T_BD_Customer.FID = T_BD_AssistantHG.FCustomerID RIGHT OUTER JOIN
                        T_GL_AssistBalance ON T_BD_AssistantHG.FID = T_GL_AssistBalance.FAssistGrpID LEFT OUTER JOIN
                        T_BD_AccountView ON T_GL_AssistBalance.FAccountID = T_BD_AccountView.FID LEFT OUTER JOIN
                        T_BD_Period ON T_GL_AssistBalance.FPeriodID = T_BD_Period.FID LEFT OUTER JOIN
                        T_ORG_BaseUnit ON T_GL_AssistBalance.FOrgUnitID = T_ORG_BaseUnit.FID CROSS JOIN
                        T_GL_AcctCussent CROSS JOIN
                        T_GL_Voucher CROSS JOIN
                        T_GL_VoucherAssistRecord
                  WHERE T_ORG_BaseUnit.FNumber = p_ForgNum AND T_BD_ACCOUNTVIEW.Fnumber like p_FAccountNum||'%';--定义全局变量
    v_FGLVARID             T_GL_VoucherAssistRecord.FID%TYPE ;
    v_FBillID              T_GL_VoucherAssistRecord.FBillID%TYPE;
    v_FDescription         T_GL_VoucherAssistRecord.FDescription%TYPE;
    v_FBizDate             T_GL_VoucherAssistRecord.FBizDate%TYPE;
    v_FVouchNum            T_GL_Voucher.FNumber%TYPE;
    v_FVouchBizDate        T_GL_Voucher.FBizDate%TYPE;
    v_FVouchBookedDate     T_GL_Voucher.FBookedDate%TYPE;
    v_count  NUMBER := 0 ;  --记录是否在往来账表中存在!--过程begin
    BEGIN
         OPEN cur ;
         LOOP
            FETCH cur INTO rs ;
            EXIT WHEN cur%NOTFOUND;
            IF rs.FBeginBalanceFor<>rs.FEndBalanceFor AND rs.FEndBalanceFor <>0 THEN
                BEGIN
                    SELECT FGLVARID,  FBillID,  FDescription,  FBizDate,  FVouchNum,  FVouchBizDate,  FVouchBookedDate
                      INTO v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate,v_FVouchNum,v_FVouchBizDate,v_FVouchBookedDate
                    FROM (
                          SELECT ROWNUM rn,T_GL_VoucherAssistRecord.FID AS FGLVARID, T_GL_VoucherAssistRecord.FBillID,T_GL_VoucherAssistRecord.FDescription,
                                          T_GL_VoucherAssistRecord.FBizDate,T_GL_Voucher.FNumber AS FVouchNum,
                                          T_GL_Voucher.FBizDate AS FVouchBizDate, T_GL_Voucher.FBookedDate AS FVouchBookedDate
                          FROM   T_GL_VoucherAssistRecord LEFT OUTER JOIN T_GL_Voucher
                                ON T_GL_VoucherAssistRecord.FBillID = T_GL_Voucher.FID
                          WHERE  T_GL_VoucherAssistRecord.FbillID IS NOT NULL
                                AND T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID
                          ORDER BY FVouchBookedDate DESC nulls last
                    )WHERE rn=1;
                    --向临时表插入数据:
                    INSERT INTO tempco(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,
                                      FGLVARID,FBillID,FDescription,FBizDate,FVouchNum,FVouchBizDate,FVouchBookedDate)
                               VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,
                                      v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate,v_FVouchNum,v_FVouchBizDate,v_FVouchBookedDate);
                EXCEPTION WHEN no_data_found THEN
                         Raise_Application_Error('-20001','can not find data in T_GL_VoucherAssistRecord where FAssistGrpID='||rs.FAssistGrpID);
                END;
            END IF;
            IF rs.FBeginBalanceFor<>0 AND rs.FEndBalanceFor = rs.FEndBalanceFor THEN
               BEGIN
                    FOR rst IN (
                    SELECT   T_GL_VoucherAssistRecord.FID AS FGLVARID, T_GL_VoucherAssistRecord.FBillID,
                             T_GL_VoucherAssistRecord.FDescription,T_GL_VoucherAssistRecord.FBizDate
                    FROM  T_GL_VoucherAssistRecord
                    WHERE T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID )
                    LOOP
                        v_FGLVARID     := rst.FGLVARID;
                        v_FBillID      := rst.FBillID;
                        v_FDescription := rst.FDescription;
                        v_FBizDate     := rst.FBizDate;
                        --逐笔循环判断
                        --判断是否在往来账表t_gl_acctcussent中存在
                        SELECT Count(*) INTO v_count FROM  T_GL_AcctCussent WHERE T_GL_AcctCussent.FVchAssistRecordID=v_FGLVARID;                    IF v_count>0 THEN
                            --存在 向临时表插入数据:
                            INSERT INTO tempco(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,
                                              FGLVARID,FBillID,FDescription,FBizDate)
                                      VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,
                                              v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate);
                        ELSE
                            --不存在 向临时表插入数据:
                            INSERT INTO tempco(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,FBizDate)
                                      VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,rs.FPrdEndDate);
                        END IF ;
                    END LOOP;
               EXCEPTION WHEN no_data_found THEN
                         Raise_Application_Error('-20002','can not find data in T_GL_VoucherAssistRecord where FAssistGrpID='||rs.FAssistGrpID);
               END;
            END IF;
         END LOOP;
         CLOSE cur;
         --最后对临时表数据进行分类汇总
         OPEN resultSet FOR
         select FcstmName 客户或供应商,
                FDescription 摘要,
                CASE WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy')) <1 THEN '小于1年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))>=1 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))<2 THEN '1-2年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))>=2 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))<3 THEN '2-3年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))>=3 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))<4 THEN '3-4年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))>=4 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))<5 THEN '4-5年'
                     ELSE '五年以上'
                END 发生年限,
                CASE WHEN Sum_FEndBalanceFor>0 THEN Sum_FEndBalanceFor ELSE NULL END  借方,
                CASE WHEN Sum_FEndBalanceFor<0 THEN Sum_FEndBalanceFor ELSE NULL END  贷方
         FROM(
              SELECT FcstmName,FBizDate,FDescription,
                     Sum(FEndBalanceFor)over(PARTITION BY FcstmName) AS Sum_FEndBalanceFor,
                     Row_Number()over(PARTITION BY FcstmName ORDER BY FBizDate DESC ) rn
              FROM tempco)
         WHERE rn=1;
         COMMIT;
    END;
    /
      

  16.   


    --测试:
    SQL>  var cur refcursor
    SQL> EXEC  get_infoco('01.01',To_Date('2010-01-20','yyyy-mm-dd'),'1121',:cur) ;PL/SQL procedure successfully completed.SQL> print cur客户或供 摘要                           发生年限  借方  贷方
    -------- ------------------------------ -------- ----- -----
    林金兰   cxf20100108做的凭证客户林金兰  小于1年   1400
    陈凤                                      小于1年   2000SQL> 
      

  17.   

    谢谢gelyon!
    具体问题请查看链接http://fannycen.bokee.com/viewdiary.232605011.html,因为CSDN不能贴图的...
    我看了,逻辑基本上按我讲的思路来做,通过调试还有三个地方的逻辑需要修正:
    1: IF rs.FBeginBalanceFor<>rs.FEndBalanceFor AND rs.FEndBalanceFor <>0 THEN
                BEGIN...END
    里的语句:                      SELECT ROWNUM rn,T_GL_VoucherAssistRecord.FID AS FGLVARID, T_GL_VoucherAssistRecord.FBillID,T_GL_VoucherAssistRecord.FDescription,
                                          T_GL_VoucherAssistRecord.FBizDate,T_GL_Voucher.FNumber AS FVouchNum,
                                          T_GL_Voucher.FBizDate AS FVouchBizDate, T_GL_Voucher.FBookedDate AS FVouchBookedDate
                          FROM   T_GL_VoucherAssistRecord LEFT OUTER JOIN T_GL_Voucher
                                ON T_GL_VoucherAssistRecord.FBillID = T_GL_Voucher.FID
                          WHERE  T_GL_VoucherAssistRecord.FbillID IS NOT NULL
                                AND T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID
                          ORDER BY FVouchBookedDate DESC nulls last这句语句中如果有相同记账日期,还要比较T_GL_voucher的Fcreatetime字段(创建时间,timestamp类型),取最近创建时间的那条凭证。
    所以判断条件还要加上这种情况。2: --判断是否在往来账表t_gl_acctcussent中存在
                        SELECT Count(*) INTO v_count FROM  T_GL_AcctCussent WHERE T_GL_AcctCussent.FVchAssistRecordID=v_FGLVARID;这个语句还需要条件:T_GL_AcctCussent.FcompanyID 与T_org_baseUnit.fid关联取得T_org_baseUnit.Fnumber=入参ForgNum  以及T_GL_AcctCussent.FisInit=1 3:对临时表数据进行分类汇总部分:
    (1)只是按FcstmName进行了分类汇总,没有分类汇总到供应商FPrvrName.
    因为临时表tempco有一个特别:在一行记录中FcstmName/FSplrName字段不会同时有内容。要么这两个字段都为空;要么FcstmName为空而FSplrName不为空;要么FCstmName不为空而FSplrName为空。
    所以需要同时汇总FcstmName和FPrvrName.
    我不知道思路是怎么样做?
    假设临时表tempco的内容如下:
    汇总出来应该是:不知道可不可以用unit all来连接两个汇总?(2)查询日期与日期判断。我的条件是如果记账日期非空,则与FvouchBookedate相减,否则与业务日期FBizDate相减比较。当然也可以在设计临时表时设计一个临时日期字段来存储凭证的记账日期(存在凭证时),或者存储往来账导入时的业务日期(不存在凭证,初始数值是导入的),或者存储当期会计期间的结束日期FprdEndDate(不存在凭证,初始数值是手工录入),这样临时表的这几个值都可以不要。最后在分类汇总时用入参的查询日期与这个临时日期字段来比较就可以。 4:临时表tempco在分类汇总后不用删除回收吗?
      

  18.   


    --我过程代码多了,回复时候报: 回复内容过长! 
    --因此分开来
    --过程如下:
    CREATE OR REPLACE PROCEDURE get_infoco(
                                          p_ForgNum     IN  VARCHAR2       --公司      如:'01.01'
                                         ,p_FSearchDate IN  DATE           --具体日期  如:2010-1-20
                                         ,p_FAccountNum IN  VARCHAR2       --科目代码  如:1121
                                         ,resultSet     OUT sys_refcursor  --返回结果集
    )
    IS
      --定义一个类型,用来指明中间表的结果
      TYPE T_TABLE IS RECORD (
         FBalType            T_GL_AssistBalance.FBalType%TYPE,
         FOrgUnitID          T_GL_AssistBalance.FOrgUnitID%TYPE,
         FPeriodID           T_GL_AssistBalance.FPeriodID%TYPE,
         FAccountID          T_GL_AssistBalance.FAccountID%TYPE,
         FAssistGrpID        T_GL_AssistBalance.FAssistGrpID%TYPE,
         FBeginBalanceFor    T_GL_AssistBalance.FBeginBalanceFor%TYPE,
         FEndBalanceFor      T_GL_AssistBalance.FEndBalanceFor%TYPE,
         ForgNum             T_ORG_BaseUnit.FNumber%TYPE,
         ForgName            T_ORG_BaseUnit.FName_L2%TYPE,
         FPrdBegDate         T_BD_Period.FBeginDate%TYPE,
         FPrdEndDate         T_BD_Period.FEndDate%TYPE,
         FPrdNum             T_BD_Period.Fnumber%TYPE,
         FAccountNum         T_BD_AccountView.FNumber%TYPE,
         FAccountName        T_BD_AccountView.FName_L2%TYPE,
         FAccountFDC         T_BD_AccountView.FDC%TYPE,
         FHGCstmID           T_BD_AssistantHG.FCustomerID%TYPE,
         FHGPrvdID           T_BD_AssistantHG.FProviderID%TYPE,
         FCstmNum            T_BD_Customer.FNumber%TYPE,
         FCstmName           T_BD_Customer.FName_L2%TYPE,
         FSplrNum            T_BD_Supplier.FNumber%TYPE,
         FSplrName           T_BD_Supplier.FName_L2%TYPE);
    rs  T_TABLE;   --获取游标结果集的类型变量--定义游标,根据入参查询结果集
    CURSOR cur IS SELECT  DISTINCT  T_GL_AssistBalance.FBalType, T_GL_AssistBalance.FOrgUnitID, T_GL_AssistBalance.FPeriodID, T_GL_AssistBalance.FAccountID,
                          T_GL_AssistBalance.FAssistGrpID, T_GL_AssistBalance.FBeginBalanceFor, T_GL_AssistBalance.FEndBalanceFor,
                          T_ORG_BaseUnit.FNumber AS ForgNum, T_ORG_BaseUnit.FName_L2 AS ForgName, T_BD_Period.FBeginDate AS FPrdBegDate,
                          T_BD_Period.FEndDate AS FPrdEndDate, T_BD_Period.Fnumber AS FPrdNum, T_BD_AccountView.FNumber AS FAccountNum,
                          T_BD_AccountView.FName_L2 AS FAccountName, T_BD_AccountView.FDC AS FAccountFDC, T_BD_AssistantHG.FCustomerID AS FHGCstmID,
                          T_BD_AssistantHG.FProviderID AS FHGPrvdID, T_BD_Customer.FNumber AS FCstmNum, T_BD_Customer.FName_L2 AS FCstmName,
                          T_BD_Supplier.FNumber AS FSplrNum, T_BD_Supplier.FName_L2 AS FSplrName
                  FROM  T_BD_Customer RIGHT OUTER JOIN
                        T_BD_Supplier RIGHT OUTER JOIN
                        T_BD_AssistantHG ON T_BD_Supplier.FID = T_BD_AssistantHG.FProviderID ON
                        T_BD_Customer.FID = T_BD_AssistantHG.FCustomerID RIGHT OUTER JOIN
                        T_GL_AssistBalance ON T_BD_AssistantHG.FID = T_GL_AssistBalance.FAssistGrpID LEFT OUTER JOIN
                        T_BD_AccountView ON T_GL_AssistBalance.FAccountID = T_BD_AccountView.FID LEFT OUTER JOIN
                        T_BD_Period ON T_GL_AssistBalance.FPeriodID = T_BD_Period.FID LEFT OUTER JOIN
                        T_ORG_BaseUnit ON T_GL_AssistBalance.FOrgUnitID = T_ORG_BaseUnit.FID CROSS JOIN
                        T_GL_AcctCussent CROSS JOIN
                        T_GL_Voucher CROSS JOIN
                        T_GL_VoucherAssistRecord
                  WHERE T_ORG_BaseUnit.FNumber = p_ForgNum AND T_BD_ACCOUNTVIEW.Fnumber like p_FAccountNum||'%';
    --定义全局变量
    v_FGLVARID             T_GL_VoucherAssistRecord.FID%TYPE ;
    v_FBillID              T_GL_VoucherAssistRecord.FBillID%TYPE;
    v_FDescription         T_GL_VoucherAssistRecord.FDescription%TYPE;
    v_FBizDate             T_GL_VoucherAssistRecord.FBizDate%TYPE;
    v_FVouchNum            T_GL_Voucher.FNumber%TYPE;
    v_FVouchBizDate        T_GL_Voucher.FBizDate%TYPE;
    v_FVouchBookedDate     T_GL_Voucher.FBookedDate%TYPE;
    v_count  NUMBER := 0 ;  --记录是否在往来账表中存在!--过程begin
    BEGIN
         OPEN cur ;
         LOOP
            FETCH cur INTO rs ;
            EXIT WHEN cur%NOTFOUND;
            IF rs.FBeginBalanceFor<>rs.FEndBalanceFor AND rs.FEndBalanceFor <>0 THEN
                BEGIN
                    SELECT FGLVARID,  FBillID,  FDescription,  FBizDate,  FVouchNum,  FVouchBizDate,  FVouchBookedDate
                      INTO v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate,v_FVouchNum,v_FVouchBizDate,v_FVouchBookedDate
                    FROM (
                          SELECT ROWNUM rn,T_GL_VoucherAssistRecord.FID AS FGLVARID, T_GL_VoucherAssistRecord.FBillID,T_GL_VoucherAssistRecord.FDescription,
                                          T_GL_VoucherAssistRecord.FBizDate,T_GL_Voucher.FNumber AS FVouchNum,
                                          T_GL_Voucher.FBizDate AS FVouchBizDate, T_GL_Voucher.FBookedDate AS FVouchBookedDate
                          FROM   T_GL_VoucherAssistRecord LEFT OUTER JOIN T_GL_Voucher
                                ON T_GL_VoucherAssistRecord.FBillID = T_GL_Voucher.FID
                          WHERE  T_GL_VoucherAssistRecord.FbillID IS NOT NULL
                                AND T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID
                          ORDER BY FVouchBookedDate DESC nulls last  --这里由于测试数据里T_GL_voucher里没有Fcreatetime这个字段,你自己测试的时候再加上 ORDER BY FVouchBookedDate DESC nulls last,Fcreatetime DESC nulls last
                    )WHERE rn=1;
                    --向临时表插入数据:
                    INSERT INTO tempco(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,
                                      FGLVARID,FBillID,FDescription,FBizDate,FVouchNum,FVouchBizDate,FVouchBookedDate)
                               VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,
                                      v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate,v_FVouchNum,v_FVouchBizDate,v_FVouchBookedDate);
                EXCEPTION WHEN no_data_found THEN
                         Raise_Application_Error('-20001','can not find data in T_GL_VoucherAssistRecord where FAssistGrpID='||rs.FAssistGrpID);
                END;
            END IF;
            IF rs.FBeginBalanceFor<>0 AND rs.FEndBalanceFor = rs.FEndBalanceFor THEN
               BEGIN
                    FOR rst IN (
                        SELECT   T_GL_VoucherAssistRecord.FID AS FGLVARID, T_GL_VoucherAssistRecord.FBillID,
                                T_GL_VoucherAssistRecord.FDescription,T_GL_VoucherAssistRecord.FBizDate
                        FROM  T_GL_VoucherAssistRecord
                        WHERE T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID )
                    LOOP
                        v_FGLVARID     := rst.FGLVARID;
                        v_FBillID      := rst.FBillID;
                        v_FDescription := rst.FDescription;
                        v_FBizDate     := rst.FBizDate;
                        --逐笔循环判断是否在往来账表t_gl_acctcussent中存在
                        SELECT Count(*) INTO v_count FROM  T_GL_AcctCussent WHERE T_GL_AcctCussent.FVchAssistRecordID=v_FGLVARID AND T_GL_AcctCussent.FisInit=1
                        AND EXISTS (SELECT 1 FROM T_org_baseUnit WHERE T_GL_AcctCussent.FcompanyID=T_org_baseUnit.Fid AND T_org_baseUnit.Fnumber=p_ForgNum);                    IF v_count>0 THEN
                            --存在 向临时表插入数据:
                            INSERT INTO tempco(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,
                                              FGLVARID,FBillID,FDescription,FBizDate)
                                      VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,
                                              v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate);
                        ELSE
                            --不存在 向临时表插入数据:
                            INSERT INTO tempco(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,FBizDate)
                                      VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,rs.FPrdEndDate);
                        END IF ;
                    END LOOP;
               EXCEPTION WHEN no_data_found THEN
                         Raise_Application_Error('-20002','can not find data in T_GL_VoucherAssistRecord where FAssistGrpID='||rs.FAssistGrpID);
               END;
            END IF;
         END LOOP;
         CLOSE cur;--未完,接下面
      

  19.   


    --接上面!     --最后对临时表数据进行分类汇总
         OPEN resultSet FOR
         SELECT Fcstm_FSplr_Name 客户或供应商,
                FDescription 摘要,
                Decode(FvouchbookedDate,NULL,
                       CASE WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy')) <1 THEN '小于1年'
                            WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))>=1 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))<2 THEN '1-2年'
                            WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))>=2 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))<3 THEN '2-3年'
                            WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))>=3 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))<4 THEN '3-4年'
                            WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))>=4 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(FBizDate,'yyyy'))<5 THEN '4-5年'
                            ELSE '五年以上'
                       END ,
                       CASE WHEN (Trunc(FvouchbookedDate,'yyyy')-Trunc(FBizDate,'yyyy')) <1 THEN '小于1年'
                            WHEN (Trunc(FvouchbookedDate,'yyyy')-Trunc(FBizDate,'yyyy'))>=1 AND (Trunc(FvouchbookedDate,'yyyy')-Trunc(FBizDate,'yyyy'))<2 THEN '1-2年'
                            WHEN (Trunc(FvouchbookedDate,'yyyy')-Trunc(FBizDate,'yyyy'))>=2 AND (Trunc(FvouchbookedDate,'yyyy')-Trunc(FBizDate,'yyyy'))<3 THEN '2-3年'
                            WHEN (Trunc(FvouchbookedDate,'yyyy')-Trunc(FBizDate,'yyyy'))>=3 AND (Trunc(FvouchbookedDate,'yyyy')-Trunc(FBizDate,'yyyy'))<4 THEN '3-4年'
                            WHEN (Trunc(FvouchbookedDate,'yyyy')-Trunc(FBizDate,'yyyy'))>=4 AND (Trunc(FvouchbookedDate,'yyyy')-Trunc(FBizDate,'yyyy'))<5 THEN '4-5年'
                            ELSE '五年以上'
                       END ) 发生年限,
                CASE WHEN Sum_FEndBalanceFor>0 THEN Sum_FEndBalanceFor ELSE NULL END  借方,
                CASE WHEN Sum_FEndBalanceFor<0 THEN Abs(Sum_FEndBalanceFor) ELSE NULL END  贷方
         FROM(
              SELECT Nvl(FcstmName,FSplrName) Fcstm_FSplr_Name,FvouchbookedDate,FBizDate,FDescription,
                     Sum(FEndBalanceFor)over(PARTITION BY Nvl(FcstmName,FSplrName)) AS Sum_FEndBalanceFor,
                     Row_Number()over(PARTITION BY Nvl(FcstmName,FSplrName) ORDER BY FBizDate DESC ) rn
              FROM tempco WHERE FcstmName IS NOT NULL OR FSplrName IS NOT NULL )
         WHERE rn=1;
         COMMIT;
    END;
    /--存储过程到此结果!
      

  20.   

    --测试:
    Connected to:
    Oracle Database 10g Release 10.1.0.2.0 - ProductionSQL> set serveroutput on
    SQL> set linesize 32767
    SQL> col 客户或供应商 format a20
    SQL> col 摘要 format a40
    SQL> col 发生年限 format a20
    SQL> col 借方 format 999999
    SQL> col 贷方 format 999999
    SQL> var cur refcursor
    SQL> EXEC  get_infoco('01.01',To_Date('2010-01-20','yyyy-mm-dd'),'%',:cur) ;PL/SQL procedure successfully completed.
    SQL> print cur客户或供应商         摘要                                     发生年限                借方    贷方
    -------------------- ---------------------------------------- -------------------- ------- -------
    广东世源集团         20101213做的凭证辅助账                   小于1年                         4800
    林金兰               cxf20100108做的凭证客户林金兰            小于1年                  700
    陈凤                 20101213做的凭证                          小于1年                 5800
    SQL> conn ucnzp/ucnzp@cdfn01
    Connected.
    SQL> EXEC  get_infoco('01.01',To_Date('2010-01-20','yyyy-mm-dd'),'1121',:cur) ;PL/SQL procedure successfully completed.SQL> print cur客户或供应商         摘要                                     发生年限                借方    贷方
    -------------------- ---------------------------------------- -------------------- ------- -------
    林金兰               cxf20100108做的凭证客户林金兰            小于1年                  700
    陈凤                                                            小于1年                 1000SQL> 
      

  21.   

    回gelyon,我直接拷你的存储过程想运行,老提示"ora-00900:invalid sql statement"错误,定位在
    rs  T_TABLE;  --获取游标结果集的类型变量
    ---定义游标,根据入参查询结果集
    CURSO
    这是怎么一回事呢?
      

  22.   


    --我这里不会有错啊,我是用工具SQLTools创建的,SQLPLUS中我也能创建成功,
    --可能是游标申明必须在类型变量申明之前吧,你将rs T_table 这个申明写到 cursor申明后面试试--这样吧,我来总结下,下面是总结版,最终版,你直接按照下面来测试就行了,前面回复的都不管
    --由于回复内容比较长,分开回复--第一步:创建会话级临时表DROP TABLE tempco;CREATE global temporary TABLE tempco
    (
         FAssistGrpID        VARCHAR2(44),
         FBeginBalanceFor    NUMBER(19,4),
         FEndBalanceFor      NUMBER(19,4),
         FCstmNum            NVARCHAR2(80) ,
         FCstmName           NVARCHAR2(255),
         FSplrNum            NVARCHAR2(80) ,
         FSplrName           NVARCHAR2(255),
         ForgNum             NVARCHAR2(80),
         ForgName            NVARCHAR2(255),
         FPrdBegDate         TIMESTAMP(6),
         FPrdEndDate         TIMESTAMP(6),
         FGLVARID            VARCHAR2(44),
         FBillID             VARCHAR2(44),
         FDescription        NVARCHAR2(200),
         FBizDate            TIMESTAMP(6),
         FVouchNum           NVARCHAR2(80),
         FVouchBizDate       TIMESTAMP(6) ,
         FVouchBookedDate    TIMESTAMP(6)
    ) on commit preserve rows ;--第二步:创建过程:
    CREATE OR REPLACE PROCEDURE get_infoco(
                                          p_ForgNum     IN  VARCHAR2       --公司      如:'01.01'
                                         ,p_FSearchDate IN  DATE           --具体日期  如:2010-1-20
                                         ,p_FAccountNum IN  VARCHAR2       --科目代码  如:1121
                                         ,resultSet     OUT sys_refcursor  --返回结果集
    )
    IS
      --定义一个类型,用来指明中间表的结果
      TYPE T_TABLE IS RECORD (
         FBalType            T_GL_AssistBalance.FBalType%TYPE,
         FOrgUnitID          T_GL_AssistBalance.FOrgUnitID%TYPE,
         FPeriodID           T_GL_AssistBalance.FPeriodID%TYPE,
         FAccountID          T_GL_AssistBalance.FAccountID%TYPE,
         FAssistGrpID        T_GL_AssistBalance.FAssistGrpID%TYPE,
         FBeginBalanceFor    T_GL_AssistBalance.FBeginBalanceFor%TYPE,
         FEndBalanceFor      T_GL_AssistBalance.FEndBalanceFor%TYPE,
         ForgNum             T_ORG_BaseUnit.FNumber%TYPE,
         ForgName            T_ORG_BaseUnit.FName_L2%TYPE,
         FPrdBegDate         T_BD_Period.FBeginDate%TYPE,
         FPrdEndDate         T_BD_Period.FEndDate%TYPE,
         FPrdNum             T_BD_Period.Fnumber%TYPE,
         FAccountNum         T_BD_AccountView.FNumber%TYPE,
         FAccountName        T_BD_AccountView.FName_L2%TYPE,
         FAccountFDC         T_BD_AccountView.FDC%TYPE,
         FHGCstmID           T_BD_AssistantHG.FCustomerID%TYPE,
         FHGPrvdID           T_BD_AssistantHG.FProviderID%TYPE,
         FCstmNum            T_BD_Customer.FNumber%TYPE,
         FCstmName           T_BD_Customer.FName_L2%TYPE,
         FSplrNum            T_BD_Supplier.FNumber%TYPE,
         FSplrName           T_BD_Supplier.FName_L2%TYPE);
    rs  T_TABLE;   --获取游标结果集的类型变量
    --定义游标,根据入参查询结果集
    CURSOR cur IS SELECT  DISTINCT  T_GL_AssistBalance.FBalType, T_GL_AssistBalance.FOrgUnitID, T_GL_AssistBalance.FPeriodID, T_GL_AssistBalance.FAccountID,
                          T_GL_AssistBalance.FAssistGrpID, T_GL_AssistBalance.FBeginBalanceFor, T_GL_AssistBalance.FEndBalanceFor,
                          T_ORG_BaseUnit.FNumber AS ForgNum, T_ORG_BaseUnit.FName_L2 AS ForgName, T_BD_Period.FBeginDate AS FPrdBegDate,
                          T_BD_Period.FEndDate AS FPrdEndDate, T_BD_Period.Fnumber AS FPrdNum, T_BD_AccountView.FNumber AS FAccountNum,
                          T_BD_AccountView.FName_L2 AS FAccountName, T_BD_AccountView.FDC AS FAccountFDC, T_BD_AssistantHG.FCustomerID AS FHGCstmID,
                          T_BD_AssistantHG.FProviderID AS FHGPrvdID, T_BD_Customer.FNumber AS FCstmNum, T_BD_Customer.FName_L2 AS FCstmName,
                          T_BD_Supplier.FNumber AS FSplrNum, T_BD_Supplier.FName_L2 AS FSplrName
                  FROM  T_BD_Customer RIGHT OUTER JOIN
                        T_BD_Supplier RIGHT OUTER JOIN
                        T_BD_AssistantHG ON T_BD_Supplier.FID = T_BD_AssistantHG.FProviderID ON
                        T_BD_Customer.FID = T_BD_AssistantHG.FCustomerID RIGHT OUTER JOIN
                        T_GL_AssistBalance ON T_BD_AssistantHG.FID = T_GL_AssistBalance.FAssistGrpID LEFT OUTER JOIN
                        T_BD_AccountView ON T_GL_AssistBalance.FAccountID = T_BD_AccountView.FID LEFT OUTER JOIN
                        T_BD_Period ON T_GL_AssistBalance.FPeriodID = T_BD_Period.FID LEFT OUTER JOIN
                        T_ORG_BaseUnit ON T_GL_AssistBalance.FOrgUnitID = T_ORG_BaseUnit.FID CROSS JOIN
                        T_GL_AcctCussent CROSS JOIN
                        T_GL_Voucher CROSS JOIN
                        T_GL_VoucherAssistRecord
                  WHERE T_ORG_BaseUnit.FNumber = p_ForgNum AND T_BD_ACCOUNTVIEW.Fnumber like p_FAccountNum||'%';--定义全局变量
    v_FGLVARID             T_GL_VoucherAssistRecord.FID%TYPE ;
    v_FBillID              T_GL_VoucherAssistRecord.FBillID%TYPE;
    v_FDescription         T_GL_VoucherAssistRecord.FDescription%TYPE;
    v_FBizDate             T_GL_VoucherAssistRecord.FBizDate%TYPE;
    v_FVouchNum            T_GL_Voucher.FNumber%TYPE;
    v_FVouchBizDate        T_GL_Voucher.FBizDate%TYPE;
    v_FVouchBookedDate     T_GL_Voucher.FBookedDate%TYPE;
    v_count  NUMBER := 0 ;  --记录是否在往来账表中存在!--过程begin
    BEGIN
         OPEN cur ;
         LOOP
            FETCH cur INTO rs ;
            EXIT WHEN cur%NOTFOUND;
            IF rs.FBeginBalanceFor<>rs.FEndBalanceFor AND rs.FEndBalanceFor <>0 THEN
                BEGIN
                    SELECT FGLVARID,  FBillID,  FDescription,  FBizDate,  FVouchNum,  FVouchBizDate,  FVouchBookedDate
                      INTO v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate,v_FVouchNum,v_FVouchBizDate,v_FVouchBookedDate
                    FROM (
                          SELECT ROWNUM rn,T_GL_VoucherAssistRecord.FID AS FGLVARID, T_GL_VoucherAssistRecord.FBillID,T_GL_VoucherAssistRecord.FDescription,
                                          T_GL_VoucherAssistRecord.FBizDate,T_GL_Voucher.FNumber AS FVouchNum,
                                          T_GL_Voucher.FBizDate AS FVouchBizDate, T_GL_Voucher.FBookedDate AS FVouchBookedDate
                          FROM   T_GL_VoucherAssistRecord LEFT OUTER JOIN T_GL_Voucher
                                ON T_GL_VoucherAssistRecord.FBillID = T_GL_Voucher.FID
                          WHERE  T_GL_VoucherAssistRecord.FbillID IS NOT NULL
                                AND T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID
                          ORDER BY FVouchBookedDate DESC nulls last
                          --这里由于测试数据里T_GL_voucher里没有Fcreatetime这个字段,你自己测试的时候再加上 ORDER BY FVouchBookedDate DESC nulls last,Fcreatetime DESC nulls last
                    )WHERE rn=1;
                    --向临时表插入数据:
                    INSERT INTO tempco(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,
                                      FGLVARID,FBillID,FDescription,FBizDate,FVouchNum,FVouchBizDate,FVouchBookedDate)
                               VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,
                                      v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate,v_FVouchNum,v_FVouchBizDate,v_FVouchBookedDate);
                EXCEPTION WHEN no_data_found THEN
                         Raise_Application_Error('-20001','can not find data in T_GL_VoucherAssistRecord where FAssistGrpID='||rs.FAssistGrpID);
                END;
            END IF;
            IF rs.FBeginBalanceFor<>0 AND rs.FEndBalanceFor = rs.FEndBalanceFor THEN
               BEGIN
                    FOR rst IN (
                        SELECT   T_GL_VoucherAssistRecord.FID AS FGLVARID, T_GL_VoucherAssistRecord.FBillID,
                                T_GL_VoucherAssistRecord.FDescription,T_GL_VoucherAssistRecord.FBizDate
                        FROM  T_GL_VoucherAssistRecord
                        WHERE T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID )
                    LOOP
                        v_FGLVARID     := rst.FGLVARID;
                        v_FBillID      := rst.FBillID;
                        v_FDescription := rst.FDescription;
                        v_FBizDate     := rst.FBizDate;
                        --逐笔循环判断
                        --判断是否在往来账表t_gl_acctcussent中存在
                        SELECT Count(*) INTO v_count FROM  T_GL_AcctCussent WHERE T_GL_AcctCussent.FVchAssistRecordID=v_FGLVARID AND T_GL_AcctCussent.FisInit=1
                        AND EXISTS (SELECT 1 FROM T_org_baseUnit WHERE T_GL_AcctCussent.FcompanyID=T_org_baseUnit.Fid AND T_org_baseUnit.Fnumber=p_ForgNum);                    IF v_count>0 THEN
                            --存在 向临时表插入数据:
                            INSERT INTO tempco(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,
                                              FGLVARID,FBillID,FDescription,FBizDate)
                                      VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,
                                              v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate);
                        ELSE
                            --不存在 向临时表插入数据:
                            INSERT INTO tempco(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,FBizDate)
                                      VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,rs.FPrdEndDate);
                        END IF ;
                    END LOOP;
               EXCEPTION WHEN no_data_found THEN
                         Raise_Application_Error('-20002','can not find data in T_GL_VoucherAssistRecord where FAssistGrpID='||rs.FAssistGrpID);
               END;
            END IF;
         END LOOP;
         CLOSE cur;--过程未完,接下面
      

  23.   


    --过程继续,接上面
         --最后对临时表数据进行分类汇总
         --这里我修改了下,根据Nvl(FvouchbookedDate,p_FSearchDate)来判断发生年限,减少了代码量
         OPEN resultSet FOR
         SELECT Fcstm_FSplr_Name 客户或供应商,
                FDescription 摘要,
                CASE WHEN (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy')) <1 THEN '小于1年'
                     WHEN (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy'))>=1 AND (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy'))<2 THEN '1-2年'
                     WHEN (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy'))>=2 AND (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy'))<3 THEN '2-3年'
                     WHEN (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy'))>=3 AND (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy'))<4 THEN '3-4年'
                     WHEN (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy'))>=4 AND (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy'))<5 THEN '4-5年'
                     ELSE '五年以上'
                END  发生年限       ,
                CASE WHEN Sum_FEndBalanceFor>0 THEN Sum_FEndBalanceFor ELSE NULL END  借方,
                CASE WHEN Sum_FEndBalanceFor<0 THEN Abs(Sum_FEndBalanceFor) ELSE NULL END  贷方
         FROM(
              SELECT Nvl(FcstmName,FSplrName) Fcstm_FSplr_Name,FvouchbookedDate,FBizDate,FDescription,
                     Sum(FEndBalanceFor)over(PARTITION BY Nvl(FcstmName,FSplrName)) AS Sum_FEndBalanceFor,
                     Row_Number()over(PARTITION BY Nvl(FcstmName,FSplrName) ORDER BY FBizDate DESC ) rn
              FROM tempco WHERE FcstmName IS NOT NULL OR FSplrName IS NOT NULL )
         WHERE rn=1;
         COMMIT;
    END;
    /--过程到此结束!
    --准备工作也已完成,下面是测试!--第三步:测试:--SQLPLUS下测试:
    Connected to:
    Oracle Database 10g Release 10.1.0.2.0 - ProductionSQL> set serveroutput on
    SQL> set linesize 32767
    SQL> col 客户或供应商 format a20
    SQL> col 摘要 format a40
    SQL> col 发生年限 format a20
    SQL> col 借方 format 999999
    SQL> col 贷方 format 999999
    SQL> var cur refcursor
    SQL> EXEC  get_infoco('01.01',To_Date('2010-01-20','yyyy-mm-dd'),'%',:cur) ;PL/SQL procedure successfully completed.
    SQL> print cur客户或供应商         摘要                                     发生年限                借方    贷方
    -------------------- ---------------------------------------- -------------------- ------- -------
    广东世源集团         20101213做的凭证辅助账                   小于1年                         4800
    林金兰               cxf20100108做的凭证客户林金兰            小于1年                  700
    陈凤                 20101213做的凭证                         小于1年                 5800
    SQL> conn ucnzp/ucnzp@cdfn01
    Connected.
    SQL> EXEC  get_infoco('01.01',To_Date('2010-01-20','yyyy-mm-dd'),'1121',:cur) ;PL/SQL procedure successfully completed.SQL> print cur客户或供应商         摘要                                     发生年限                借方    贷方
    -------------------- ---------------------------------------- -------------------- ------- -------
    林金兰               cxf20100108做的凭证客户林金兰            小于1年                  700
    陈凤                                                           小于1年                 1000SQL> 
      

  24.   

    回paddy,结构基本完整,谢谢。经测试有一些需要加强判断:
    1)        IF rs.FBeginBalanceFor<>0 AND rs.FEndBalanceFor = rs.FEndBalanceFor THEN
               BEGIN
                    FOR rst IN (
                        SELECT   T_GL_VoucherAssistRecord.FID AS FGLVARID, T_GL_VoucherAssistRecord.FBillID,
                                T_GL_VoucherAssistRecord.FDescription,T_GL_VoucherAssistRecord.FBizDate
                        FROM  T_GL_VoucherAssistRecord
                        WHERE T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID )
    这里的select ....from t_gl_voucherAssistRecord where ...筛出来可能会是空的。这个需要做判断一下,如果为空那就直接插入临时表,跳到下面部分的语句,否则按按步执行:--不存在 向临时表插入数据:
    INSERT INTO gxyjTemptable(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,FBizDate)
                                      VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,rs.FPrdEndDate);
      

  25.   

    2)        --第一种情况:如果辅助账余额表的初始余额与期末余额不一致,而且期末余额不为0.则表示该条记录肯定有凭证存在.因为期末余额=期初余额+多张凭证辅助账数额
          ---需要反查到关联了 多少张凭证,并取出这些凭证记账日期是最新的那条凭证记录;如果相同记账日期有多条,则取创建时间最新的那条凭证.
          IF rs.FBeginBalanceFor<>rs.FEndBalanceFor AND rs.FEndBalanceFor <>0 THEN
                BEGIN
                    SELECT FGLVARID,  FBillID,  FDescription,  FBizDate,  FVouchNum,  FVouchBizDate,  FVouchBookedDate
                      INTO v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate,v_FVouchNum,v_FVouchBizDate,v_FVouchBookedDate
                    FROM (
                          SELECT ROWNUM rn,T_GL_VoucherAssistRecord.FID AS FGLVARID, T_GL_VoucherAssistRecord.FBillID,T_GL_VoucherAssistRecord.FDescription,
                                          T_GL_VoucherAssistRecord.FBizDate,T_GL_Voucher.FNumber AS FVouchNum,
                                          T_GL_Voucher.FBizDate AS FVouchBizDate, T_GL_Voucher.FBookedDate AS FVouchBookedDate
                          FROM   T_GL_VoucherAssistRecord LEFT OUTER JOIN T_GL_Voucher
                                ON T_GL_VoucherAssistRecord.FBillID = T_GL_Voucher.FID
                          WHERE   T_GL_Voucher.FBizStatus=5 and T_GL_VoucherAssistRecord.FbillID IS NOT NULL
                                AND T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID
                           ORDER BY FVouchBookedDate DESC nulls last , T_GL_Voucher.Fcreatetime DESC nulls last
                    )WHERE rn=1;
    这里的orderby 我这样写得对不对?因为Fcreatetime并不在select 后。
    我这边还需要加一个条件.即T_GL_voucher.FcompanyID 关联 T_org_baseUnit.FID 取T_org_baseUnit.Fnumber=入参p_ForgNum
    3)汇总部分:
    CASE WHEN (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy')) <1 THEN '小于1年'
                     WHEN (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy'))>=1 AND (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy'))<2 THEN '1-2年'
                     WHEN (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy'))>=2 AND (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy'))<3 THEN '2-3年'
                     WHEN (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy'))>=3 AND (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy'))<4 THEN '3-4年'
                     WHEN (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy'))>=4 AND (Trunc(Nvl(FvouchbookedDate,p_FSearchDate),'yyyy')-Trunc(FBizDate,'yyyy'))<5 THEN '4-5年'
                     ELSE '五年以上'
                END  发生年限    这里,条件应该是:如果FvouchBookedDate为空,则year(P_FsearchDate)-year(FBizDate)
    如果FvouchBookedDate非空,取year(P_FsearchDate)-year(vouchBookedDate)
      

  26.   

    呵呵,paddy确实是oracle开发高手呀~~挺厉害!
      

  27.   


    --ok~\(≧▽≦)/~啦啦啦
    --你再测试下:CREATE OR REPLACE PROCEDURE get_infoco(
                                          p_ForgNum     IN  VARCHAR2       --公司      如:'01.01'
                                         ,p_FSearchDate IN  DATE           --具体日期  如:2010-1-20
                                         ,p_FAccountNum IN  VARCHAR2       --科目代码  如:1121
                                         ,resultSet     OUT sys_refcursor  --返回结果集
    )
    IS
      --定义一个类型,用来指明中间表的结果
      TYPE T_TABLE IS RECORD (
         FBalType            T_GL_AssistBalance.FBalType%TYPE,
         FOrgUnitID          T_GL_AssistBalance.FOrgUnitID%TYPE,
         FPeriodID           T_GL_AssistBalance.FPeriodID%TYPE,
         FAccountID          T_GL_AssistBalance.FAccountID%TYPE,
         FAssistGrpID        T_GL_AssistBalance.FAssistGrpID%TYPE,
         FBeginBalanceFor    T_GL_AssistBalance.FBeginBalanceFor%TYPE,
         FEndBalanceFor      T_GL_AssistBalance.FEndBalanceFor%TYPE,
         ForgNum             T_ORG_BaseUnit.FNumber%TYPE,
         ForgName            T_ORG_BaseUnit.FName_L2%TYPE,
         FPrdBegDate         T_BD_Period.FBeginDate%TYPE,
         FPrdEndDate         T_BD_Period.FEndDate%TYPE,
         FPrdNum             T_BD_Period.Fnumber%TYPE,
         FAccountNum         T_BD_AccountView.FNumber%TYPE,
         FAccountName        T_BD_AccountView.FName_L2%TYPE,
         FAccountFDC         T_BD_AccountView.FDC%TYPE,
         FHGCstmID           T_BD_AssistantHG.FCustomerID%TYPE,
         FHGPrvdID           T_BD_AssistantHG.FProviderID%TYPE,
         FCstmNum            T_BD_Customer.FNumber%TYPE,
         FCstmName           T_BD_Customer.FName_L2%TYPE,
         FSplrNum            T_BD_Supplier.FNumber%TYPE,
         FSplrName           T_BD_Supplier.FName_L2%TYPE);
    rs  T_TABLE;   --获取游标结果集的类型变量
    --定义游标,根据入参查询结果集
    CURSOR cur IS SELECT  DISTINCT  T_GL_AssistBalance.FBalType, T_GL_AssistBalance.FOrgUnitID, T_GL_AssistBalance.FPeriodID, T_GL_AssistBalance.FAccountID,
                          T_GL_AssistBalance.FAssistGrpID, T_GL_AssistBalance.FBeginBalanceFor, T_GL_AssistBalance.FEndBalanceFor,
                          T_ORG_BaseUnit.FNumber AS ForgNum, T_ORG_BaseUnit.FName_L2 AS ForgName, T_BD_Period.FBeginDate AS FPrdBegDate,
                          T_BD_Period.FEndDate AS FPrdEndDate, T_BD_Period.Fnumber AS FPrdNum, T_BD_AccountView.FNumber AS FAccountNum,
                          T_BD_AccountView.FName_L2 AS FAccountName, T_BD_AccountView.FDC AS FAccountFDC, T_BD_AssistantHG.FCustomerID AS FHGCstmID,
                          T_BD_AssistantHG.FProviderID AS FHGPrvdID, T_BD_Customer.FNumber AS FCstmNum, T_BD_Customer.FName_L2 AS FCstmName,
                          T_BD_Supplier.FNumber AS FSplrNum, T_BD_Supplier.FName_L2 AS FSplrName
                  FROM  T_BD_Customer RIGHT OUTER JOIN
                        T_BD_Supplier RIGHT OUTER JOIN
                        T_BD_AssistantHG ON T_BD_Supplier.FID = T_BD_AssistantHG.FProviderID ON
                        T_BD_Customer.FID = T_BD_AssistantHG.FCustomerID RIGHT OUTER JOIN
                        T_GL_AssistBalance ON T_BD_AssistantHG.FID = T_GL_AssistBalance.FAssistGrpID LEFT OUTER JOIN
                        T_BD_AccountView ON T_GL_AssistBalance.FAccountID = T_BD_AccountView.FID LEFT OUTER JOIN
                        T_BD_Period ON T_GL_AssistBalance.FPeriodID = T_BD_Period.FID LEFT OUTER JOIN
                        T_ORG_BaseUnit ON T_GL_AssistBalance.FOrgUnitID = T_ORG_BaseUnit.FID CROSS JOIN
                        T_GL_AcctCussent CROSS JOIN
                        T_GL_Voucher CROSS JOIN
                        T_GL_VoucherAssistRecord
                  WHERE T_ORG_BaseUnit.FNumber = p_ForgNum AND T_BD_ACCOUNTVIEW.Fnumber like p_FAccountNum||'%';--定义全局变量
    v_FGLVARID             T_GL_VoucherAssistRecord.FID%TYPE ;
    v_FBillID              T_GL_VoucherAssistRecord.FBillID%TYPE;
    v_FDescription         T_GL_VoucherAssistRecord.FDescription%TYPE;
    v_FBizDate             T_GL_VoucherAssistRecord.FBizDate%TYPE;
    v_FVouchNum            T_GL_Voucher.FNumber%TYPE;
    v_FVouchBizDate        T_GL_Voucher.FBizDate%TYPE;
    v_FVouchBookedDate     T_GL_Voucher.FBookedDate%TYPE;
    v_count  NUMBER := 0 ;  --记录是否在往来账表中存在!
    v_cnt    NUMBER := 0 ;  --判断每笔rs.FAssistGrpID是否在T_GL_VoucherAssistRecord表中存在!--过程begin
    BEGIN
         OPEN cur ;
         LOOP
            FETCH cur INTO rs ;
            EXIT WHEN cur%NOTFOUND;
            IF rs.FBeginBalanceFor<>rs.FEndBalanceFor AND rs.FEndBalanceFor <>0 THEN
                BEGIN
                    SELECT FGLVARID,  FBillID,  FDescription,  FBizDate,  FVouchNum,  FVouchBizDate,  FVouchBookedDate
                      INTO v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate,v_FVouchNum,v_FVouchBizDate,v_FVouchBookedDate
                    FROM (
                          SELECT ROWNUM rn,T_GL_VoucherAssistRecord.FID AS FGLVARID, T_GL_VoucherAssistRecord.FBillID,T_GL_VoucherAssistRecord.FDescription,
                                          T_GL_VoucherAssistRecord.FBizDate,T_GL_Voucher.FNumber AS FVouchNum,
                                          T_GL_Voucher.FBizDate AS FVouchBizDate, T_GL_Voucher.FBookedDate AS FVouchBookedDate
                          FROM   T_GL_VoucherAssistRecord LEFT OUTER JOIN T_GL_Voucher
                                ON T_GL_VoucherAssistRecord.FBillID = T_GL_Voucher.FID
                          WHERE  T_GL_VoucherAssistRecord.FbillID IS NOT NULL
                                AND T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID
                          ORDER BY FVouchBookedDate DESC nulls last
                          --这里由于测试数据里T_GL_voucher里没有Fcreatetime这个字段,你自己测试的时候再加上 ORDER BY FVouchBookedDate DESC nulls last,Fcreatetime DESC nulls last
                    )WHERE rn=1;
                    --向临时表插入数据:
                    INSERT INTO tempco(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,
                                      FGLVARID,FBillID,FDescription,FBizDate,FVouchNum,FVouchBizDate,FVouchBookedDate)
                               VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,
                                      v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate,v_FVouchNum,v_FVouchBizDate,v_FVouchBookedDate);
                EXCEPTION WHEN no_data_found THEN
                         Raise_Application_Error('-20001','can not find data in T_GL_VoucherAssistRecord where FAssistGrpID='||rs.FAssistGrpID);
                END;
            END IF;
            IF rs.FBeginBalanceFor<>0 AND rs.FEndBalanceFor = rs.FEndBalanceFor THEN
               BEGIN
                    --判断每笔rs.FAssistGrpID是否在T_GL_VoucherAssistRecord表中存在!
                    SELECT Count(*) INTO v_cnt FROM  T_GL_VoucherAssistRecord WHERE T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID;                --存在 逐笔循环再判断是否在往来账表t_gl_acctcussent中存在
                    IF v_cnt >0 THEN
                          FOR rst IN (
                              SELECT   T_GL_VoucherAssistRecord.FID AS FGLVARID, T_GL_VoucherAssistRecord.FBillID,
                                      T_GL_VoucherAssistRecord.FDescription,T_GL_VoucherAssistRecord.FBizDate
                              FROM  T_GL_VoucherAssistRecord
                              WHERE T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID )
                          LOOP
                              v_FGLVARID     := rst.FGLVARID;
                              v_FBillID      := rst.FBillID;
                              v_FDescription := rst.FDescription;
                              v_FBizDate     := rst.FBizDate;
                              --逐笔循环判断
                              --判断是否在往来账表t_gl_acctcussent中存在
                              SELECT Count(*) INTO v_count FROM  T_GL_AcctCussent WHERE T_GL_AcctCussent.FVchAssistRecordID=v_FGLVARID AND T_GL_AcctCussent.FisInit=1
                              AND EXISTS (SELECT 1 FROM T_org_baseUnit WHERE T_GL_AcctCussent.FcompanyID=T_org_baseUnit.Fid AND T_org_baseUnit.Fnumber=p_ForgNum);                          IF v_count>0 THEN
                                  --存在 向临时表插入数据:
                                  INSERT INTO tempco(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,
                                                    FGLVARID,FBillID,FDescription,FBizDate)
                                             VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,
                                                    v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate);
                              ELSE
                                  --不存在 向临时表插入数据:
                                  INSERT INTO tempco(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,FBizDate)
                                             VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,rs.FPrdEndDate);
                              END IF ;
                        END LOOP;
                    ELSE  --v_cnt = 0 直接将该笔rs.FAssistGrpID插入临时表
                        INSERT INTO tempco(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FCstmNum,FCstmName,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,FBizDate)
                                   VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FCstmNum,rs.FCstmName,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,rs.FPrdEndDate);
                 END IF;           EXCEPTION WHEN others THEN
                         Raise_Application_Error('-20002','can not find data in T_GL_VoucherAssistRecord where FAssistGrpID='||rs.FAssistGrpID);
               END;
            END IF;
         END LOOP;
         CLOSE cur;--未完,接下面
      

  28.   


    --接上面!     --最后对临时表数据进行分类汇总
         --这里的发生年限按照你信需求修改了
         OPEN resultSet FOR
         SELECT Fcstm_FSplr_Name 客户或供应商,
                FDescription 摘要,
                CASE WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy')) <1 THEN '小于1年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))>=1 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))<2 THEN '1-2年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))>=2 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))<3 THEN '2-3年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))>=3 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))<4 THEN '3-4年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))>=4 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))<5 THEN '4-5年'
                     ELSE '五年以上'
                END  发生年限  ,
                CASE WHEN Sum_FEndBalanceFor>0 THEN Sum_FEndBalanceFor ELSE NULL END  借方,
                CASE WHEN Sum_FEndBalanceFor<0 THEN Abs(Sum_FEndBalanceFor) ELSE NULL END  贷方
         FROM(
              SELECT Nvl(FcstmName,FSplrName) Fcstm_FSplr_Name,FvouchbookedDate,FBizDate,FDescription,
                     Sum(FEndBalanceFor)over(PARTITION BY Nvl(FcstmName,FSplrName)) AS Sum_FEndBalanceFor,
                     Row_Number()over(PARTITION BY Nvl(FcstmName,FSplrName) ORDER BY FBizDate DESC ) rn
              FROM tempco WHERE FcstmName IS NOT NULL OR FSplrName IS NOT NULL )
         WHERE rn=1;
         COMMIT;
    END;
    /--过程结束!
      

  29.   

    paddy辛苦了!不胜感激!经过实际数据测试,发现我之前的逻辑不完整,分类汇总还需要再加上另一个表T_GL_initAssistBalance的汇总值。
    T_GL_initAssistBalance的测试数据如下:--辅助账初始化表T_GL_initASSISTBALANCE
    --字段说明(依次):单位ID(T_GL_initASSISTBALANCE.ForgUnitID=T_org_baseUnit.Fid)、、科目ID(FAccountID=T_bd_AccountView.FID)、辅助账横表ID
    (FAssistgrpID=t_bd_assistantHG.FID)、期初余额、期末累计余额create table T_GL_initASSISTBALANCE
    (
      FORGUNITID         VARCHAR2(44) not null,
      FACCOUNTID         VARCHAR2(44) not null,
      FASSISTGRPID       VARCHAR2(44) not null,
      FBEGINBALANCEFOR   NUMBER(19,4) default 0 not null,
      FENDBALANCEFOR     NUMBER(19,4) default 0 not null
    )insert into T_GL_initAssistBalance (FORGUNITID, FACCOUNTID, FASSISTGRPID, 
    FBEGINBALANCEFOR, FENDBALANCEFOR)
    values ('93CqeTWeRSm6pE1rMA5Yu8znrtQ=', 'Db3EjfIxQqSoK9YA4Uk5IJ2pmCY=', 
    '1eMNUUmfR925jC2W+GK5f0GKbLs=', 1000.0000, 1000.0000);insert into T_GL_initAssistBalance (FORGUNITID, FACCOUNTID, FASSISTGRPID, 
    FBEGINBALANCEFOR, FENDBALANCEFOR)
    values ('93CqeTWeRSm6pE1rMA5Yu8znrtQ=', '4j8T4CrHRy+mdqWxGu2daJ2pmCY=', 
    '2LC9qDgBShmzZzUWcjaNREGKbLs=', 1000.0000, 1000.0000);insert into T_GL_initAssistBalance (FORGUNITID, FACCOUNTID, FASSISTGRPID, 
    FBEGINBALANCEFOR, FENDBALANCEFOR)
    values ('93CqeTWeRSm6pE1rMA5Yu8znrtQ=', 'ApBGyh1WS5yHiCHw3rxKIZ2pmCY=', 
    'R5CYhF9hQNqjX8vt9kFdiUGKbLs=', 500.0000, 500.0000);insert into T_GL_initAssistBalance (FORGUNITID, FACCOUNTID, FASSISTGRPID,
    FBEGINBALANCEFOR, FENDBALANCEFOR)
    values ('93CqeTWeRSm6pE1rMA5Yu8znrtQ=', 'dsgoA3GERKej7F3Hiv51DJ2pmCY=', 
    'SYqPncg7Qd64uG8k5Ss67EGKbLs=', 500.0000, 500.0000);
    T_GL_initAssistBalance 与组织表t_org_baseUnit、科目表T_bd_AccountView、辅助账横表t_bd_assistantHG的关联如下:--假设以如下select 语句做为结果集tempDB
    --假设以如下select 语句做为结果集tempDB
    SELECT  DISTINCT  T_GL_initAssistBalance.FOrgUnitID, T_GL_initAssistBalance.FAccountID,
                          T_GL_initAssistBalance.FAssistGrpID, T_GL_initAssistBalance.FBeginBalanceFor, T_GL_initAssistBalance.FEndBalanceFor,
                          T_ORG_BaseUnit.FNumber AS ForgNum, T_ORG_BaseUnit.FName_L2 AS ForgName, T_BD_AccountView.FNumber AS FAccountNum,
                          T_BD_AccountView.FName_L2 AS FAccountName, T_BD_AccountView.FDC AS FAccountFDC, T_BD_AssistantHG.FCustomerID AS FHGCstmID,
                          T_BD_AssistantHG.FProviderID AS FHGPrvdID, T_BD_Customer.FNumber AS FCstmNum, T_BD_Customer.FName_L2 AS FCstmName,
                          T_BD_Supplier.FNumber AS FSplrNum, T_BD_Supplier.FName_L2 AS FSplrName
                  FROM  T_BD_Customer RIGHT OUTER JOIN
                        T_BD_Supplier RIGHT OUTER JOIN
                        T_BD_AssistantHG ON T_BD_Supplier.FID = T_BD_AssistantHG.FProviderID ON
                        T_BD_Customer.FID = T_BD_AssistantHG.FCustomerID RIGHT OUTER JOIN
                        T_GL_initAssistBalance ON T_BD_AssistantHG.FID = T_GL_initAssistBalance.FAssistGrpID LEFT OUTER JOIN
                        T_BD_AccountView ON T_GL_initAssistBalance.FAccountID = T_BD_AccountView.FID LEFT OUTER JOIN
                        T_ORG_BaseUnit ON T_GL_initAssistBalance.FOrgUnitID = T_ORG_BaseUnit.FID
                  WHERE    and T_ORG_BaseUnit.FNumber =p_ForgNum AND T_BD_ACCOUNTVIEW.Fnumber like p_FAccountNum||'%';
      

  30.   

    需要在存储过程的分类汇总部分加上TempDB的汇总数据,如下    
      SELECT Nvl(FcstmName,FSplrName) Fcstm_FSplr_Name,FvouchbookedDate,FBizDate,FDescription,
                     Sum(FEndBalanceFor)over(PARTITION BY Nvl(FcstmName,FSplrName)) AS Sum_FEndBalanceFor,
                     Row_Number()over(PARTITION BY Nvl(FcstmName,FSplrName) ORDER BY FBizDate DESC ) rn
              FROM gxyjTemptable WHERE FcstmName IS NOT NULL OR FSplrName IS NOT NULL )这句,在sum(FendBalanceFor)后面还需加上sum(tempDB.FbeginBalanceFor),条件是tempDB数据集的tempDB.ForgNumber =p_ForgNum AND tempDb.FAccountNum like p_FAccountNum||'%' 而且 tempDB.FHGCstmID=tempco.FHGCstmID或tempDB.FHGPrvdID=tempco.FHGPrvdID
    (注:26楼代码中tempCo临时表中还没有这两个字段,需要加上才得,要以此为分类汇总条件,目前以FprvdName、FcstmName为汇总条件不严谨,因为如果存在同名的人,那数据就不正确了)比如汇总客户FcstmName='陈凤',其FCstmID='f4A7uDShSpiuGP7F0mPflL8MBA4=',那么tempDB汇总条件就是tempDB.FHGCstmID='f4A7uDShSpiuGP7F0mPflL8MBA4='
      

  31.   

    --今天下班后,加了两个多小时班,给你又修改了
    --由于你现在要在分类汇总新增这段逻辑,因此会涉及到临时表结构的调整,
    --这里新增新增客户FHGCstmID和厂商FHGPrvdID,并修改之前的按照 Nvl(FcstmName,FSplrName)来汇总
    --根据 Nvl(FHGCstmID,FHGPrvdID),因为按照你所述姓名可能相同情况
    --下面是具体过程和步骤:--第一步:创建临时表2:
    DROP TABLE tempco2;
    --创建会话级临时表
    CREATE global temporary TABLE tempco2
    (
         FAssistGrpID        VARCHAR2(44),
         FBeginBalanceFor    NUMBER(19,4),
         FEndBalanceFor      NUMBER(19,4),
         FHGCstmID           VARCHAR2(44),  --临时表新增客户ID
         FCstmNum            NVARCHAR2(80) ,
         FCstmName           NVARCHAR2(255),
         FHGPrvdID           VARCHAR2(44),  --临时表新增厂商ID
         FSplrNum            NVARCHAR2(80) ,
         FSplrName           NVARCHAR2(255),
         ForgNum             NVARCHAR2(80),
         ForgName            NVARCHAR2(255),
         FPrdBegDate         TIMESTAMP(6),
         FPrdEndDate         TIMESTAMP(6),
         FGLVARID            VARCHAR2(44),
         FBillID             VARCHAR2(44),
         FDescription        NVARCHAR2(200),
         FBizDate            TIMESTAMP(6),
         FVouchNum           NVARCHAR2(80),
         FVouchBizDate       TIMESTAMP(6) ,
         FVouchBookedDate    TIMESTAMP(6)
    ) on commit preserve rows ;
      

  32.   


    --第二步:创建存储过程如下:
    CREATE OR REPLACE PROCEDURE get_infoco2(
                                          p_ForgNum     IN  VARCHAR2       --公司      如:'01.01'
                                         ,p_FSearchDate IN  DATE           --具体日期  如:2010-1-20
                                         ,p_FAccountNum IN  VARCHAR2       --科目代码  如:1121
                                         ,resultSet     OUT sys_refcursor  --返回结果集
    )
    IS
      --定义一个类型,用来指明中间表的结果
      TYPE T_TABLE IS RECORD (
         FBalType            T_GL_AssistBalance.FBalType%TYPE,
         FOrgUnitID          T_GL_AssistBalance.FOrgUnitID%TYPE,
         FPeriodID           T_GL_AssistBalance.FPeriodID%TYPE,
         FAccountID          T_GL_AssistBalance.FAccountID%TYPE,
         FAssistGrpID        T_GL_AssistBalance.FAssistGrpID%TYPE,
         FBeginBalanceFor    T_GL_AssistBalance.FBeginBalanceFor%TYPE,
         FEndBalanceFor      T_GL_AssistBalance.FEndBalanceFor%TYPE,
         ForgNum             T_ORG_BaseUnit.FNumber%TYPE,
         ForgName            T_ORG_BaseUnit.FName_L2%TYPE,
         FPrdBegDate         T_BD_Period.FBeginDate%TYPE,
         FPrdEndDate         T_BD_Period.FEndDate%TYPE,
         FPrdNum             T_BD_Period.Fnumber%TYPE,
         FAccountNum         T_BD_AccountView.FNumber%TYPE,
         FAccountName        T_BD_AccountView.FName_L2%TYPE,
         FAccountFDC         T_BD_AccountView.FDC%TYPE,
         FHGCstmID           T_BD_AssistantHG.FCustomerID%TYPE,
         FHGPrvdID           T_BD_AssistantHG.FProviderID%TYPE,
         FCstmNum            T_BD_Customer.FNumber%TYPE,
         FCstmName           T_BD_Customer.FName_L2%TYPE,
         FSplrNum            T_BD_Supplier.FNumber%TYPE,
         FSplrName           T_BD_Supplier.FName_L2%TYPE);
    rs  T_TABLE;   --获取游标结果集的类型变量
    --定义游标,根据入参查询结果集
    CURSOR cur IS SELECT  DISTINCT  T_GL_AssistBalance.FBalType, T_GL_AssistBalance.FOrgUnitID, T_GL_AssistBalance.FPeriodID, T_GL_AssistBalance.FAccountID,
                          T_GL_AssistBalance.FAssistGrpID, T_GL_AssistBalance.FBeginBalanceFor, T_GL_AssistBalance.FEndBalanceFor,
                          T_ORG_BaseUnit.FNumber AS ForgNum, T_ORG_BaseUnit.FName_L2 AS ForgName, T_BD_Period.FBeginDate AS FPrdBegDate,
                          T_BD_Period.FEndDate AS FPrdEndDate, T_BD_Period.Fnumber AS FPrdNum, T_BD_AccountView.FNumber AS FAccountNum,
                          T_BD_AccountView.FName_L2 AS FAccountName, T_BD_AccountView.FDC AS FAccountFDC, T_BD_AssistantHG.FCustomerID AS FHGCstmID,
                          T_BD_AssistantHG.FProviderID AS FHGPrvdID, T_BD_Customer.FNumber AS FCstmNum, T_BD_Customer.FName_L2 AS FCstmName,
                          T_BD_Supplier.FNumber AS FSplrNum, T_BD_Supplier.FName_L2 AS FSplrName
                  FROM  T_BD_Customer RIGHT OUTER JOIN
                        T_BD_Supplier RIGHT OUTER JOIN
                        T_BD_AssistantHG ON T_BD_Supplier.FID = T_BD_AssistantHG.FProviderID ON
                        T_BD_Customer.FID = T_BD_AssistantHG.FCustomerID RIGHT OUTER JOIN
                        T_GL_AssistBalance ON T_BD_AssistantHG.FID = T_GL_AssistBalance.FAssistGrpID LEFT OUTER JOIN
                        T_BD_AccountView ON T_GL_AssistBalance.FAccountID = T_BD_AccountView.FID LEFT OUTER JOIN
                        T_BD_Period ON T_GL_AssistBalance.FPeriodID = T_BD_Period.FID LEFT OUTER JOIN
                        T_ORG_BaseUnit ON T_GL_AssistBalance.FOrgUnitID = T_ORG_BaseUnit.FID CROSS JOIN
                        T_GL_AcctCussent CROSS JOIN
                        T_GL_Voucher CROSS JOIN
                        T_GL_VoucherAssistRecord
                  WHERE T_ORG_BaseUnit.FNumber = p_ForgNum AND T_BD_ACCOUNTVIEW.Fnumber like p_FAccountNum||'%';--定义全局变量
    v_FGLVARID             T_GL_VoucherAssistRecord.FID%TYPE ;
    v_FBillID              T_GL_VoucherAssistRecord.FBillID%TYPE;
    v_FDescription         T_GL_VoucherAssistRecord.FDescription%TYPE;
    v_FBizDate             T_GL_VoucherAssistRecord.FBizDate%TYPE;
    v_FVouchNum            T_GL_Voucher.FNumber%TYPE;
    v_FVouchBizDate        T_GL_Voucher.FBizDate%TYPE;
    v_FVouchBookedDate     T_GL_Voucher.FBookedDate%TYPE;
    v_count  NUMBER := 0 ;  --记录是否在往来账表中存在!
    v_cnt    NUMBER := 0 ;  --判断每笔rs.FAssistGrpID是否在T_GL_VoucherAssistRecord表中存在!--过程begin
    BEGIN
         OPEN cur ;
         LOOP
            FETCH cur INTO rs ;
            EXIT WHEN cur%NOTFOUND;
            IF rs.FBeginBalanceFor<>rs.FEndBalanceFor AND rs.FEndBalanceFor <>0 THEN
                BEGIN
                    SELECT FGLVARID,  FBillID,  FDescription,  FBizDate,  FVouchNum,  FVouchBizDate,  FVouchBookedDate
                      INTO v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate,v_FVouchNum,v_FVouchBizDate,v_FVouchBookedDate
                    FROM (
                          SELECT ROWNUM rn,T_GL_VoucherAssistRecord.FID AS FGLVARID, T_GL_VoucherAssistRecord.FBillID,T_GL_VoucherAssistRecord.FDescription,
                                          T_GL_VoucherAssistRecord.FBizDate,T_GL_Voucher.FNumber AS FVouchNum,
                                          T_GL_Voucher.FBizDate AS FVouchBizDate, T_GL_Voucher.FBookedDate AS FVouchBookedDate
                          FROM   T_GL_VoucherAssistRecord LEFT OUTER JOIN T_GL_Voucher
                                ON T_GL_VoucherAssistRecord.FBillID = T_GL_Voucher.FID
                          WHERE  T_GL_VoucherAssistRecord.FbillID IS NOT NULL
                                AND T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID
                                AND EXISTS (SELECT 1 FROM T_org_baseUnit WHERE T_GL_voucher.FcompanyID=T_org_baseUnit.Fid AND T_org_baseUnit.Fnumber=p_ForgNum)
                          ORDER BY FVouchBookedDate DESC nulls last
                          --这里由于测试数据里T_GL_voucher里没有Fcreatetime这个字段,你自己测试的时候再加上 ORDER BY FVouchBookedDate DESC nulls last,Fcreatetime DESC nulls last
                    )WHERE rn=1;
                    --向临时表插入数据:
                    INSERT INTO tempco2(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FHGCstmID,FCstmNum,FCstmName,FHGPrvdID,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,
                                      FGLVARID,FBillID,FDescription,FBizDate,FVouchNum,FVouchBizDate,FVouchBookedDate)
                               VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FHGCstmID,rs.FCstmNum,rs.FCstmName,rs.FHGPrvdID,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,
                                      v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate,v_FVouchNum,v_FVouchBizDate,v_FVouchBookedDate);
                EXCEPTION WHEN no_data_found THEN
                         Raise_Application_Error('-20001','can not find data in T_GL_VoucherAssistRecord where FAssistGrpID='||rs.FAssistGrpID);
                END;
            END IF;
            IF rs.FBeginBalanceFor<>0 AND rs.FEndBalanceFor = rs.FEndBalanceFor THEN
               BEGIN
                    --判断每笔rs.FAssistGrpID是否在T_GL_VoucherAssistRecord表中存在!
                    SELECT Count(*) INTO v_cnt FROM  T_GL_VoucherAssistRecord WHERE T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID;                --存在 逐笔循环再判断是否在往来账表t_gl_acctcussent中存在
                    IF v_cnt >0 THEN
                          FOR rst IN (
                              SELECT   T_GL_VoucherAssistRecord.FID AS FGLVARID, T_GL_VoucherAssistRecord.FBillID,
                                      T_GL_VoucherAssistRecord.FDescription,T_GL_VoucherAssistRecord.FBizDate
                              FROM  T_GL_VoucherAssistRecord
                              WHERE T_GL_VoucherAssistRecord.FAssGrpID =rs.FAssistGrpID )
                          LOOP
                              v_FGLVARID     := rst.FGLVARID;
                              v_FBillID      := rst.FBillID;
                              v_FDescription := rst.FDescription;
                              v_FBizDate     := rst.FBizDate;
                              --逐笔循环判断
                              --判断是否在往来账表t_gl_acctcussent中存在
                              SELECT Count(*) INTO v_count FROM  T_GL_AcctCussent WHERE T_GL_AcctCussent.FVchAssistRecordID=v_FGLVARID AND T_GL_AcctCussent.FisInit=1
                              AND EXISTS (SELECT 1 FROM T_org_baseUnit WHERE T_GL_AcctCussent.FcompanyID=T_org_baseUnit.Fid AND T_org_baseUnit.Fnumber=p_ForgNum);                          IF v_count>0 THEN
                                  --存在 向临时表插入数据:
                                  INSERT INTO tempco2(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FHGCstmID,FCstmNum,FCstmName,FHGPrvdID,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,
                                                    FGLVARID,FBillID,FDescription,FBizDate)
                                             VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FHGCstmID,rs.FCstmNum,rs.FCstmName,rs.FHGPrvdID,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,
                                                    v_FGLVARID,v_FBillID,v_FDescription,v_FBizDate);
                              ELSE
                                  --不存在 向临时表插入数据:
                                  INSERT INTO tempco2(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FHGCstmID,FCstmNum,FCstmName,FHGPrvdID,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,FBizDate)
                                             VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FHGCstmID,rs.FCstmNum,rs.FCstmName,rs.FHGPrvdID,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,rs.FPrdEndDate);
                              END IF ;
                        END LOOP;
                    ELSE  --v_cnt = 0 直接将该笔rs.FAssistGrpID插入临时表
                        INSERT INTO tempco2(FAssistGrpID,FBeginBalanceFor,FEndBalanceFor,FHGCstmID,FCstmNum,FCstmName,FHGPrvdID,FSplrNum,FSplrName,ForgNum,ForgName,FPrdBegDate,FPrdEndDate,FBizDate)
                                   VALUES (rs.FAssistGrpID,rs.FBeginBalanceFor,rs.FEndBalanceFor,rs.FHGCstmID,rs.FCstmNum,rs.FCstmName,rs.FHGPrvdID,rs.FSplrNum,rs.FSplrName,rs.ForgNum,rs.ForgName,rs.FPrdBegDate,rs.FPrdEndDate,rs.FPrdEndDate);
                 END IF;--过程未完,接下面:
      

  33.   


    --接上面:           
               EXCEPTION WHEN others THEN
                         Raise_Application_Error('-20002','can not find data in T_GL_VoucherAssistRecord where FAssistGrpID='||rs.FAssistGrpID);
               END;
            END IF;
         END LOOP;
         CLOSE cur;     --最后对临时表数据进行分类汇总
         OPEN resultSet FOR
         SELECT Fcstm_FSplr_Name 客户或供应商,
                FDescription 摘要,
                CASE WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy')) <1 THEN '小于1年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))>=1 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))<2 THEN '1-2年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))>=2 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))<3 THEN '2-3年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))>=3 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))<4 THEN '3-4年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))>=4 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))<5 THEN '4-5年'
                     ELSE '五年以上'
                END  发生年限  ,
                CASE WHEN Sum_FEndBalanceFor>0 THEN Sum_FEndBalanceFor ELSE NULL END  借方,
                CASE WHEN Sum_FEndBalanceFor<0 THEN Abs(Sum_FEndBalanceFor) ELSE NULL END  贷方
         FROM(
              --这里根据你的逻辑,修改了分类汇总,哎,好麻烦啊!!
              /*SELECT Nvl(FcstmName,FSplrName) Fcstm_FSplr_Name,FvouchbookedDate,FBizDate,FDescription,
                     Sum(FEndBalanceFor)over(PARTITION BY Nvl(FHGCstmID,FHGPrvdID)) AS Sum_FEndBalanceFor,
                     Row_Number()over(PARTITION BY Nvl(FHGCstmID,FHGPrvdID) ORDER BY FBizDate DESC ) rn
              FROM tempco WHERE FHGCstmID IS NOT NULL OR FHGPrvdID IS NOT NULL )
         WHERE rn=1;*/
              SELECT a.Fcstm_FSplr_Name,a.FvouchbookedDate,a.FBizDate,a.FDescription,
                     Sum(a.Sum_FEndBalanceFor+Nvl(b.Sum_FbeginBalanceFor,0))over(PARTITION BY a.FHGCstm_FHGPrvd_ID) AS Sum_FEndBalanceFor
              FROM(
                    SELECT FHGCstm_FHGPrvd_ID,Fcstm_FSplr_Name,FvouchbookedDate,FBizDate,FDescription,Sum_FEndBalanceFor
                    FROM (
                          SELECT Nvl(FHGCstmID,FHGPrvdID) FHGCstm_FHGPrvd_ID,Nvl(FcstmName,FSplrName) Fcstm_FSplr_Name,FvouchbookedDate,FBizDate,FDescription,
                                Sum(FEndBalanceFor)over(PARTITION BY Nvl(FHGCstmID,FHGPrvdID)) AS Sum_FEndBalanceFor,
                                Row_Number()over(PARTITION BY Nvl(FHGCstmID,FHGPrvdID) ORDER BY FBizDate DESC ) rn
                          FROM tempco2  WHERE FHGCstmID IS NOT NULL OR FHGPrvdID IS NOT NULL)
                    WHERE rn=1
                    ) a,
                    (
                    SELECT Nvl(FHGCstmID,FHGPrvdID) FHGCstm_FHGPrvd_ID,Sum(Decode(FAccountFDC,-1,-FbeginBalanceFor,FbeginBalanceFor)) AS Sum_FbeginBalanceFor
                    FROM(
                          SELECT  DISTINCT  T_GL_initAssistBalance.FOrgUnitID, T_GL_initAssistBalance.FAccountID,
                                            T_GL_initAssistBalance.FAssistGrpID, T_GL_initAssistBalance.FBeginBalanceFor, T_GL_initAssistBalance.FEndBalanceFor,
                                            T_ORG_BaseUnit.FNumber AS ForgNum, T_ORG_BaseUnit.FName_L2 AS ForgName, T_BD_AccountView.FNumber AS FAccountNum,
                                            T_BD_AccountView.FName_L2 AS FAccountName, T_BD_AccountView.FDC AS FAccountFDC, T_BD_AssistantHG.FCustomerID AS FHGCstmID,
                                            T_BD_AssistantHG.FProviderID AS FHGPrvdID, T_BD_Customer.FNumber AS FCstmNum, T_BD_Customer.FName_L2 AS FCstmName,
                                            T_BD_Supplier.FNumber AS FSplrNum, T_BD_Supplier.FName_L2 AS FSplrName
                          FROM  T_BD_Customer RIGHT OUTER JOIN
                                T_BD_Supplier RIGHT OUTER JOIN
                                T_BD_AssistantHG ON T_BD_Supplier.FID = T_BD_AssistantHG.FProviderID ON
                                T_BD_Customer.FID = T_BD_AssistantHG.FCustomerID RIGHT OUTER JOIN
                                T_GL_initAssistBalance ON T_BD_AssistantHG.FID = T_GL_initAssistBalance.FAssistGrpID LEFT OUTER JOIN
                                T_BD_AccountView ON T_GL_initAssistBalance.FAccountID = T_BD_AccountView.FID LEFT OUTER JOIN
                                T_ORG_BaseUnit ON T_GL_initAssistBalance.FOrgUnitID = T_ORG_BaseUnit.FID
                          WHERE T_ORG_BaseUnit.FNumber ='01.01' AND T_BD_ACCOUNTVIEW.Fnumber like '%'
                            AND T_BD_AssistantHG.FCustomerID IS NOT NULL OR T_BD_AssistantHG.FProviderID IS NOT NULL
                      )
                      GROUP BY Nvl(FHGCstmID,FHGPrvdID)
                    ) b
                WHERE a.FHGCstm_FHGPrvd_ID=b.FHGCstm_FHGPrvd_ID(+)
             );
         COMMIT;
    END;
    /
    --过程到此结束!--第三步:测试:Connected to:
    Oracle Database 10g Release 10.1.0.2.0 - ProductionSQL> set serveroutput on
    SQL> set linesize 32767
    SQL> col 客户或供应商 format a20
    SQL> col 摘要 format a40
    SQL> col 发生年限 format a20
    SQL> col 借方 format 999999
    SQL> col 贷方 format 999999
    SQL> var cur refcursor
    SQL>  EXEC  get_infoco2('01.01',To_Date('2010-01-20','yyyy-mm-dd'),'%',:cur) ;PL/SQL procedure successfully completed.SQL> print cur客户或供应商         摘要                                     发生年限                借方    贷方
    -------------------- ---------------------------------------- -------------------- ------- -------
    广东世源集团         20101213做的凭证辅助账                   小于1年                         5800
    林金兰               cxf20100108做的凭证客户林金兰            小于1年                  700
    陈凤                 20101213做的凭证                         小于1年                 7300SQL> conn ucnzp/ucnzp@cdfn01
    Connected.
    SQL> EXEC  get_infoco2('01.01',To_Date('2010-01-20','yyyy-mm-dd'),'1121',:cur) ;PL/SQL procedure successfully completed.SQL> print cur客户或供应商         摘要                                     发生年限                借方    贷方
    -------------------- ---------------------------------------- -------------------- ------- -------
    林金兰               cxf20100108做的凭证客户林金兰            小于1年                  700
    陈凤                                                          小于1年                 2500SQL>
      

  34.   

    paddy实在太棒了,我慢慢看,太谢谢了!
      

  35.   

    上面过程中tempDB的条件我用的是实际的值,那是测试用的,没改过了,你自己改一下就OK了
    WHERE T_ORG_BaseUnit.FNumber ='01.01' AND T_BD_ACCOUNTVIEW.Fnumber like '%'
    改成:
    T_ORG_BaseUnit.FNumber =p_ForgNum AND T_BD_ACCOUNTVIEW.Fnumber like p_FAccountNum||'%'
      

  36.   

    gelyon写的不错!人也挺有耐心的!
      

  37.   


    哈哈,paddy,我终于调试成功了,非常谢谢你!
    不过还是要给这个存储过程做些微调:
    1)存储过程不需返回结果集了。
    2)在分类汇总部分代码中,将分类汇总后的结果集放到一个实体表中。这个实体表中需要在数据库中存在的,不能动态创建,其结果与分类汇总后的结果集一致。
      

  38.   


    --那你就先创建一张实体表撒
    drop table temp;
    create table temp(
        Fcstm_FSplr_Name     NVARCHAR2(255),  --客户或供应商         
        FDescription        NVARCHAR2(200),  --摘要 
        Between_Year         NVARCHAR2(255),  --发生年限
        FEndBalanceFor       NUMBER(19,4),    --借方           
        FEndBalanceTo        NUMBER(19,4)     --贷方
    );--过程做相应处理就是了,不要返回结果集
    CREATE OR REPLACE PROCEDURE get_infoco2(
                                          p_ForgNum     IN  VARCHAR2       --公司      如:'01.01'
                                         ,p_FSearchDate IN  DATE           --具体日期  如:2010-1-20
                                         ,p_FAccountNum IN  VARCHAR2       --科目代码  如:1121
                                        -- ,resultSet     OUT sys_refcursor  --返回结果集
    )
    IS
    ....
    ....
    begin
       ....
       ....
       ....
       --OPEN resultSet FOR  不要这个 改成:
       insert into temp
         SELECT Fcstm_FSplr_Name ,
                FDescription ,
                CASE WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy')) <1 THEN '小于1年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))>=1 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))<2 THEN '1-2年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))>=2 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))<3 THEN '2-3年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))>=3 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))<4 THEN '3-4年'
                     WHEN (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))>=4 AND (Trunc(p_FSearchDate,'yyyy')-Trunc(Nvl(FvouchbookedDate,FBizDate),'yyyy'))<5 THEN '4-5年'
                     ELSE '五年以上'
                END  Between_Year   ,
                CASE WHEN Sum_FEndBalanceFor>0 THEN Sum_FEndBalanceFor ELSE NULL END FEndBalanceFor,
                CASE WHEN Sum_FEndBalanceFor<0 THEN Abs(Sum_FEndBalanceFor) ELSE NULL END  FEndBalanceTo
         FROM(  

     
    end;
      

  39.   

    补充:如果这个temp表中的数据只是最近一次调用的存储过程中的数值,那么insert into temp 之前先delete 掉旧数据。
      

  40.   

    如果汇总数据量大 ,最好还是 execute immediate 'truncate table temp';
    汇总数据量不是很大的话 ,就用delete from temp;还是可以的
      

  41.   

    感谢paddy,我又学到了知识,呵呵~~
      

  42.   


    想问一下paddy,汇总数据量大到多少数量级,才需要用execute immediate 'truncate table temp';??