create or replace package HTML_REPORT_PKG is
-------------------------------------------------------------------
--                    生成HTML格式报表的程序包                    -
--                       张震 2004.2.2                            -
-------------------------------------------------------------------
  v_report_output_mode varchar2(2);

--过程名:TY_REPORT
--功能:生成HTML格式的通用报表
--传入参数:P_REPORT_REQUEST_ID
--参数描述:该参数是当用户在FORM上选择了条件之后,
--          生成相应的参数,存储在基表html_report_requests
--          中,以该参数(请求ID)为主键唯一索引
  PROCEDURE TY_REPORT(p1 In Varchar2
                     ,p2 In Varchar2
                     ,P_REPORT_REQUEST_ID IN NUMBER);

--过程名:HTML_REPORT
--功能:生成HTML格式的通用报表
--传入参数:P_REPORT_REQUEST_ID
--参数描述:该参数是当用户在FORM上选择了条件之后,
--          生成相应的参数,存储在基表html_report_requests
--          中,以该参数(请求ID)为主键唯一索引
  PROCEDURE HTML_REPORT(P_REPORT_REQUEST_ID IN NUMBER);

--过程名称:REPORT_TABLE_LOOP
--作用:以一个SELECT语句为数据源,利用动态SQL循环,
--      以HTML表格的形式,将其内容输出。
--传入参数:P_TABLE_ATTRIBUTES     该表格的属性,直接以HTML语法要求写
--          P_REPORT_TABLE_SQL     数据源(一个SELECT语句,要求将每个要输出的字段都以逗号或其它符号连接成一个字符串成为一个字段)
--          P_SQL_DELIMITER        该SELECT语句中,用于连接每个字段的符号,默认为","
--          P_SQL_ATTR_DELIMITER   该SELECT语句的每个字段与其属性之间的分隔符号,默认为"*"
--          P_REPORT_TABLE_TITLE   该表格的标题行(一个用逗号或其它符号分隔后连成的字符串)
--          P_TITLE_DELIMITER      该标题行每个字段之间的分隔符号,默认为","
--          P_TITLE_ATTR_DELIMITER 该标题行的每个字段与其属性之间的分隔符号,默认为"*"
--          P_REPORT_TABLE_SUM     该表格的合计行(一个用逗号或其它符号分隔后连成的字符串)
--          P_SUM_DELIMITER        该合计行每个字段之间的分隔符号,默认为","
--          P_SUM_ATTR_DELIMITER   该合计行的每个字段与其属性之间的分隔符号,默认为"*"
--参数调用格式举例:
--          参数                   举例
--          P_TABLE_ATTRIBUTES     例子可参见默认值
--          P_REPORT_TABLE_SQL     'SELECT A*align=center||'',''||B||'',''||C||'','' FROM T WHERE A > 0'
--          P_SQL_DELIMITER        ',',用在上面的SQL的||'',''||部分
--          P_SQL_ATTR_DELIMITER   '*',用在上面的SQL的A*align=center部分
--          P_REPORT_TABLE_TITLE   '客户编号,客户名称,客户群,'
--          P_TITLE_DELIMITER      ','
--          P_TITLE_ATTR_DELIMITER '*'
--          P_REPORT_TABLE_SUM     '合计*colspan=2,100,'
--          P_SUM_DELIMITER        ','
--          P_SUM_ATTR_DELIMITER   '*'
  PROCEDURE REPORT_TABLE_LOOP (P_TABLE_ATTRIBUTES     IN VARCHAR2 DEFAULT 'width=100%'||' style="border-collapse:collapse; border:none; font-family: 宋体; font-size: 10pt"'||' border=1 bordercolor=#000000 cellspacing="0"'
                              ,P_REPORT_TABLE_SQL     IN VARCHAR2            --表格的内容行的数据源
                              ,P_SQL_DELIMITER        IN VARCHAR2 DEFAULT ','
                              ,P_SQL_ATTR_DELIMITER   IN VARCHAR2 DEFAULT '*'
                              ,P_REPORT_TABLE_TITLE   IN VARCHAR2            --表格的标题行
                              ,P_TITLE_DELIMITER      IN VARCHAR2 DEFAULT ','
                              ,P_TITLE_ATTR_DELIMITER IN VARCHAR2 DEFAULT '*'
                              ,P_REPORT_TABLE_SUM     IN VARCHAR2 DEFAULT '' --表格的合计行
                              ,P_SUM_DELIMITER        IN VARCHAR2 DEFAULT ','
                              ,P_SUM_ATTR_DELIMITER   IN VARCHAR2 DEFAULT '*'
                              );
