切换到宽版
  • 4128阅读
  • 0回复

HAMS自定义报表调用存储过程 [复制链接]

上一主题 下一主题
离线大火腿
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2015-05-24
— 本帖被 admin 从 学以致用 移动到本区(2015-05-26) —
由于客户的要求一直在与时俱进,故需要HAMS对报表的可定义性要求很高.
      现在HAMS的报表支持用户自定义函数 .将会在以后的文章中说明.
      今天主要说HAMS如何使用存储过程.以及存储过程的一些基本知识. 此篇文章针对oracle数据库

      一.  业务北背景.
                用户需要根据年度统计每个档案类型(门类)的库存情况,案卷和文件各有多少数量
      二.  解决思路:
                定义存储过程,年度作为参数,传入存储过程,返回结果集游标.  网上存储过程的教程有很多,这里直接上DEMO了.
      三.  定义存储过程:
                
名为PRINTCOUNT的存储过程,共计4个参数,
                 三个输入数据参数(选中条目id , attr 归档前后标识, tablename 报表将做在哪张表上)
                 一个输出参数(游标),代码如下:

CREATE OR REPLACE PROCEDURE PRINTCOUNT (did in number ,attr number ,tablename in varchar2 , cur out sys_refcursor )   AS
    nd varchar2(8);
    dalxchname varchar2(64);
    libcode number;
    hasvol number;
    v_count number(1);
    temptable_name varchar2(20);
    voltablename varchar2(8);
    filetablename varchar2(8);
    p_ sql Varchar2(4000);
    type rc_type is ref cursor;
    mycur rc_type;
BEGIN
        temptable_name:= 'tempTable4out';
        select count(*) into v_count from user_tables where table_name=upper(temptable_name);
        if(v_count = 0) then
                p_sql:='create global temporary table tempTable4out(dalxname varchar2(100) , volnum number , filenum number) ON COMMIT PRESERVE ROWS';
                Execute Immediate p_sql;
        else
                p_sql:='truncate table tempTable4out';
                Execute Immediate p_sql;
                commit;
                p_sql:='drop table tempTable4out ';
                Execute Immediate p_sql;
                p_sql:='create global temporary table tempTable4out(dalxname varchar2(100) , volnum number , filenum number) ON COMMIT PRESERVE ROWS';
                Execute Immediate p_sql;
        end if;
        --得到选中条目的年度
         p_sql:='select nd from '||tablename||' where status=0 and did='||did;
        Execute Immediate p_sql into nd;
        p_sql:='SELECT code ,chname,hasvol from s_dalx where status=0';
        open mycur for p_sql ;
        fetch mycur into libcode, dalxchname,hasvol;
        while (mycur%found)
        loop
            filetablename := 'D_FILE'||libcode;
            if hasvol = 1 then
                voltablename := 'D_VOL'||libcode;
                p_sql:='insert into tempTable4out(dalxname,volnum,filenum) select '''||dalxchname||''' , countitemnum('''||voltablename||''','''||nd||''' , '||attr||'), countitemnum('''||filetablename||''','''||nd||''' , '||attr||') from dual';
            else
                p_sql:='insert into tempTable4out(dalxname,volnum,filenum) select '''||dalxchname||''' ,0 , countitemnum('''||filetablename||''','''||nd||''' , '||attr||') from dual';
        end if;
             Execute Immediate p_sql;
            commit;
    fetch mycur into libcode, dalxchname,hasvol;
    end loop;
close mycur;
open cur for 'select dalxname as 案卷_档号, volnum as 案卷_ID,filenum as 案卷_父ID from tempTable4out';
end;

注意 输出游标title的名字要和报表设计器中的一致如下图:

上面存储过程中使用了一个自定义函数.code如下:

create or replace function countItemNum(tablename in varchar2 , nd in varchar2 , attr in number) return number
as
tempSql varchar2(2000);--临时sql语句
countNumber number;--返回参数
begin
tempSql := 'select count(*) from '||tablename||' where status=0 and attr='||attr||' and nd='''||nd||'''';
EXECUTE IMMEDIATE tempSql into countNumber;
return countNumber;
end countItemNum;


二. 存储过程在Lams中调用
新建报表,填写存储过程名和参数,如下图


produce报表内容:

PRINTCOUNT--param--dids--param--int:0--param--str:D_VOL0
说明: 存储过程名字( PRINTCOUNT)
--param-- 是关键分割字体(程序使用,照些就可以)
三个输入参数分别是, dids , 0 (代表归档前后), D_VOL0 报表做在哪张表上
注意dids,是不需要类型的.
确定后.设计报表如下图:


三. 打印



完毕了! 欢迎大家尝试,如果用问题,请留言!


快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个