壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3345|回复: 14

Oralce ERP二次开发中附件的使用实例

[复制链接]
发表于 2008/9/19 21:06:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
Oracle ERP二次开发中使用的方式有两种,一是通过标准功能,在系统管理员中定义即可,不用写代码,就可以使几乎任何Form具有附件功能,具体参考系统管理员文档,或者
http://bbs.erp100.com/viewthread.php?tid=36637

二是通过PL/SQL Gateway,需要我们便写代码完成。该方式其实和上述方式一的后台实现是一样的。我写了个Package,大体可以演示改写的代码。简单说明如下:
    1、Package功能,测试通过PL/SQL Gateway(MOD PL/SQL)完成文件上传下载  
  2、本Package直接使用EBS的DAD,所以对应的Document表为APPS.fnd_lobs_document
    在非EBS环境开发,需要自己定义DAD请参考9ias_plsql.pdf和9ias.pdf,步骤如下
    a、创建Document表,参照fnd_lobs_document和fnd_lobs_documentpart,表名自己起
    b、配置DAD,配置文件为$IAS_ORACLE_HOME/Apache/modplsql/cfg/wdbsvr.app
    c、参照fnd_gfm,改写成自己的包,或者简单点改写本Package也行
  3、需要把我们写的包在system administrator --> security --> Web PL/SQL里面注册一下,
    不然通过IE打开会提示用户名和密码
  4、本测试把在“接口”fnd_lobs_document中的附件,按照EBS的做法保存到fnd_lobs,
    也可以改写代码保存到自己的表,一般没必要,我们自己的表保存File_ID即可
  5、一个表中的BLOB等数据可以直接插入另一个表



  1. CREATE OR REPLACE PACKAGE oracle_up_down AUTHID CURRENT_USER IS
  2.   /********************************************
  3.   1、Package功能,测试通过PL/SQL Gateway(MOD PL/SQL)完成文件上传下载  
  4.   2、本Package直接使用EBS的DAD,所以对应的Document表为APPS.fnd_lobs_document
  5.     在非EBS环境开发,需要自己定义DAD请参考9ias_plsql.pdf和9ias.pdf,步骤如下
  6.     1、创建Document表,参照fnd_lobs_document和fnd_lobs_documentpart,表名自己起
  7.     2、配置DAD,配置文件为$IAS_ORACLE_HOME/Apache/modplsql/cfg/wdbsvr.app
  8.     3、参照fnd_gfm,改写成自己的包,或者简单点改写本Package也行
  9.   3、需要把我们写的包在system administrator --> security --> Web PL/SQL里面注册一下,
  10.     不然通过IE打开会提示用户名和密码
  11.   4、本测试把在“接口”fnd_lobs_document中的附件,按照EBS的做法保存到fnd_lobs,
  12.     也可以改写代码保存到自己的表,一般没必要,我们自己的表保存File_ID即可
  13.   5、一个表中的BLOB等数据可以直接插入另一个表
  14.   
  15.   ********************************************/
  16.   /***************上传文件下载过程*************
  17.   1、初始化access id
  18.   select fnd_gfm.authorize(-1) from dual;
  19.   
  20.   2、准备url,下面是例子
  21.   SELECT fnd_web_config.trail_slash(fnd_profile.VALUE('APPS_WEB_AGENT')) ||
  22.        'oracle_up_down.upload_form?p_access_id=上面1的查询结果'
  23.   FROM dual;
  24.   
  25.   3、用浏览器打开url即可。如果是通过Form打开url上传,那么把上面代码放入form的相应trigger
  26.   
  27.   4、查看File_ID
  28.   SELECT fnd_web_config.trail_slash(fnd_profile.VALUE('APPS_WEB_AGENT')) ||
  29.        'oracle_up_down.upload_form?p_access_id=上面1的查询结果'
  30.   FROM dual;
  31.   
  32.   4、把文件下载下来验证
  33.   SELECT fnd_web_config.trail_slash(fnd_profile.VALUE('APPS_WEB_AGENT')) ||
  34.        'oracle_up_down.download_file?p_file_id=上面4的查询结果' || chr(38) ||
  35.        'p_access_id=上面1的查询结果'
  36.   FROM dual;
  37.   
  38.   5、可以直接在PL/SQL Developer 6以上中Select出来点击File_Data察看
  39.   
  40.   Test脚本
  41.   http://hw321.huawei.com:8003/pls/scp/fnd_web.SHOWENV;
  42.   select fnd_gfm.authorize(-1) from dual;
  43.   select * from applsys.fnd_lob_access t where t.access_id = 354896931892;
  44.   http://hw321.huawei.com:8003/pls/SCP/oracle_up_down.upload_form?p_access_id=354896931892;
  45.   select * from applsys.fnd_lob_access t where t.access_id = 354896931892;
  46.   select * from applsys.fnd_lobs_document t;
  47.   http://hw321.huawei.com:8003/pls/SCP/oracle_up_down.download_file?p_file_id=3548970&p_access_id=354896931892;
  48.   Select * from fnd_lobs flb where flb.file_id = 3548970;
  49.   ****************上传文件下载过程*****************/
  50.   g_agent        CONSTANT VARCHAR2(100) := fnd_web_config.trail_slash(fnd_profile.VALUE('APPS_WEB_AGENT'));
  51.   g_package_name CONSTANT VARCHAR2(100) := 'oracle_up_down';
  52.   g_upload_url   CONSTANT VARCHAR2(100) := g_package_name || '.upload_file';
  53.   g_download_url CONSTANT VARCHAR2(100) := g_package_name ||
  54.                                            '.download_file';
  55.   g_cancel_url   CONSTANT VARCHAR2(100) := g_package_name || '.cancel_file';
  56.   --完成上传:把在网关中的数据抓到自己的表
  57.   PROCEDURE upload_file(p_file_name IN VARCHAR2, p_access_id IN NUMBER);
  58.   --显示HTML取消页面
  59.   PROCEDURE upload_cancel;
  60.   --显示HTML上传页面
  61.   PROCEDURE upload_form(p_access_id IN NUMBER DEFAULT NULL);
  62.   --下载文件
  63.   PROCEDURE download_file(p_file_id   IN NUMBER,
  64.                           p_access_id IN NUMBER,
  65.                           p_purge     IN VARCHAR2 DEFAULT NULL);
  66.   PROCEDURE download_file_html(p_file_id   IN NUMBER,
  67.                                p_access_id IN NUMBER,
  68.                                p_purge     IN VARCHAR2 DEFAULT NULL);
  69. END;
  70. /
  71. CREATE OR REPLACE PACKAGE BODY oracle_up_down IS
  72.   --add '/' to a string
  73.   FUNCTION trail_slash(p_val IN VARCHAR2) RETURN VARCHAR2 IS
  74.     l_copy_val VARCHAR2(2000);
  75.   BEGIN
  76.     l_copy_val := p_val;
  77.     WHILE (substr(l_copy_val, -1, 1) = '/') LOOP
  78.       l_copy_val := substr(l_copy_val, 1, length(l_copy_val) - 1);
  79.     END LOOP;
  80.     RETURN l_copy_val || '/';
  81.   END;
  82.   PROCEDURE err_msg(NAME VARCHAR2) IS
  83.   BEGIN
  84.     fnd_message.set_name('FND', 'SQL_PLSQL_ERROR');
  85.     fnd_message.set_token('ROUTINE', 'FND_GFM.' || NAME);
  86.     fnd_message.set_token('ERRNO', SQLCODE);
  87.     fnd_message.set_token('REASON', SQLERRM);
  88.   END err_msg;
  89.   /*
  90.   从fnd_gfm拷贝过来,原来的代码是删除整个fnd_lobs_document,不知道为何,现在改为仅删除上传的文件
  91.   */
  92.   FUNCTION confirm_upload(access_id       NUMBER,
  93.                           file_name       VARCHAR2,
  94.                           program_name    VARCHAR2 DEFAULT NULL,
  95.                           program_tag     VARCHAR2 DEFAULT NULL,
  96.                           expiration_date DATE DEFAULT NULL,
  97.                           LANGUAGE        VARCHAR2 DEFAULT userenv('LANG'),
  98.                           wakeup          BOOLEAN DEFAULT FALSE)
  99.     RETURN NUMBER IS
  100.     fid        NUMBER := -1;
  101.     fn         VARCHAR2(256);
  102.     mt         VARCHAR2(240);
  103.     bloblength NUMBER; -- bug 3045375, added variable to set length of blob.
  104.   BEGIN
  105.     IF (fnd_gfm.authenticate(confirm_upload.access_id)) THEN
  106.       SELECT fnd_lobs_s.NEXTVAL INTO fid FROM dual;
  107.    
  108.       fn := substr(confirm_upload.file_name,
  109.                    instr(confirm_upload.file_name, '/') + 1);
  110.    
  111.       -- bug 3045375, added select to get length of BLOB.
  112.       SELECT dbms_lob.getlength(blob_content), mime_type
  113.         INTO bloblength, mt
  114.         FROM fnd_lobs_document
  115.        WHERE NAME = confirm_upload.file_name
  116.          AND rownum = 1;
  117.    
  118.       -- bug 3045375, added if to check length of blob.
  119.       IF bloblength > 0 THEN
  120.         INSERT INTO fnd_lobs
  121.           (file_id,
  122.            file_name,
  123.            file_content_type,
  124.            file_data,
  125.            upload_date,
  126.            expiration_date,
  127.            program_name,
  128.            program_tag,
  129.            LANGUAGE,
  130.            file_format)
  131.           (SELECT confirm_upload.fid,
  132.                   fn,
  133.                   ld.mime_type,
  134.                   ld.blob_content,
  135.                   SYSDATE,
  136.                   confirm_upload.expiration_date,
  137.                   confirm_upload.program_name,
  138.                   confirm_upload.program_tag,
  139.                   confirm_upload.LANGUAGE,
  140.                   fnd_gfm.set_file_format(mt)
  141.              FROM fnd_lobs_document ld
  142.             WHERE ld.NAME = confirm_upload.file_name
  143.               AND rownum = 1);
  144.       
  145.         IF (SQL%ROWCOUNT <> 1) THEN
  146.           RAISE no_data_found;
  147.         END IF;
  148.       
  149.         UPDATE fnd_lob_access
  150.            SET file_id = fid
  151.          WHERE access_id = confirm_upload.access_id;
  152.       
  153.         IF wakeup THEN
  154.           dbms_alert.signal('FND_GFM_ALERT' || to_char(access_id),
  155.                             to_char(fid));
  156.         END IF;
  157.         -- bug 3045375, added else to return fid = -2.
  158.       ELSE
  159.         fid := -2;
  160.       END IF;
  161.       DELETE FROM fnd_lobs_document ld
  162.        WHERE ld.NAME = confirm_upload.file_name;
  163.       --delete from fnd_lobs_documentpart;
  164.     END IF;
  165.     RETURN fid;
  166.   EXCEPTION
  167.     WHEN OTHERS THEN
  168.       DELETE FROM fnd_lobs_document ld
  169.        WHERE ld.NAME = confirm_upload.file_name;
  170.       --delete from fnd_lobs_documentpart;
  171.    
  172.       err_msg('confirm_upload');
  173.       RAISE;
  174.   END;
  175.   PROCEDURE upload_file(p_file_name IN VARCHAR2, p_access_id IN NUMBER) IS
  176.     l_file_id NUMBER;
  177.   BEGIN
  178.   
  179.     l_file_id := confirm_upload(access_id    => p_access_id,
  180.                                 file_name    => p_file_name,
  181.                                 program_name => g_package_name);
  182.   
  183.     IF l_file_id NOT IN (-1, -2) THEN
  184.       -- File upload completed
  185.       htp.htmlopen;
  186.       htp.headopen;
  187.       htp.title('文件上传');
  188.       htp.headclose;
  189.       htp.bodyopen;
  190.       htp.img2('/images/wwcban.jpg', calign => 'Center', calt => 'Logo');
  191.       htp.br;
  192.       htp.br;
  193.       htp.p('<h4>' || '文件上传' || '</h4>');
  194.       htp.hr;
  195.       htp.p(htf.bold('文件上传完成。Select * from fnd_lobs flb where flb.file_id = ' ||
  196.                      l_file_id));
  197.       htp.br;
  198.    
  199.       htp.p('<h4>' || '请关闭浏览器!' || '</h4>');
  200.       htp.br;
  201.       htp.bodyclose;
  202.       htp.htmlclose;
  203.    
  204.     ELSE
  205.       -- File upload failed.
  206.       htp.htmlopen;
  207.       htp.headopen;
  208.       htp.title('文件上传');
  209.       htp.headclose;
  210.       htp.bodyopen;
  211.       htp.img2('/images/wwcban.jpg', calign => 'Left', calt => 'Logo');
  212.       htp.br;
  213.    
  214.       htp.hr;
  215.       htp.p(htf.bold('文件上传失败!'));
  216.       htp.br;
  217.       htp.bodyclose;
  218.       htp.htmlclose;
  219.     END IF;
  220.   
  221.   END;
  222.   PROCEDURE upload_cancel AS
  223.   
  224.   BEGIN
  225.   
  226.     -- Show a message page
  227.     htp.htmlopen;
  228.     htp.headopen;
  229.     htp.title('取消文件上传');
  230.     htp.headclose;
  231.     htp.bodyopen;
  232.     htp.img2('/images/wwcban.jpg', calign => 'Center', calt => 'Logo');
  233.     htp.br;
  234.     htp.br;
  235.     htp.p('<h4>' || '文件上传' || '</h4>');
  236.     htp.hr;
  237.     htp.p(htf.bold('取消文件上传'));
  238.     htp.br;
  239.     htp.p('<h4>' || '您已经选择取消文件上传。' || '</h4>');
  240.     htp.p('<h4>' || '请关闭浏览器!' || '</h4>');
  241.     htp.br;
  242.     htp.br;
  243.     htp.br;
  244.     htp.bodyclose;
  245.     htp.htmlclose;
  246.   
  247.   END;
  248.   PROCEDURE upload_form(p_access_id IN NUMBER DEFAULT NULL) IS
  249.     l_upload_action VARCHAR2(2000);
  250.   BEGIN
  251.   
  252.     -- Set the upload action  
  253.     l_upload_action := fnd_gfm.construct_upload_url(g_agent,
  254.                                                     g_upload_url,
  255.                                                     p_access_id);
  256.     -- Set page title and toolbar.
  257.     htp.htmlopen;
  258.     htp.headopen;
  259.     htp.p('<SCRIPT LANGUAGE="JavaScript">');
  260.     htp.p(' function processclick (cancel_url) {
  261.                  if (confirm(' || '"' || '取消文件上传' || '"' || '))
  262.                  {
  263.                         parent.location=cancel_url
  264.                  }
  265.               }');
  266.     htp.print('</SCRIPT>');
  267.     htp.title('文件上传');
  268.     htp.headclose;
  269.     htp.bodyopen;
  270.     htp.img2('/images/wwcban.jpg', calign => 'Center', calt => 'Logo');
  271.     htp.br;
  272.     htp.br;
  273.     htp.p('<h4>' || '文件上传' || '</h4>');
  274.     htp.hr;
  275.     htp.br;
  276.     htp.print('</LEFT>');
  277.   
  278.     htp.formopen(curl     => l_upload_action,
  279.                  cmethod  => 'POST',
  280.                  cenctype => 'multipart/form-data');
  281.     htp.tableopen(cattributes => ' border=0 cellpadding=2 cellspacing=0');
  282.     htp.tablerowopen;
  283.     htp.tablerowclose;
  284.   
  285.     htp.tablerowopen(cvalign => 'TOP');
  286.     htp.p('<TD>');
  287.     htp.p('</TD>');
  288.     htp.p('<label>文件</label>');
  289.     htp.tabledata('<INPUT TYPE="File" NAME="p_file_name" SIZE="60">',
  290.                   calign => 'left');
  291.     htp.tablerowclose;
  292.     htp.tableclose;
  293.   
  294.     -- Send access is as a hidden value
  295.     htp.formhidden(cname => 'p_access_id', cvalue => to_char(p_access_id));
  296.   
  297.     htp.br;
  298.     htp.tableopen(cattributes => ' border=0 cellpadding=2 cellspacing=0');
  299.     htp.tablerowopen(cvalign => 'TOP');
  300.     htp.tabledata('<INPUT TYPE="Submit" VALUE="' || '确定' ||
  301.                   '" SIZE="50">',
  302.                   calign => 'left');
  303.     htp.tabledata('<INPUT TYPE="Button" NAME="cancel" VALUE="' || '取消' || '"' ||
  304.                   ' onClick="processclick(''' || g_cancel_url ||
  305.                   ''') " SIZE="50">',
  306.                   calign => 'left');
  307.     htp.tablerowclose;
  308.     htp.tableclose;
  309.     htp.formclose;
  310.   
  311.     htp.bodyclose;
  312.     htp.htmlclose;
  313.   END;
  314.   PROCEDURE download_file(p_file_id   IN NUMBER,
  315.                           p_access_id IN NUMBER,
  316.                           p_purge     IN VARCHAR2 DEFAULT NULL) IS
  317.   BEGIN
  318.     fnd_gfm.download(p_file_id, p_access_id, p_purge);
  319.   END;
  320.   PROCEDURE download_file_html(p_file_id   IN NUMBER,
  321.                                p_access_id IN NUMBER,
  322.                                p_purge     IN VARCHAR2 DEFAULT NULL) IS
  323.   BEGIN
  324.     htp.print('
  325.     <html>
  326.     <body>
  327.       <img src=' || g_download_url || '?p_file_id=' ||
  328.               p_file_id || chr(38) || 'p_access_id=' || p_access_id ||
  329.               ' border=0>
  330.     </body>
  331.     </html>
  332.     ');
  333.   END;
  334. END;
  335. /

复制代码

oracle_up_down.rar

3.55 KB, 下载次数: 91, 下载积分: 努力值 -5 点

发表于 2008/9/26 19:19:59 | 显示全部楼层
谢谢楼主。。 正要学习这方面。
发表于 2008/11/4 15:32:24 | 显示全部楼层
学习一下,
发表于 2008/11/12 08:55:19 | 显示全部楼层
值得学习!
发表于 2008/11/24 14:57:11 | 显示全部楼层
好东西
发表于 2008/12/14 12:27:11 | 显示全部楼层
学习一下!
发表于 2008/12/17 09:52:20 | 显示全部楼层
学习一下标准功能
发表于 2009/1/28 05:55:11 | 显示全部楼层
正学习
发表于 2009/3/20 13:56:31 | 显示全部楼层
学习中
发表于 2009/6/10 19:43:12 | 显示全部楼层
好东西,学习了
发表于 2009/6/10 19:43:34 | 显示全部楼层
好东西,学习了
发表于 2009/9/18 15:58:09 | 显示全部楼层
谢谢楼主。。 正要学习这方面。
发表于 2009/9/29 08:46:55 | 显示全部楼层
我也看一下。
发表于 2012/11/13 12:17:55 | 显示全部楼层
真在学习,楼主会不会批量上传附件啊,一下子导入1W个。
发表于 2012/11/13 12:53:50 | 显示全部楼层
楼主上线能加我QQ:279300957吗?我现在需要批量上传附件,不知道该怎么做,现在看了你的代码知道了客户化开发怎么上传,可是对于企业刚启动EBS,大量的图片需要上传,不知道有没有办法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/30 16:33 , Processed in 0.023340 second(s), 15 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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