--过 程 名:HTML_TITLE
--传入参数:P_PROGRAM_TITLE                 程序名称,在IE的标题栏(顶部蓝色栏)显示
--          P_REPORT_TITLE                  报表的标题
--          P_REPORT_TITLE_ATTR             报表标题的显示属性,直接以HTML语法格式写
--          P_STYLE                         需要在该报表中定义的STYLE的HTML语句,直接以HTML语法格式写
--功    能:该过程用于生成HTML文件的开始部分,是一个通用的过程
  PROCEDURE HTML_TITLE(P_PROGRAM_TITLE     IN VARCHAR2
                      ,P_REPORT_TITLE      IN VARCHAR2
                      ,P_REPORT_TITLE_ATTR IN VARCHAR2 DEFAULT 'align=center style="font-family: 宋体; font-size: 20pt"'
                      ,P_STYLE             IN VARCHAR2 DEFAULT '<!-- .amount {mso-number-format:Standard;text-align:right;}-->'
                      ,P_FILE_ID           IN utl_file.file_type DEFAULT NULL
                      )  ;

--过 程 名:HEADER_TABLECOLUMN
--传入参数:P_PROMPT                        字段的提示
--          P_VALUE                         字段的值
--          P_WITH_OTHER_ATTR               TD是否有其他属性
--          P_ATTR_DELIMITER                TD属性与值之间的分隔符号
--          P_BOLD_FLAG                     是否将所有PORMPT都以黑体显示
--          P_FONT_SIZE                     所有TD值的字体大小
--功    能:该过程用于生成HTML表格的一对列的信息,
--          包括一个PORMPT单元格和一个VALUE单元格。
  PROCEDURE HEADER_TABLECOLUMN(P_PROMPT          IN VARCHAR2
                              ,P_VALUE           IN VARCHAR2
                              ,P_WITH_OTHER_ATTR IN VARCHAR2 DEFAULT 'N'
                              ,P_ATTR_DELIMITER  IN VARCHAR2 DEFAULT '*'
                              ,P_BOLD_FLAG       IN VARCHAR2 DEFAULT 'Y'
                              ,P_FONT_SIZE       IN NUMBER   DEFAULT 12
                              );

--过 程 名:LINE_TITLE
--传入参数:P_TITLE_STRING                  将表格的一行信息用一个特殊符号分隔后连成的字符串(注意:末尾也要有一个符号)
--          P_WITH_OTHER_ATTR               该属性用于区分本次调用是否要为TD指定其他属性
--          P_WITH_TR_FLAG                  该属性用于区分是否要带<TR>标志
--          P_P_ATTR_DELIMITER              在解码后的字符串当中用于分隔字段值和其他属性的分隔符号,默认为“*”
--          P_DELIMITER                     在字符串连接时的分隔符号,默认为逗号“,”
--功    能:该过程用于将表格的一行信息用一个特殊符号分隔后连成的字符串
--          进行解码后,以单元格的格式显示出来。
  PROCEDURE LINE_TITLE(P_TITLE_STRING    IN VARCHAR2
                      ,P_WITH_OTHER_ATTR IN VARCHAR2 DEFAULT 'N'
                      ,P_WITH_TR_FLAG    IN VARCHAR2 DEFAULT 'Y'
                      ,P_DELIMITER       IN VARCHAR2 DEFAULT ','
                      ,P_ATTR_DELIMITER  IN VARCHAR2 DEFAULT '*'
                      ,P_FILE_ID         IN utl_file.file_type DEFAULT NULL
                      )   ;

