• Form_通过FND_FNDFLUPL标准功能上传CSV控件(案例)


    2014-06-08 Created By BaoXinjian

    一、总结


    1. 上传资料

       (1).通过调用function<FND_FNDFLUPL>,打开上传文件页面;

       (2).从表fnd_lob_access和fnd_lobs中取出文件名放在form画面上;   

    2. 对dbms_lob中的二进制文件进行处理

       (1).通过dbms_lob.converttoclob将二进制文件转换成字符文件;

       (2).通过dbms_lob.instr和dbms_lob.substr在字符文件获取字符串记录;

    3. 对获取资料放入到临时表,并显示在画面上

       (1).通过instr和substr获字符串记录中的字段;

       (2).并将字段赋值到集合或表中;

     

    二、步骤


    1. 上传资料

     1 DECLARE
     3     access_id NUMBER;
     5     l_server_url VARCHAR2(100);
     7     l_parameters VARCHAR2(100);
     9     button_choice INTEGER;
    11     l_file_id VARCHAR2(100); 
    13     l_gfm_id INTEGER; 
    15 BEGIN 
    17     access_id := fnd_gfm.authorize(NULL);
    19     fnd_profile.get('APPS_WEB_AGENT', l_server_url);
    21     l_parameters := 'access_id=' || access_id || ' l_server_url=' || l_server_url; 
    23     fnd_function.EXECUTE(function_name => 'FND_FNDFLUPL', 
    25                          open_flag => 'Y', 
    27                          session_flag => 'Y', 
    29                          other_params => l_parameters); 
    31 -- Display a modal message for user to indicate file upload 
    33 -- is completed. 
    35     fnd_message.set_name('FND', 'ATCHMT-FILE-UPLOAD-COMPLETE');
    37     button_choice := fnd_message.question(button1 => 'YES',
    39                                           button2 => NULL, 
    41                                           button3 => 'NO',
    43                                           default_btn => 1, 
    45                                           cancel_btn => 3,
    46                                           icon => 'question');
    48 
    49     IF (button_choice = 3) THEN
    51         NULL; 
    53     ELSIF (button_choice = 1) THEN 
    55         l_file_id := '';
    57         l_gfm_id := fnd_gfm.get_file_id(access_id); 
    59         :main.gfm_id := fnd_gfm.get_file_id(access_id); 
    61         IF l_gfm_id IS NOT NULL THEN
    63             SELECT DECODE(INSTR(file_name, '/'),0,file_name,SUBSTR(file_name, INSTR(file_name, '/') + 1)) 
    65                  INTO l_file_id 
    67                 FROM fnd_lobs 
    69               WHERE file_id = l_gfm_id; 
    71             IF l_file_id IS NOT NULL THEN 
    73                 :main.filename := l_file_id;
    75                 SELECT cux_ce_stmt_s.NEXTVAL INTO :main.working_id FROM DUAL; 
    77             END IF; 
    79         END IF; 
    81     END IF; 
    83 END IF;

     

    2. 对dbms_lob中的二进制文件进行处

     1 DECLARE
     3     c_data CLOB;
     5     l_data BLOB;
     7     l_dest_offset INTEGER := 1;
     9     l_scr_offset INTEGER := 1;
    11     l_lang_context INTEGER := DBMS_LOB.default_lang_ctx; 
    13     l_warn INTEGER;
    15     n_offset INTEGER;
    17     n_clob_size INTEGER; 
    19     n_pos INTEGER;
    21     v_buf VARCHAR2(4000);
    23 BEGIN
    25     DBMS_LOB.createtemporary(c_data, FALSE, DBMS_LOB.SESSION); 
    27     SELECT file_data INTO l_data FROM fnd_lobs WHERE file_id = 1501905;
    29     DBMS_LOB.converttoclob(dest_lob => c_data, 
    31                            src_blob => l_data, 
    33                            amount => DBMS_LOB.lobmaxsize, 
    35                            dest_offset => l_dest_offset, 
    37                            src_offset => l_scr_offset,
    39                            blob_csid => NLS_CHARSET_ID('UTF8'), 
    41                            lang_context => l_lang_context,
    43                            warning => l_warn); 
    45     n_offset := 1;
    47     LOOP 
    49         n_pos := DBMS_LOB.INSTR(lob_loc => c_data, 
    51                                 pattern => CHR(10), 
    53                                 offset => n_offset,
    55                                 nth => 1);
    57         IF NVL(n_pos, 0) = 0 THEN 
    59         n_pos := n_clob_size + 1; 
    61     END IF; 
    63     v_buf := DBMS_LOB.SUBSTR(lob_loc => c_data, 
    65                              amount => n_pos - n_offset, 
    67                              offset => n_offset); 
    69      n_offset := n_pos + 1; 
    71     EXIT WHEN n_pos > n_clob_size; 
    73 END LOOP; 
    75     IF dbms_lob.istemporary(l_data) > 0 THEN 
    77         dbms_lob.freetemporary(l_data); 
    79     END IF; 
    81     IF dbms_lob.istemporary(c_data) > 0 THEN 
    83         dbms_lob.freetemporary(c_data); 
    85     END IF; 
    87 END IF;

     

    3. 对获取资料放入到临时表,并显示在画面上

     1 DECLARE 
     3     v_buf VARCHAR2(1000); 
     5     v_field VARCHAR2(1000);
     7     n_delimiter_pos INTEGER; 
     9 BEGIN 
    11     v_buf := 'Return Authorization Reference,Adjustment Type,Vendor Number,Site Code- Pay To,Site Code- Ship To,Part Number,Quantity,Subinventory';
    13     LOOP
    15         v_field := NULL;
    17         n_delimiter_pos := INSTR(v_buf, ',');
    19         IF n_delimiter_pos > 0 THEN 
    21             v_field := LTRIM(RTRIM(SUBSTR(v_buf, 1, n_delimiter_pos - 1))); 
    23             v_buf := SUBSTR(v_buf, n_delimiter_pos + 1); 
    25         ELSIF LTRIM(RTRIM(v_buf)) IS NOT NULL THEN 
    27             v_field := LTRIM(RTRIM(v_buf)); 
    29             v_buf := NULL; 
    31         END IF;
    33         IF (v_buf IS NULL) THEN
    35             EXIT;
    37         END IF; 
    39     END LOOP; 
    41 END;

     

    Thanks and Regards

  • 相关阅读:
    悲观锁、乐观锁、行级锁、表级锁
    MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)
    刷题-力扣-148. 排序链表
    刷题-力扣-206. 反转链表
    刷题-力扣-203. 移除链表元素
    刷题-力扣-474. 一和零
    刷题-力扣-494. 目标和
    刷题-力扣-160. 相交链表
    刷题-力扣-34. 在排序数组中查找元素的第一个和最后一个位置
    刷题-力扣-33. 搜索旋转排序数组
  • 原文地址:https://www.cnblogs.com/eastsea/p/3776622.html
Copyright © 2020-2023  润新知