客户化程序完成标准成本成批更新

You have to populate CST_ITEM_CST_DTLS_INTERFACE,CST_RESOURCE_COSTS_INTERFACE,
CST_RES_OVERHEADS_INTERFACE and CST_DEPT_OVERHEADS_INTERFACE accordingly.
The concurrent request can be launched by navigating to cost->cost mass
edits->Import Cost Information.
The parameters for the Cost Import concurrent program and their description is
as follows :

Import Cost Option :   A LOV is provided from which the user can select one of
the import options which may be either  to import Only item costs , Only
resource costs , Only overhead rates  or  all the cost information .
Option                        Table from which data is processed
----------                    --------------------------------------------
Only item cost                  cst_item_cst_dtls_interface
Only resource costs           cst_resource_costs_interface
Only overhead rates           cst_res_overheads_interface ,
                               cst_dept_overheads_interface
All Cost Information               From all the four interface tables

Mode to run this request  :  A LOV is provided with possible two
values , 'Insert new cost' or 'Remove and replace cost'.
                            The 'Insert new cost'  mode ,  is useful if you are
importing large # of  items and are not sure if that Item/Organization/Cost
Type combination already exists in the production  tables,  if it does then the
row in the interface table would  be flaged as errored and not imported.This
would prevent any accidental overwrite of already existing data.
                             With 'Remove and replace cost' mode all the
previous cost information for this item, cost_type and organization combination
will be deleted from the production tables and the new information will
overwrite (replace) the already existing one.

Group Id Option :   A LOV is provided from which the user can either
select 'ALL' or 'Specific Group Id' . If the user wishes to submit multiple
Cost Import process requests  he can do so by submitting one request per group
id. For doing so the data in the interface tables should be stamped with
distinct group id value by using the NEXTVAL from the sequence generator
CST_LISTS_S .The use of this sequence geneartor is a MUST for generating
multiple groups or may lead to data corruption as these interface tables are
used by other processes too.
                     If the user selects  "ALL"  from the list then a group ID
generated by a sequence will replace the group ID in the interface tables (if
any) and all the unprocessed rows from the four interface table (viz.
cst_item_cst_dtls_interface , cst_resource_costs_interface ,
cst_res_overheads_interface , cst_dept_overheads_interface ) will be processed
in one run.

Cost type to import to :  The user is provided with a  LOV from which he
needs to select the cost type in which he wishes to import the cost
information. Even if the user has  populated a cost type or cost type ID in the
interface tables, it would  be overwritten with the one that is selected here.
The cost types that the user can  pick from is restricted to the multi-org,
updateable cost types.

Delete succesfull rows :  This parameter decides whether  the
successfully processed  rows should be deleted from the interface tables at the
end of the run. If the user selects 'Yes' then all the successful rows be
deleted,  basically rows that do not have their error flag set to "E".

Importing directly into Frozen/Average cost type (i.e non updateable cost types)
and merging of new cost with existing costs is not supported at this time and
would still have to be processed by cost update routines. Also when importing
the costs from the interface table ,material overhead defaults (if any)
specified for an Organization/Category would not be respected.


Minimum columns in each table that the user needs to provide
1.  CST_ITEM_CST_DTLS_INTERFACE
The columns that the user has to provide are
    a.  Inventory_item_id
    b.  organization_ID or organization_code.
    c.  resource_ID or resource_code for cost elements other than 1(material).
        If we are importing cost into material cost element and default material
        subelement has been specified on 'Define Organization parameters' form
        then that would be respected unless the user overides it with a value
        in this column.
    d.  usage_rate_or_amount
    e.  cost_element_ID or cost_element
    f.  Process Flag (must be set to 1)

We default values for based_on_rollup, shrinkage_rate, inventory_asset_flag,
lot_size from the row from CST_ITEM_COSTS for this item and the default cost
type(default cost type of the cost type specified to import the costs into). If
there is no such row already defined in CST_ITEM_COSTS, then, the values for
these 4 columns also need to be specified and they have to be the same for all
rows of this item, cost type and organization combination.

CST_RESOURCE_COSTS_INTERFACE
   a.  Resource_ID or resource_code
   b.  organization_ID or organization_code
   c.  resource_rate
   d.  Process_flag (must be set to 1)

CST_RES_OVERHEADS_INTERFACE
   a.  Resource_ID or resource_code
   b.  Overhead_ID or overhead
   c.  Organization_ID or organization_code
   d.  Process_flag(must be set to 1)

CST_DEPT_OVERHEADS_INTERFACE
   a.  Department_ID or department
   b.  Overhead_ID or overhead
   c.  Organization_ID
   d.  Rate_or_amount
   e.  Process_flag(must be set to 1)

The other columns will be defaulted.

This is available for only 11.5.9 and above customers.
Customers on 11.5.8 can apply Patch 2193391 to get this functionality.