--过 程 名:PARSE_TWO
--传入参数:p_full_str                      以特殊符号分隔后的字符串
--          p_delimiter                     在字符串连接时的分隔符号,默认为逗号“,”
--传出参数: p_first_str                     每次解码后得到的一个字段
--          p_second_str                    每次解码后剩余的字符串
--          p_zero                          解码完成标志,为"Y"时,表示解码完成
--功    能:该过程用于进行字符串的解码。
  PROCEDURE PARSE_TWO(p_full_str   IN     VARCHAR2
                     ,p_first_str  IN OUT VARCHAR2
                     ,p_second_str IN OUT VARCHAR2
                     ,p_zero       IN OUT VARCHAR2
                     ,p_delimiter  IN     VARCHAR2 DEFAULT ','
                     );

  --
  procedure output_line(p_output_str in varchar2
                       ,p_output_mode in varchar2 default v_report_output_mode
                       );
  --
  procedure output_str(p_output_str in varchar2
                       ,p_output_mode in varchar2 default v_report_output_mode
                       );
  --
  procedure insert_row(X_REQUEST_ID           out NUMBER
                      ,X_REPORT_TITLE         IN VARCHAR2
                      ,X_REPORT_SQL           IN VARCHAR2
                      ,X_SELECT_SQL           IN VARCHAR2
                      ,X_SELECT_SQL_TITLE     IN VARCHAR2 default null
                      ,X_OTHER_HEADER_INFO    IN VARCHAR2 default null
                      ,X_OTHER_BOTTOM_INFO    IN VARCHAR2 default null
                      ,X_TABLE_ATTRIBUTE      IN VARCHAR2 default null
                      ,X_SQL_DELIMITER        IN VARCHAR2 default null
                      ,X_SQL_ATTR_DELIMITER   IN VARCHAR2 default null
                      ,X_TITLE_DELIMITER      IN VARCHAR2 default null
                      ,X_TITLE_ATTR_DELIMITER IN VARCHAR2 default null
                      ,X_SUM_DELIMITER        IN VARCHAR2 default null
                      ,X_SUM_ATTR_DELIMITER   IN VARCHAR2 default null
                      ,X_SUM_INFOMATION       IN VARCHAR2 default null
                      ,X_SUM_SQL              IN VARCHAR2 default null
                      ,X_OUTPUT_MODE          IN VARCHAR2 default 'F'
                      ,X_FILE_LOCATION        IN VARCHAR2 default null);
end HTML_REPORT_PKG;
/
create or replace package body HTML_REPORT_PKG is
-------------------------------------------------------------------
--                    生成HTML格式报表的程序包                    -
--                       张震 2004.2.2                            -
-------------------------------------------------------------------

--过程名:TY_REPORT
--功能:生成HTML格式的通用报表
--传入参数:P_REPORT_REQUEST_ID
--参数描述:该参数是当用户在FORM上选择了条件之后,
--          生成相应的参数,存储在基表html_report_requests
--          中,以该参数(请求ID)为主键唯一索引
  PROCEDURE TY_REPORT(p1 In Varchar2
                     ,p2 In Varchar2
                     ,P_REPORT_REQUEST_ID IN NUMBER)
  IS
  begin
    --html_report_pkg.p_request_id := p_request_id;
    html_report_pkg.v_report_output_mode := 'F';

    html_report_pkg.HTML_REPORT(P_REPORT_REQUEST_ID);
  end TY_REPORT;

