zoukankan      html  css  js  c++  java
  • 复杂查询的触发器怎么写啊(账户,客商)3.15更新|最终完成|

    select fts_voucher_b.interestdate,

           fts_voucher_b.summary,

           bd_accsubj.dispname,

           fts_voucher_b.debitamount  借方,

           fts_voucher_b.creditamount 贷方,

           bd_accid.accidcode,

           bd_accid.accidname,

           gl_freevalue.valuecode,

           gl_freevalue.valuename

      from fts_voucher_b, bd_accsubj, gl_freevalue, bd_accid

     where fts_voucher_b.pk_subject = bd_accsubj.pk_accsubj

       and fts_voucher_b.pk_ass = gl_freevalue.freevalueid

       and fts_voucher_b.dr = '0'

       and fts_voucher_b.pk_corp = '1162'

       and fts_voucher_b.pk_account = bd_accid.pk_accid

       and length(gl_freevalue.valuecode) = '6'

       and substr(gl_freevalue.valuecode, 0, 1) = '0'

       and bd_accid.accidcode != gl_freevalue.valuecode

     order by fts_voucher_b.interestdate

    就是这个红色加粗的,希望在触发器完成。

    研究到现在,发现三张表查询之后:new不能传递

    create or replace trigger add_js

      before insert on fts_voucher_b  

      for each row

    declare

      -- local variables here

      pk_voucherid char(20);

      pk_accidcode char(6);

      pk_valuecode char(6);

      

      cursor basjob(id char) is

      select

           fts_voucher_b.pk_voucher_b,

           bd_accid.accidcode,

           gl_freevalue.valuecode

      from fts_voucher_b, gl_freevalue, bd_accid

     where fts_voucher_b.pk_ass = gl_freevalue.freevalueid

       and fts_voucher_b.dr = '0'

       and fts_voucher_b.pk_corp = '1162'

       and fts_voucher_b.pk_account = bd_accid.pk_accid

       and length(gl_freevalue.valuecode) = '6'

       and substr(gl_freevalue.valuecode, 0, 1) = '0'

       and fts_voucher_b.pk_voucher_b=id

       and nvl(fts_voucher_b.dr, 0) = 0;

    begin

      open basjob(:new.pk_voucher_b);

      loop

        fetch basjob

          into pk_voucherid,pk_accidcode,pk_valuecode;

        exit when basjob%notfound;

        --raise_application_error(-20001,pk_accidcode||'hhh');

      end loop;

      close basjob;

      raise_application_error(-20001,pk_voucherid||'hhh');

      if pk_accidcode<>pk_valuecode then

        begin

           raise_application_error(-20001, '已从网银付款,不能修改名称,请取消!');

        end;

      end if;

    end add_js;

    再次更新:如果能通过审核结算凭证的时候触发就行了,可是查询fts_checkvoucher是空,omg

    2.24 凌晨0:32更新,完成ultimate:

    create or replace trigger CHECK_VOUCHER

      before insert or update on fts_voucher  

      for each row

    declare

      -- local variables here

      pk_bas char(20);

      cursor basjob(id char) is

        select pk_voucher

          from fts_voucher_b

         where pk_voucher = id

           and pk_voucher in

               (select fts_voucher_b.pk_voucher

                  from fts_voucher_b, gl_freevalue, bd_accid

                 where fts_voucher_b.pk_ass = gl_freevalue.freevalueid

                   and fts_voucher_b.pk_account = bd_accid.pk_accid

                   and length(gl_freevalue.valuecode) = '6'

                   and substr(gl_freevalue.valuecode, 0, 1) = '0'

                   and bd_accid.accidcode <> gl_freevalue.valuecode);

    begin

      open basjob(:new.pk_voucher);

      loop

      

        fetch basjob

          into pk_bas;

        exit when basjob%notfound;

        --raise_application_error(-20001,pk_accidcode||'hhh');

      end loop;

      close basjob;

      if pk_bas is not null then

        begin

          raise_application_error(-20001,

                                  '审核的结算凭证账户和客商不一致,请修改!');

        end;

      end if;

    end CHECK_VOUCHER;

    2.24上午9:14更新结算凭号:
          raise_application_error(-20001,'审核的结算凭证'||:new.cent_typeid||'账户和客商不一致,请修改!');

    11:40 更新第二中写法:

    create or replace trigger CHECK_VOUCHER

      before insert or update on fts_voucher  

      for each row

    declare

      -- local variables here
      pk_bas char(20);

      accode char(6);
      vcode char(6);
      

     

      cursor basjob(id char) is

        select fts_voucher_b.pk_voucher,bd_accid.accidcode, gl_freevalue.valuecode

          from fts_voucher_b,bd_accid, gl_freevalue

         where fts_voucher_b.pk_voucher = id

           and     fts_voucher_b.pk_ass = gl_freevalue.freevalueid

                   and fts_voucher_b.pk_account = bd_accid.pk_accid

                   and length(gl_freevalue.valuecode) = '6'

                   and substr(gl_freevalue.valuecode, 0, 1) = '0';

                   

     

    begin

      open basjob(:new.pk_voucher);

      loop

      

        fetch basjob

          into pk_bas, accode , vcode;

        exit when basjob%notfound;

        --raise_application_error(-20001,pk_accidcode||'hhh');

      end loop;

      close basjob;

     

      if pk_bas is not null then
        if accode<>vcode then

        begin

          raise_application_error(-20001,'结算凭证号'||:new.cent_typeid||'账户和客商不一致,请修改!');

        end;

      end if;
      end if;

    end CHECK_VOUCHER;

    2.27号更新错误提示的样式:

    raise_application_error(-20001,'结算凭证号:'||:new.cent_typeid|| ' 账户和客商不一致,请修改!');

    ps:这里空格必须增加在‘’之中,否则系统虽然执行不报错,但是空格并没有起作用。

    3.15更新:

    今天太诡异了,审核没有报错,可是我在日结的时候居然报错,并且是结算凭证号76,可是今天的结算凭证根本没有76,然后我查询所有76号的凭证,发现有十几个,果然在2010年有一个总部和北京公司账户和客商对不上的。

    奇怪,诡异,这个触发器怎么检查那么久远的东西?

    没关系,稍微更新一下触发器就行了:

    create or replace trigger CHECK_VOUCHER

      before insert or update on fts_voucher  

      for each row

    declare

      -- local variables here

      pk_bas char(20);

     

      cursor basjob(id char) is

        select pk_voucher

          from fts_voucher_b

         where pk_voucher = id

           and pk_voucher in

               (select fts_voucher_b.pk_voucher

                  from fts_voucher_b, gl_freevalue, bd_accid

                 where fts_voucher_b.pk_ass = gl_freevalue.freevalueid

                   and fts_voucher_b.pk_account = bd_accid.pk_accid

                   and length(gl_freevalue.valuecode) = '6'

                   and substr(gl_freevalue.valuecode, 0, 1) = '0'
                   
                   and fts_voucher_b.interestdate>'2010-12-31'

                   and bd_accid.accidcode <> gl_freevalue.valuecode);

     

    begin

      open basjob(:new.pk_voucher);

      loop

      

        fetch basjob

          into pk_bas;

        exit when basjob%notfound;

        --raise_application_error(-20001,pk_accidcode||'hhh');

      end loop;

      close basjob;

     

      if pk_bas is not null then

        begin

          raise_application_error(-20001,'结算凭证号:'||:new.cent_typeid|| ' 账户和客商不一致,请修改!');

        end;

      end if;

    end CHECK_VOUCHER;

  • 相关阅读:
    C# WinForm 创建XML文件方法总结
    VB中的ADO数据对象编程详解[转载]
    01.15 10日沙盘Top20分析
    IPad上做开发——在线B/S开发表单
    沙盘选股失败:延迟性与随机性
    IPad上做开发——在线B/S用户定制型通用列表
    IL动态调试.NET 程序(without pdb files)
    IPad上做开发——在线B/S开发主从表
    01.17 10日沙盘Top20分析
    IIS7下配置WCF的netTcpBinding
  • 原文地址:https://www.cnblogs.com/sumsen/p/2524822.html
Copyright © 2011-2022 走看看