Please refer to costing Manuals for further details.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
In case you have any questions please log a tar with costing group.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Sample cost update statement is below

INSERT INTO CST_ITEM_CST_DTLS_INTERFACE
(INVENTORY_ITEM_ID,ORGANIZATION_ID,COST_TYPE,RESOURCE_CODE,USAGE_RATE_OR_AMOUNT,
COST_ELEMENT_ID,PROCESS_FLAG)
VALUES
(9935,207,'Pending','Material',17,1,1);
commit;
Using this I update the pending cost for the item from $11 to $17.
Now once the pending cost is updated you will have to use 'Update Standard Cost'

Concurrent program to update Frozen cost for the item from the pending cost.


------Form-------------
declare
	 
	  access_id varchar2(100);	 
	  l_server_url varchar2(200);
	  l_parameters varchar2(200);
	  l_gfm_id number;	 
	  button_choice number;
	  v_request_id  number;
	  p_mfg_org_id	number;
begin 
  	p_mfg_org_id := fnd_profile.value('MFG_ORGANIZATION_ID'); 
		access_id := fnd_gfm.authorize(null); 
	  fnd_profile.get('APPS_WEB_AGENT', l_server_url);
	  l_parameters :='access_id='||access_id||' l_server_url='||l_server_url;
	    
	  fnd_function.execute(FUNCTION_NAME=>'FND_FNDFLUPL',
			                     OPEN_FLAG => 'Y',
	                       SESSION_FLAG => 'Y',
	                       OTHER_PARAMS =>l_parameters);
	  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			                     
	       l_gfm_id := fnd_gfm.get_file_id(access_id);
	       if l_gfm_id is null then
	       	   fnd_message.set_string('Please upload the cost file.');
             fnd_message.show;
             raise form_trigger_failure;
	       end if;   
	       v_request_id:=FND_REQUEST.SUBMIT_REQUEST (
																			'MODULE_NAME',
																			'REQUEST_NAME',  -- 此处调用包体的 read_blob
																			'',
																			to_char(sysdate,'DD-MON-YY HH24:MI:SS'),
																			false,
																   	  l_gfm_id,
																   	  p_mfg_org_id,																   	 
																		  chr(0),
																		  '','','','','','','','',
																			'','','','','','','','','','',
																			'','','','','','','','','','',
																			'','','','','','','','','','',
																			'','','','','','','','','','',
																			'','','','','','','','','','',
																			'','','','','','','','','','',
																			'','','','','','','','','','',
																			'','','','','','','','','','',
																			'','','','','','','','','');	

           IF  v_request_id = 0 THEN
               FND_MESSAGE.RETRIEVE;
               FND_MESSAGE.ERROR;
           ELSE COMMIT;
	
	         END IF;			 			   	 			   		 			   	
    end if;  
 end;