--过程名:HTML_REPORT
--功能:生成HTML格式的通用报表
--传入参数:P_REPORT_REQUEST_ID
--参数描述:该参数是当用户在FORM上选择了条件之后,
--          生成相应的参数,存储在基表html_report_requests
--          中,以该参数(请求ID)为主键唯一索引
  PROCEDURE HTML_REPORT(P_REPORT_REQUEST_ID IN NUMBER)
  IS
     v_report                   html_report_requests%ROWTYPE;
     v_sum_str                  VARCHAR2(4000);
     v_default_table_attributes VARCHAR2(4000) := 'width=100%'||' style="border-collapse:collapse; border:none; font-family: 宋体; font-size: 10pt"'||' border=1 bordercolor=#000000 cellspacing="0"';
  BEGIN
     --按照请求ID:P_REPORT_REQUEST_ID,取得报表参数
     BEGIN
       SELECT *
         INTO v_report
         FROM html_report_requests
        WHERE request_id = p_report_request_id;
     EXCEPTION WHEN OTHERS THEN
       NULL;
     END;
     v_report_output_mode := V_REPORT.OUTPUT_MODE;
     --输出报表的标题部分
     IF v_report.report_title IS NOT NULL THEN
       HTML_TITLE(P_PROGRAM_TITLE => v_report.report_title
                 ,P_REPORT_TITLE  => v_report.report_title
                 );
     END IF;

     --输出报表的头信息
     IF v_report.other_header_info IS NOT NULL THEN
       output_line(v_report.other_header_info);
     END IF;

     SELECT DECODE(v_report.sum_infomation ,NULL,v_report.sum_sql,v_report.sum_infomation)
       INTO V_SUM_STR
       FROM DUAL;

     REPORT_TABLE_LOOP(P_TABLE_ATTRIBUTES     => nvl(v_report.table_attribute,v_default_table_attributes)
                      ,P_REPORT_TABLE_SQL     => nvl(v_report.report_sql,'')
                      ,P_SQL_DELIMITER        => nvl(v_report.sql_delimiter,',')
                      ,P_SQL_ATTR_DELIMITER   => nvl(v_report.sql_attr_delimiter,'*')
                      ,P_REPORT_TABLE_TITLE   => nvl(v_report.select_sql_title,'')
                      ,P_TITLE_DELIMITER      => nvl(v_report.title_delimiter,',')
                      ,P_TITLE_ATTR_DELIMITER => nvl(v_report.title_attr_delimiter,'*')
                      ,P_REPORT_TABLE_SUM     => nvl(V_SUM_STR,'')
                      ,P_SUM_DELIMITER        => nvl(v_report.sum_delimiter,',')
                      ,P_SUM_ATTR_DELIMITER   => nvl(v_report.sum_attr_delimiter,'*')
                      );
     --输出报表的底部信息
     IF v_report.other_bottom_info IS NOT NULL THEN
       output_line(v_report.other_bottom_info);
     END IF;
     output_line('</html>');
     delete html_report_requests hrr
     where hrr.request_id = P_REPORT_REQUEST_ID;
     commit;
  END HTML_REPORT;
