elixiat 发表于 2019-2-3 12:28:20

如何把数据上传到EBS的forms的数据块中

  创建一个临时表: XXX_TEMP_FILES
  建表语句是:
  CREATE TABLE XXX_TEMP_FILES (
  FILE_ID NUMBER,
  SEQ NUMBER,
  TEXT VARCHAR2(2000),
  CREATION_DATE DATE
  )
  创建这个表的目的就是要把数据从FND_LOBS这个表的file_data这个字段的数据,通过程序,因为这个表的这个数据是lobs类型的,所以整个文件都放在这个字段里,我们利用这个临时表,把数据文件拆成一行一个纪录.然后每行在根据分个符查分.
  2. 创建上传包: XXX_FILE_IO
  XXX_FILE_IO 包含三个子程序:
  INS_TEMP_FILES:从fnd_lobs 表中取上传的数据,把它按行来拆分,并插入到: XXX_TEMP_FILES 表中
  SEL_TEMP_FILES:从XXX_TEMP_FILES 中把数据去出
  DEL_TEMP_FILES:数据已经上传到Form的界面中,需要删除文件.
  主要语句就是:
  PROCEDURE INS_TEMP_FILES(p_file_id IN NUMBER) IS
  w_integer INTEGER;
  w_blob BLOB;
  w_raw RAW(10);
  w_buff VARCHAR2(30000);
  w_line VARCHAR2(30000);
  w_len INTEGER;
  eofsw BOOLEAN := FALSE;
  offset INTEGER;
  w_b_len NUMBER := 0;
  w_num NUMBER;
  w_seq NUMBER := 0;
  BEGIN
  SELECT file_data INTO w_blob FROM fnd_lobs WHERE file_id = p_file_id;
  offset := 1;
  LOOP
  EXIT WHEN eofsw;
  w_seq := w_seq + 1;
  w_raw := utl_raw.cast_to_raw(chr(10));
  w_num := dbms_lob.instr(w_blob, w_raw, offset, 1);
  w_len := w_num - w_b_len;
  w_b_len := w_num;
  IF w_num = 0
  THEN
  w_len := 20000;
  eofsw := TRUE;
  END IF;
  BEGIN
  DBMS_LOB.READ(w_blob, w_len, offset, w_buff);
  EXCEPTION
  WHEN no_data_found THEN
  EXIT;
  WHEN OTHERS THEN
  RAISE;
  END;
  w_line := utl_raw.cast_to_varchar2(w_buff);
  SELECT REPLACE(w_line, chr(10), NULL) INTO w_line FROM dual;
  SELECT REPLACE(w_line, chr(13), NULL) INTO w_line FROM dual;
  INSERT INTO XXX_TEMP_FILES
  (FILE_ID, SEQ, TEXT, CREATION_DATE)
  VALUES
  (p_file_id, w_seq, w_line, SYSDATE);
  offset := offset + w_len;
  END LOOP;
  END;
  3. 在Form文件中的Program Unit中健一个包.XXX_UPLOAD
  这个文件最好做成PLL,和其他客制化的有用的程序一起打包,上传到form这是一个系统比较有用的通用的程序.
  主要是利用FND_GFM这个通用上传的工具,把文件传到,FND_LOBS中去,然后第二步建好的的包,进行数据拆分:
  p_file_id := NULL;
  access_id := FND_GFM.AUTHORIZE(NULL);
  FND_PROFILE.GET('APPS_WEB_AGENT', l_server_url);
  l_url := rtrim(l_server_url, '/') ||
  '/fnd_file_upload.displayGFMform?access_id=' ||
  to_char(access_id) ||
  chr(38) ||
  'l_server_url=' ||
  l_server_url;
  if (l_url is NULL) then
  raise form_trigger_failure;
  return NULL;
  end if;
  FND_UTILITIES.OPEN_URL(l_url);
  FND_MESSAGE.SET_NAME('FND', 'ATCHMT-FILE-UPLOAD-COMPLETE');
  button_choice := FND_MESSAGE.QUESTION(
  button1 => 'YES',
  button2 => null,
  button3 => 'NO',
  default_btn => 1,
  cancel_btn => 3,
  icon => 'question'
  );
  if button_choice = 1 then
  p_file_id := FND_GFM.GET_FILE_ID(access_id);
  XXX_FILE_IO.INS_TEMP_FILES(p_file_id);
  -- pcm_dbms_lob.UPOPEN(p_file_id);
  else
  return NULL;
  end if;
  return p_file_id;
  1. 在Form文件中的Program Unit中健一个程序如: UPLOAD_XXX_XXX(X根据实际需要转换)
  UPLOAD_XXX_XXX 这个文件的需要在实际的应用中作改动,根绝实际的要导入的字段修改程序.主要功能就是从XXX_TEMP_FILES把数据读出,然后根据分割符来,把每个数据对应到form的域中.

页: [1]
查看完整版本: 如何把数据上传到EBS的forms的数据块中