----------------------
create or replace package body UPLOAD_STD_COST_PKG is

  function split_last_pos(v_string in string, v_char in string) return number is
    v_Result    number := 0;
    v_pos       number;
    v_start_pos number := 1;
  begin
  
    if instr(v_string, v_char) = 0 then
      v_Result := 0;
    else
      while instr(v_string, v_char, 1, v_start_pos) > 0 loop
        v_pos       := instr(v_string, v_char, 1, v_start_pos);
        v_start_pos := v_start_pos + 1;
      end loop;
    end if;
    v_Result := v_pos;
    return(v_Result);
  end split_last_pos;

  function check_number(p_data in varchar2) 
    return number is
    i      number;
    j      number;
    s      varchar2(3);
    v_dot  number:=0;
  begin
    select lengthb(p_data)
    into   j
    from   dual;
    for i in 1..j loop
      begin
        select substr(p_data,i,1) into s from dual;
        if s='.' then
           v_dot:=v_dot+1;
          if v_dot>1 then
             return(0);
          end if;
        elsif s not in ('0','1','2','3','4','5','6','7','8','9') then
          return(0);
        end if;
      exception when others then
        return(0);        
      end;
    end loop;
    return(p_data); 
   exception when others then
     return(0);
  end;

  procedure upload_std_cost(p_data varchar2, p_errbuf out varchar2) is
    l_data_len       number;
    l_len            number;
    v_item_id        number;
    v_item_number    varchar2(30);
    v_item_cost      varchar2(60);
    v_cost           number;
    i                number:=0;
    j                number:=0;
    k                number:=0;
  begin
    l_data_len := length(p_data);
    --分列数据
    select INSTR(p_data,',',1,1)
    into   i
    from   dual;
    if (j<>0) then
       fnd_file.put_line(fnd_file.log,'Data:' ||p_data||',Too many commas.');
    end if;
    if (i<=1) then
       fnd_file.put_line(fnd_file.log,'Data:' ||p_data||',Data error.');
    else
      begin
        select substr(p_data,1,i-1),substr(p_data,i+1)
        into   v_item_number,v_item_cost
        from   dual;

        -- check if the item is effective
        begin
          select inventory_item_id
          into   v_item_id
          from   mtl_system_items_b
          where  organization_id = p_mfg_org_id
          and    segment1= v_item_number;
          -- check if the cost is correct
          --最多只能有一个".",而且必须全是数字
          v_cost := check_number(v_item_cost);
          if v_cost = 0 then
             fnd_file.put_line(fnd_file.log,'Data:' ||p_data||',The cost is incorrect.');
          else
            insert into cst_item_cst_dtls_interface
              (inventory_item_id,
               organization_id,
               cost_type,
               resource_code,
               USAGE_RATE_OR_AMOUNT,
               COST_ELEMENT_ID,
               PROCESS_FLAG,
               CREATION_DATE,
               CREATED_BY,
               LAST_UPDATE_DATE,
               LAST_UPDATED_BY)
              values 
               (v_item_id,
                p_mfg_org_id,
                'Pending',
                'MAT',
                v_cost,
                1,
                1,
                SYSDATE,P_USER_ID,SYSDATE,P_USER_ID);
          end if;  
          exception when others then
           fnd_file.put_line(fnd_file.log,'Data:' ||p_data||',The item is incorrect.');
        end;
      end;
    end if;
    p_errbuf := 'S';
  exception
    when others then
      p_errbuf := 'E';
  end;
  
  procedure read_line(p_hex      varchar2,
                      p_last_pos out number,
                      p_errinfo  out varchar2) is
    i_pos_s   number := 1; ----开始标记
    i_step    number := 2; ----每次读取HEX字符串的个数
    i_len     number;
    i_dec     number;
    v_string  varchar2(5000) := '';
    v_tmp     varchar2(1000) := '';
    v_errinfo varchar2(100);
    v_len     number;
  begin
    i_len      := length(p_hex);
    p_last_pos := split_last_pos(p_hex, '0D0A');
    if i_len > (p_last_pos + 3) then
      v_len := p_last_pos + 3;
    else
      v_len := i_len;
    end if;
    dbms_output.put_line('v_len=' || v_len);
    while i_pos_s <= v_len loop
      v_tmp   := substr(p_hex, i_pos_s, i_step);
      i_pos_s := i_pos_s + i_step;
      ---如果其ASCII值大于128,则说明是双字节字符,需要再取两位HEX值
      if to_number(v_tmp, 'XXXX') > 128 then
        v_tmp   := v_tmp || substr(p_hex, i_pos_s, i_step);
        i_pos_s := i_pos_s + i_step;
      end if;
      ----hex_to_dec转换
      i_dec := to_number(v_tmp, 'XXXX');
      if (i_dec in (10,13)) then
        ----10换行 or  13回车符
        if v_string is not null then
          upload_std_cost(v_string, v_errinfo);
          dbms_output.put_line('v_string=' || v_string);
          dbms_output.put_line('v_errinfo=' || v_errinfo);
          if nvl(v_errinfo, 'S') <> 'S' then
            p_errinfo := v_errinfo;
            exit;
          end if;
        end if;
        v_string := '';
      else
        ----正常数据
        v_string := v_string || chr(i_dec);
      end if;
    end loop;
  end;
  
  procedure read_blob(errbuf    out varchar2,
                      errcode   out varchar2,
                      p_file_id in number,
                      p_mfg_organization_id in number) is
    lobloc     blob;
    l_blob_len number;
    l_buffer   RAW(32767); -- 缓存的最大字符长度
    l_amount   number := 32767;
    l_offset   number := 1;
    l_last_pos number;
    v_errinfo  varchar2(100);
  begin
    p_mfg_org_id := p_mfg_organization_id;
    p_user_id := fnd_profile.VALUE('USER_ID');
    delete from cst_item_cst_dtls_interface 
    where  organization_id= p_mfg_org_id
    and    group_id is not null;
    select file_data into lobloc from fnd_lobs where file_id = p_file_id;
    l_file_id := p_file_id;
    l_blob_len := DBMS_LOB.GETLENGTH(lobloc);
    WHILE l_offset < l_blob_len LOOP
      dbms_lob.read(lobloc, l_amount, l_offset, l_buffer);
      read_line(l_buffer, l_last_pos, v_errinfo);
      if nvl(v_errinfo, 'S') <> 'S' then
        errbuf := v_errinfo;
        rollback;
        exit;
      end if;
--      l_offset := l_offset + l_last_pos + 3;
      l_offset := l_offset + l_last_pos;
    fnd_file.put_line(fnd_file.log,'offset:' ||l_offset);      
    END LOOP;
    DELETE FROM FND_LOBS WHERE FILE_ID = p_file_id;
    commit;
  end;
   
end UPLOAD_STD_COST_PKG;


原文地址:https://www.cnblogs.com/wanghang/p/6299267.html