--过程名:REPORT_TABLE_LOOP
--功能:以一个SELECT语句为数据源,利用动态SQL循环,
--      以HTML表格的形式,将其内容输出。
--传入参数:P_TABLE_ATTRIBUTES     该表格的属性,直接以HTML语法要求写
--          P_REPORT_TABLE_SQL     数据源(一个SELECT语句,要求将每个要输出的字段都以逗号或其它符号连接成一个字符串成为一个字段)
--          P_SQL_DELIMITER        该SELECT语句中,用于连接每个字段的符号,默认为","
--          P_SQL_ATTR_DELIMITER   该SELECT语句的每个字段与其属性之间的分隔符号,默认为"*"
--          P_REPORT_TABLE_TITLE   该表格的标题行(一个用逗号或其它符号分隔后连成的字符串)
--          P_TITLE_DELIMITER      该标题行每个字段之间的分隔符号,默认为","
--          P_TITLE_ATTR_DELIMITER 该标题行的每个字段与其属性之间的分隔符号,默认为"*"
--          P_REPORT_TABLE_SUM     该表格的合计行(一个用逗号或其它符号分隔后连成的字符串)
--          P_SUM_DELIMITER        该合计行每个字段之间的分隔符号,默认为","
--          P_SUM_ATTR_DELIMITER   该合计行的每个字段与其属性之间的分隔符号,默认为"*"
--参数调用格式举例:
--          参数                   举例
--          P_TABLE_ATTRIBUTES     例子可参见默认值
--          P_REPORT_TABLE_SQL     'SELECT A*align=center||'',''||B||'',''||C||'','' FROM T WHERE A > 0'
--          P_SQL_DELIMITER        ',',用在上面的SQL的||'',''||部分
--          P_SQL_ATTR_DELIMITER   '*',用在上面的SQL的A*align=center部分
--          P_REPORT_TABLE_TITLE   '客户编号,客户名称,客户群,'
--          P_TITLE_DELIMITER      ','
--          P_TITLE_ATTR_DELIMITER '*'
--          P_REPORT_TABLE_SUM     '合计*colspan=2,100,'
--          P_SUM_DELIMITER        ','
--          P_SUM_ATTR_DELIMITER   '*'
  PROCEDURE REPORT_TABLE_LOOP (P_TABLE_ATTRIBUTES     IN VARCHAR2 DEFAULT 'width=100%'||' style="border-collapse:collapse; border:none; font-family: 宋体; font-size: 10pt"'||' border=1 bordercolor=#000000 cellspacing="0"'
                              ,P_REPORT_TABLE_SQL     IN VARCHAR2            --表格的内容行的数据源
                              ,P_SQL_DELIMITER        IN VARCHAR2 DEFAULT ','
                              ,P_SQL_ATTR_DELIMITER   IN VARCHAR2 DEFAULT '*'
                              ,P_REPORT_TABLE_TITLE   IN VARCHAR2            --表格的标题行
                              ,P_TITLE_DELIMITER      IN VARCHAR2 DEFAULT ','
                              ,P_TITLE_ATTR_DELIMITER IN VARCHAR2 DEFAULT '*'
                              ,P_REPORT_TABLE_SUM     IN VARCHAR2 DEFAULT '' --表格的合计行
                              ,P_SUM_DELIMITER        IN VARCHAR2 DEFAULT ','
                              ,P_SUM_ATTR_DELIMITER   IN VARCHAR2 DEFAULT '*'
                              )
  IS
     V_Result           VARCHAR2(4000);
     V_Cursor           NUMBER;
     V_Rows_Processed   INTEGER;
     v_out_str long;
  BEGIN
     v_out_str := '<table '||P_TABLE_ATTRIBUTES||'>';
     output_line(v_out_str);
     --输出表格的标题行
     LINE_TITLE(P_TITLE_STRING    => P_REPORT_TABLE_TITLE
               ,P_WITH_OTHER_ATTR => 'Y'
               ,P_DELIMITER       => P_TITLE_DELIMITER
               ,P_ATTR_DELIMITER  => P_TITLE_ATTR_DELIMITER
               );
     --利用动态SQL进行循环,生成表格的内容
     V_Cursor := dbms_sql.open_cursor;
     dbms_sql.parse(V_Cursor,P_REPORT_TABLE_SQL,dbms_sql.v7);
     dbms_sql.define_column(V_Cursor,1,V_Result,4000);
     V_Rows_Processed := dbms_sql.execute(V_Cursor);
     LOOP
       IF dbms_sql.fetch_rows(V_Cursor) >0 THEN
          dbms_sql.column_value(V_Cursor,1,V_Result);
          LINE_TITLE(P_TITLE_STRING    => V_Result
                    ,P_WITH_OTHER_ATTR => 'Y'
                    ,P_DELIMITER       => P_SQL_DELIMITER
                    ,P_ATTR_DELIMITER  => P_SQL_ATTR_DELIMITER
                    );
       ELSE
          EXIT;
       END IF;
     END LOOP;
     dbms_sql.close_cursor(V_Cursor);
     --输出表格的合计行
     IF P_REPORT_TABLE_SUM IS NOT NULL THEN
       LINE_TITLE(P_TITLE_STRING    => P_REPORT_TABLE_SUM
                 ,P_WITH_OTHER_ATTR => 'Y'
                 ,P_DELIMITER       => P_SUM_DELIMITER
                 ,P_ATTR_DELIMITER  => P_SUM_ATTR_DELIMITER
                 );
     END IF;
     v_out_str := '</table>';
     output_line(v_out_str);
  END REPORT_TABLE_LOOP;

--过 程 名:HTML_TITLE
--传入参数:P_PROGRAM_TITLE                 程序名称,在IE的标题栏(顶部蓝色栏)显示
--          P_REPORT_TITLE                  报表的标题
--          P_REPORT_TITLE_ATTR             报表标题的显示属性,直接以HTML语法格式写
--          P_STYLE                         需要在该报表中定义的STYLE的HTML语句,直接以HTML语法格式写
--功    能:该过程用于生成HTML文件的开始部分,是一个通用的过程
  PROCEDURE HTML_TITLE(P_PROGRAM_TITLE     IN VARCHAR2
                      ,P_REPORT_TITLE      IN VARCHAR2
                      ,P_REPORT_TITLE_ATTR IN VARCHAR2 DEFAULT 'align=center style="font-family: 宋体; font-size: 20pt"'
                      ,P_STYLE             IN VARCHAR2 DEFAULT '<!-- .amount {mso-number-format:Standard;text-align:right;}-->'
                      ,P_FILE_ID           IN utl_file.file_type DEFAULT NULL
                      )
  IS
    v_out_str long;
  BEGIN
     v_out_str := '<html><head><meta chttp_equiv="" cname="" ccontent="">';
     output_line(v_out_str);
     v_out_str := '<style>'||p_style||'</style>'||'<title>'||P_PROGRAM_TITLE||'</title>'
                ||'<H1 '||P_REPORT_TITLE_ATTR||'>'||p_report_title||'</H1>';
     output_line(v_out_str);
     v_out_str := '</head><body>';
     output_line(v_out_str);
  END HTML_TITLE ;

--过 程 名:HEADER_TABLECOLUMN
--传入参数:P_PROMPT                        字段的提示
--          P_VALUE                         字段的值
--          P_WITH_OTHER_ATTR               TD是否有其他属性
--          P_ATTR_DELIMITER                TD属性与值之间的分隔符号
--          P_BOLD_FLAG                     是否将所有PORMPT都以黑体显示
--          P_FONT_SIZE                     所有TD值的字体大小
--功    能:该过程用于生成HTML表格的一对列的信息,
--          包括一个PORMPT单元格和一个VALUE单元格。
  PROCEDURE HEADER_TABLECOLUMN(P_PROMPT          IN VARCHAR2
                              ,P_VALUE           IN VARCHAR2
                              ,P_WITH_OTHER_ATTR IN VARCHAR2 DEFAULT 'N'
                              ,P_ATTR_DELIMITER  IN VARCHAR2 DEFAULT '*'
                              ,P_BOLD_FLAG       IN VARCHAR2 DEFAULT 'Y'
                              ,P_FONT_SIZE       IN NUMBER   DEFAULT 12
                              )
  IS
    v_prompt            VARCHAR2(4000);
    v_prompt_other_attr VARCHAR2(4000);
    v_value             VARCHAR2(4000);
    v_value_other_attr  VARCHAR2(4000);
    v_other_attr_length NUMBER;
    v_out_str long;
  BEGIN
    v_other_attr_length := length(P_ATTR_DELIMITER) ;
    IF P_BOLD_FLAG = 'Y' THEN
      IF P_WITH_OTHER_ATTR = 'Y'
      AND INSTR(P_PROMPT,P_ATTR_DELIMITER) > 0
      THEN
        v_prompt := SUBSTR(P_PROMPT,1,INSTR(P_PROMPT,P_ATTR_DELIMITER)-1);
        v_prompt_other_attr := SUBSTR(P_PROMPT,INSTR(P_PROMPT,P_ATTR_DELIMITER)+v_other_attr_length);
        v_out_str := '<td '||v_prompt_other_attr||'>'||'<b>'||V_PROMPT||'</b>'||'</td>';
      ELSE
        v_out_str := '<td align=right style="font-family: 宋体; font-size: '||P_FONT_SIZE||'pt">'||'<b>'||P_PROMPT||'</b>'||'</td>';
      END IF;
    ELSE
      IF P_WITH_OTHER_ATTR = 'Y'
      AND INSTR(P_PROMPT,P_ATTR_DELIMITER) > 0
      THEN
        v_prompt := SUBSTR(P_PROMPT,1,INSTR(P_PROMPT,P_ATTR_DELIMITER)-1);
        v_prompt_other_attr := SUBSTR(P_PROMPT,INSTR(P_PROMPT,P_ATTR_DELIMITER)+1);
        v_out_str := '<td '||v_prompt_other_attr||'>'||V_PROMPT||'</td>';
      ELSE
        v_out_str := '<td align=right style="font-family: 宋体; font-size: '||P_FONT_SIZE||'pt">'||P_PROMPT||'</td>';
      END IF;
    END IF;
    output_line(v_out_str);
    IF P_WITH_OTHER_ATTR = 'Y'
    AND INSTR(P_VALUE,P_ATTR_DELIMITER) > 0
    THEN
      v_value := SUBSTR(P_VALUE,1,INSTR(P_VALUE,P_ATTR_DELIMITER)-1);
      v_value_other_attr := SUBSTR(P_VALUE,INSTR(P_VALUE,P_ATTR_DELIMITER)+1);
      v_out_str := '<td '||v_value_other_attr||'>'||V_VALUE||'</td>';
    ELSE
      v_out_str := '<td align=left style="font-family: 宋体; font-size: '||P_FONT_SIZE||'pt">'||P_VALUE||'</td>';
    END IF;
    output_line(v_out_str);
  END HEADER_TABLECOLUMN ;

--过 程 名:LINE_TITLE
--传入参数:P_TITLE_STRING                  将表格的一行信息用一个特殊符号分隔后连成的字符串(注意:末尾也要有一个符号)
--          P_WITH_OTHER_ATTR               该属性用于区分本次调用是否要为TD指定其他属性
--          P_WITH_TR_FLAG                  该属性用于区分是否要带<TR>标志
--          P_P_ATTR_DELIMITER              在解码后的字符串当中用于分隔字段值和其他属性的分隔符号,默认为“*”
--          P_DELIMITER                     在字符串连接时的分隔符号,默认为逗号“,”
--功    能:该过程用于将表格的一行信息用一个特殊符号分隔后连成的字符串
--          进行解码后,以单元格的格式显示出来。
  PROCEDURE LINE_TITLE(P_TITLE_STRING    IN VARCHAR2
                      ,P_WITH_OTHER_ATTR IN VARCHAR2 DEFAULT 'N'
                      ,P_WITH_TR_FLAG    IN VARCHAR2 DEFAULT 'Y'
                      ,P_DELIMITER       IN VARCHAR2 DEFAULT ','
                      ,P_ATTR_DELIMITER  IN VARCHAR2 DEFAULT '*'
                      ,P_FILE_ID         IN utl_file.file_type DEFAULT NULL
                      )
  IS
    v_title               VARCHAR2(4000);
    v_other_attr          VARCHAR2(4000);
    v_title_remain_string VARCHAR2(4000);
    v_zero                VARCHAR2(20);
    v_delimiter_length    NUMBER;
    v_other_attr_length   NUMBER;

    v_out_str long;
    v_count Number;
  BEGIN
    v_other_attr_length := length(P_ATTR_DELIMITER) ;
    v_delimiter_length  := length(P_DELIMITER) ;
    IF P_WITH_TR_FLAG = 'Y' THEN
      v_out_str := '<tr>';
    END IF;

    If v_report_output_mode != 'T' Then
      output_line(v_out_str);
      parse_two(p_title_string
               ,v_title
               ,v_title_remain_string
               ,v_zero
               ,p_delimiter);
      LOOP
        --判断:若有使用其他属性(指<TD>的),且该属性有指定。
        IF P_WITH_OTHER_ATTR = 'Y'
        AND INSTR(V_TITLE,P_ATTR_DELIMITER) > 0
        THEN
          v_other_attr := SUBSTR(V_TITLE,INSTR(V_TITLE,P_ATTR_DELIMITER)+v_other_attr_length);
          v_title := SUBSTR(V_TITLE,1,INSTR(V_TITLE,P_ATTR_DELIMITER)-1);
          v_out_str := '<td '||v_other_attr||'>'||v_title||'</td>';
        ELSE
          --update by zhangzhen@chinasie.com,2007.5.9           --v_out_str := '<td align=left>'||v_title||'</td>';
          v_out_str := '<td>'||v_title||'</td>';
          --update end.
        END If;

        If v_report_output_mode != 'T' Then
          output_line(v_out_str);
        Else
          If v_count = 1 Then
            output_line(v_title || p_delimiter);
          Else
            output_str(v_title || p_delimiter);
          End If;
          v_count := v_count + 1;
        End If;

        parse_two(v_title_remain_string
                 ,v_title
                 ,v_title_remain_string
                 ,v_zero
                 ,p_delimiter);
        EXIT WHEN v_zero = 'Y' ;
      END LOOP;
      IF P_WITH_TR_FLAG = 'Y' THEN
        v_out_str := '</tr>';
      END IF;

      If v_report_output_mode != 'T' Then
        output_line(v_out_str);
      End If;
    Else
      --v_count := 1;
      output_line(P_TITLE_STRING);
    End If;
  END LINE_TITLE ;
--过 程 名:PARSE_TWO
--传入参数:p_full_str                      以特殊符号分隔后的字符串
--          p_delimiter                     在字符串连接时的分隔符号,默认为逗号“,”
--传出参数: p_first_str                     每次解码后得到的一个字段
--          p_second_str                    每次解码后剩余的字符串
--          p_zero                          解码完成标志,为"Y"时,表示解码完成
--功    能:该过程用于进行字符串的解码。
 

PROCEDURE PARSE_TWO(p_full_str   IN     VARCHAR2
                      ,p_first_str  IN OUT VARCHAR2
                      ,p_second_str IN OUT VARCHAR2
                      ,p_zero       IN OUT VARCHAR2
                      ,p_delimiter  IN     VARCHAR2 DEFAULT ','
     ) IS
     v_delimiter_length    NUMBER;
   BEGIN
     v_delimiter_length  := length(P_DELIMITER) ;
     IF instr(p_full_str,p_delimiter)>0 THEN
       p_first_str:=substr(p_full_str,1,instr(p_full_str,p_delimiter)-1);
       p_second_str:=substr(p_full_str,instr(p_full_str,p_delimiter)+v_delimiter_length);
       p_zero:='N';
     ELSE
       p_first_str:=p_full_str;
       p_second_str:=null;
       p_zero:='Y';
     END IF;
   END parse_two;  --
   procedure output_line(p_output_str in varchar2
                        ,p_output_mode in varchar2 default v_report_output_mode
                        )
   is
   begin
     if p_output_mode = 'W' then
       htp.p(p_output_str);
     elsif p_output_mode In ('T', 'F') then
       fnd_file.PUT_LINE(fnd_file.output,p_output_str);
     end if;
   end output_line;
   --
   procedure output_str(p_output_str in varchar2
                        ,p_output_mode in varchar2 default v_report_output_mode
                        )
   is
   begin
     if p_output_mode = 'W' then
       htp.p(p_output_str);
     elsif p_output_mode = 'F' then
       fnd_file.PUT_line(fnd_file.output,p_output_str);
     elsif p_output_mode = 'T' then
       fnd_file.PUT(fnd_file.output,p_output_str);
     end if;
   end output_str;
   --
   procedure insert_row(X_REQUEST_ID           out NUMBER
                       ,X_REPORT_TITLE         IN VARCHAR2
                       ,X_REPORT_SQL           IN VARCHAR2
                       ,X_SELECT_SQL           IN VARCHAR2
                       ,X_SELECT_SQL_TITLE     IN VARCHAR2 default null
                       ,X_OTHER_HEADER_INFO    IN VARCHAR2 default null
                       ,X_OTHER_BOTTOM_INFO    IN VARCHAR2 default null
                       ,X_TABLE_ATTRIBUTE      IN VARCHAR2 default null
                       ,X_SQL_DELIMITER        IN VARCHAR2 default null
                       ,X_SQL_ATTR_DELIMITER   IN VARCHAR2 default null
                       ,X_TITLE_DELIMITER      IN VARCHAR2 default null
                       ,X_TITLE_ATTR_DELIMITER IN VARCHAR2 default null
                       ,X_SUM_DELIMITER        IN VARCHAR2 default null
                       ,X_SUM_ATTR_DELIMITER   IN VARCHAR2 default null
                       ,X_SUM_INFOMATION       IN VARCHAR2 default null
                       ,X_SUM_SQL              IN VARCHAR2 default null
                       ,X_OUTPUT_MODE          IN VARCHAR2 default 'F'
                       ,X_FILE_LOCATION        IN VARCHAR2 default null)
   is
   begin
     select html_report_requests_s.nextval
       into X_REQUEST_ID
       from dual;
     insert into html_report_requests
     (REQUEST_ID
     ,REPORT_TITLE
     ,REPORT_SQL
     ,SELECT_SQL
     ,SELECT_SQL_TITLE
     ,OTHER_HEADER_INFO
     ,OTHER_BOTTOM_INFO
     ,TABLE_ATTRIBUTE
     ,SQL_DELIMITER
     ,SQL_ATTR_DELIMITER
     ,TITLE_DELIMITER
     ,TITLE_ATTR_DELIMITER
     ,SUM_DELIMITER
     ,SUM_ATTR_DELIMITER
     ,SUM_INFOMATION
     ,SUM_SQL
     ,OUTPUT_MODE
     ,FILE_LOCATION )
     values
     (X_REQUEST_ID
     ,X_REPORT_TITLE
     ,X_REPORT_SQL
     ,X_SELECT_SQL
     ,X_SELECT_SQL_TITLE
     ,X_OTHER_HEADER_INFO
     ,X_OTHER_BOTTOM_INFO
     ,X_TABLE_ATTRIBUTE
     ,X_SQL_DELIMITER
     ,X_SQL_ATTR_DELIMITER
     ,X_TITLE_DELIMITER
     ,X_TITLE_ATTR_DELIMITER
     ,X_SUM_DELIMITER
     ,X_SUM_ATTR_DELIMITER
     ,X_SUM_INFOMATION
     ,X_SUM_SQL
     ,X_OUTPUT_MODE
     ,X_FILE_LOCATION );
   end insert_row;
 end HTML_REPORT_PKG;
 /