通过外来系统抛ERP采购接收接口,系统自动接收入库

公司有一个外部系统imes制造执行系统,通过barcode扫描二维码来获取料号等相关信息,

仓库人员通过imes上的供应商送货单,来抛转采购接收信息到erp,erp自动接收入库。

系统之前的接收方式是标准接收,erp系统抛接收单号给imes,imes再回传相关信息做入库。

可是系统现在改成了直接入库,erp不需要抛信息给imes,imes直接抛采购相关信息给erp即可。

coding如下:

procedure check_interface(errbuf OUT VARCHAR2, retcode OUT VARCHAR2) is
    cursor c1 is
      select ji.rowid row_id,ji.*
        from jw_po_imes_erp_interface ji
       where ji.flag = 'Y';
       
       
    v_num1 number;
    v_num2 number;
  begin
    DBMS_LOCK.SLEEP(5); --为防止程序成功结束,但是interface暂未删除导致
    for v1 in c1 loop
    begin
      select count(*)
        into v_num1
        from rcv_transactions_interface rti
       where rti.interface_source_code = 'IMES_TO_ERP'
         AND rti.interface_source_line_id = v1.interface_id;
         
      select count(*)
        into v_num2
        from rcv_transactions rt
       where rt.attribute15 = v1.interface_id;
       
      if  (v_num1 = 0) and (v_num2 = 2) then--标准接口表数据清掉了,同时标准表也有数据了代表成功
        update jw_po_imes_erp_interface j
           set j.flag = 'S'  --更新成s代表 已经接收成功
         where j.rowid = v1.row_id;
        commit; 
      end if;
    exception
      when others then
        null;  
    end; 
    end loop;
    
    insert into jw_po_imes_erp_interface_his----成功的数据备份插入临时表
    select * from jw_po_imes_erp_interface where  flag = 'S';
    commit;
    delete from jw_po_imes_erp_interface jp
     where jp.flag = 'S'
       and exists (select 1
              from jw_po_imes_erp_interface ji
             where ji.interface_id = jp.interface_id);
    commit;
    null;
  end;
  
  procedure MAIN_NEW(errbuf OUT VARCHAR2, retcode OUT VARCHAR2) is 
    /*create by jam huang 20160623 
    因为采购接收方式由原来的标准接收改为直接入库,so 之前的代码不能用了*/
    cursor c_select is
     select j.rowid row_id,
            ood.ORGANIZATION_ID,
            pla.item_id,
            trim(j.item_number) item_number,
            J.QUANTITY * decode(j.uom_code,'KPS',1000,'KPCS',1000,1) PRIMARY_QUANTITY,
            pha.po_header_id,
            pla.po_line_id,
            pha.Authorization_Status
       from jw_po_imes_erp_interface     j,
            org_organization_definitions ood,
            po_headers_all               pha,
            po_lines_all                 pla
      where trim(j.po_number) = pha.segment1
        and pha.po_header_id = pla.po_header_id
        and pla.line_num = j.po_line_number
        and pha.org_id = ood.OPERATING_UNIT
        and j.flag is null;
    
    cursor c_header is
     select distinct pha.vendor_id,pha.vendor_site_id,pha.org_id,jp.comments
       from jw_po_imes_erp_interface jp
           ,po_headers_all pha
      where jp.po_number = pha.segment1
        and jp.flag = 'C';
    
    cursor c_line(p_vendor_id number,p_vendor_site_id number,p_org_id number,p_comment varchar2) is
     select j.rowid row_id,
            pha.po_header_id,
            pla.po_line_id,
            PLA.ITEM_ID,
            pha.vendor_id,
            pha.vendor_site_id,
            OOD.ORGANIZATION_ID,
            j.interface_id,--接口表的id,记录下后面好查找
            J.SUBINVENTORY,
            j.quantity,--数量
            j.uom_code,--单位
            j.user_name,--imes操作的人
            j.delivery_number,--交货项次
            j.delivery_no,  --交货单号
            j.delivery_po  --客户po单号
       from jw_po_imes_erp_interface     j,
            po_headers_all               pha,
            po_lines_all                 pla,
            org_organization_definitions ood,
            mtl_system_items_b           msib
      where trim(j.po_number) = pha.segment1
        and pha.po_header_id = pla.po_header_id
        and pla.line_num = j.po_line_number
        and trim(j.item_number) = msib.segment1
        and msib.inventory_item_id = pla.item_id
        and ood.OPERATING_UNIT = pla.org_id
        and msib.organization_id = ood.ORGANIZATION_ID
        and pha.vendor_id = p_vendor_id
        and pha.vendor_site_id = p_vendor_site_id
        and pha.org_id = p_org_id
        and j.flag = 'C';

    V_NUM NUMBER;
    V_NUM1 NUMBER;
    tl_rcv_transactions_interface   rcv_transactions_interface%rowtype;
    tl_rcv_headers_interface   rcv_headers_interface%rowtype;--header
    ln_request_id NUMBER;
    ln_acct_period_id NUMBER;
    V_ERROR_MESSAGE VARCHAR2(100);
    V_PO_LINE_ID NUMBER;
    V_UNRCV_QUANTITY NUMBER;
    lb_success BOOLEAN DEFAULT TRUE;
    lv_phase                 VARCHAR2(100);
    lv_status                VARCHAR2(100);
    lv_dev_phase             VARCHAR2(100);
    lv_dev_status            VARCHAR2(100);
    lv_message               VARCHAR2(2000);
    L_ERROR_MESSAGE VARCHAR2(2000);
    L_STATUS        NUMBER;
    r_j exception;        
  begin
    SELECT COUNT(*)
      INTO V_NUM 
      FROM jw_po_imes_erp_interface JP
     WHERE JP.FLAG IS NULL;
    IF V_NUM = 0 THEN  --没有新数据就退出
      RETURN;
    END IF;
    
    ------------防呆
    for v_select in c_select loop
    begin
          select count(*)-------防呆 gl and po期间
            into v_num1
            from GL_PERIOD_STATUSES grs
           where grs.set_of_books_id = 2021
             and grs.closing_status = 'O'
             AND grs.application_id in (101,201)
             and trunc(SYSDATE) BETWEEN grs.start_date AND
                 grs.end_date;
          if v_num1 <> 2 then
            V_ERROR_MESSAGE := 'GL OR PO期间没有打开';
            raise r_j;
          end if;
      
          BEGIN-------防呆,组织期间
          SELECT oap.acct_period_id
            INTO ln_acct_period_id
            FROM org_acct_periods oap
           WHERE oap.organization_id = v_select.ORGANIZATION_ID
             AND oap.open_flag = 'Y'
             AND trunc(SYSDATE) BETWEEN oap.period_start_date AND
                 oap.schedule_close_date;
          EXCEPTION
            WHEN no_data_found THEN 
               V_ERROR_MESSAGE := '组织期间没有打开';
               raise r_j;
          END;
          
          IF v_select.Authorization_Status <> 'APPROVED' THEN
             V_ERROR_MESSAGE := '采购订单未审批';
             raise r_j;
          END IF;
          
          select count(*)
            into v_num1
            from mtl_system_items_b msib
           where msib.segment1 = v_select.item_number
             and msib.inventory_item_id = v_select.item_id
             and msib.organization_id = v_select.organization_id;
          if v_num1 = 0 then
            V_ERROR_MESSAGE := '采购订单行与料号对应不一致';
            raise r_j;
          end if;
          
          select plla.po_line_id,
                 SUM((plla.quantity - plla.quantity_received) *
                     decode(plla.unit_meas_lookup_code, 'KPCS', 1000, 1))
            INTO V_PO_LINE_ID, V_UNRCV_QUANTITY
            from po_line_locations_all plla
           where plla.po_header_id = v_select.po_header_id
             and plla.po_line_id = v_select.po_line_id
           GROUP BY plla.po_line_id;
          
          IF v_select.Primary_Quantity > V_UNRCV_QUANTITY THEN
            V_ERROR_MESSAGE := '数量大于未接收的数量';
            raise r_j;
          END IF;
          
          update jw_po_imes_erp_interface jp
             set jp.flag = 'C'
           WHERE JP.ROWID = v_select.Row_Id;
          COMMIT;   
    exception
      when r_j then
        update jw_po_imes_erp_interface jp
           set jp.flag = 'E',
               JP.ERROR_MESSAGE = V_ERROR_MESSAGE
         WHERE JP.ROWID = v_select.Row_Id;
        COMMIT;
           
    end;
    end loop;
    ------------防呆
    for v_header in c_header loop
    begin  
      select po.rcv_headers_interface_s.NEXTVAL 
        into tl_rcv_headers_interface.header_interface_id
        from dual; 
       
      select po.rcv_interface_groups_s.NEXTVAL 
        into tl_rcv_headers_interface.group_id
        from dual;

      select ood.ORGANIZATION_Id
        into tl_rcv_headers_interface.Ship_To_Organization_Id
        from org_organization_definitions ood
       where ood.OPERATING_UNIT = v_header.org_id;
       
      tl_rcv_headers_interface.processing_status_code := 'PENDING';
      tl_rcv_headers_interface.receipt_source_code := 'VENDOR';
      tl_rcv_headers_interface.transaction_type := 'NEW';
      tl_rcv_headers_interface.expected_receipt_date := sysdate;
      tl_rcv_headers_interface.validation_flag := 'Y';
      tl_rcv_headers_interface.vendor_id := v_header.vendor_id;
      tl_rcv_headers_interface.vendor_site_id := v_header.vendor_site_id;
      tl_rcv_headers_interface.CREATION_DATE := SYSDATE;
      tl_rcv_headers_interface.CREATED_BY := fnd_profile.VALUE('user_id');
      tl_rcv_headers_interface.LAST_UPDATE_DATE := SYSDATE;
      tl_rcv_headers_interface.LAST_UPDATED_BY := fnd_profile.VALUE('user_id');
      tl_rcv_headers_interface.LAST_UPDATE_LOGIN := NULL;
      tl_rcv_headers_interface.comments := v_header.comments;
      INSERT INTO rcv_headers_interface VALUES tl_rcv_headers_interface;
      
      for v_line in c_line(v_header.vendor_id,v_header.vendor_site_id,v_header.org_id,v_header.comments) loop
      begin
          
        select rcv_transactions_interface_s.nextval
          into tl_rcv_transactions_interface.interface_transaction_id
          from dual;
        tl_rcv_transactions_interface.subinventory := v_line.SUBINVENTORY;
        tl_rcv_transactions_interface.quantity  := v_line.QUANTITY;
        tl_rcv_transactions_interface.group_id  := tl_rcv_headers_interface.group_id;
        tl_rcv_transactions_interface.transaction_type        := 'RECEIVE';--'RECEIVE';
        tl_rcv_transactions_interface.transaction_date        := SYSDATE;
        tl_rcv_transactions_interface.processing_status_code  := 'PENDING';
        tl_rcv_transactions_interface.processing_mode_code    := 'BATCH';
        tl_rcv_transactions_interface.transaction_status_code := 'PENDING';
     --   tl_rcv_transactions_interface.category_id             := 1582;
        --tl_rcv_transactions_interface.unit_of_measure         := 'PCS';
        --tl_rcv_transactions_interface.primary_unit_of_measure := 'PCS';
       -- tl_rcv_transactions_interface.interface_source_code   := 'RCV';
        select decode(v_line.uom_code,'KPCS','KPS','KPS','KPS','PCS')
          into tl_rcv_transactions_interface.uom_code 
          from dual;
        tl_rcv_transactions_interface.validation_flag         := 'Y';
        tl_rcv_transactions_interface.item_id                 := v_line.ITEM_ID;
       -- tl_rcv_transactions_interface.item_description        := 'Switch IC,RT9711CGB,2.5~5.5V,80mΩ, 1.5A/0.6A High-Side Power Switches with Flag,SOT23-5,0D95_3X3X1,-40~+85,SMT,LF,Richtek';
        --tl_rcv_transactions_interface.uom_code                := 'PCS';
        tl_rcv_transactions_interface.auto_transact_code      := 'DELIVER';
        tl_rcv_transactions_interface.receipt_source_code     := 'VENDOR';
        tl_rcv_transactions_interface.to_organization_id      := v_line.ORGANIZATION_ID;
       -- tl_rcv_transactions_interface.routing_header_id       := 3;
        --tl_rcv_transactions_interface.routing_step_id         := 1;
        tl_rcv_transactions_interface.source_document_code    := 'PO';
        tl_rcv_transactions_interface.destination_type_code   := 'INVENTORY';
       /* select DECODE(SUBSTR(tl_rcv_transactions_interface.subinventory,
                             2,
                             1),
                      '2',
                      143,
                      '1',
                      142,
                      143)
          into tl_rcv_transactions_interface.location_id
          from dual;*/
        tl_rcv_transactions_interface.location_id := 142;
        tl_rcv_transactions_interface.deliver_to_location_id  := tl_rcv_transactions_interface.location_id;
     --   tl_rcv_transactions_interface.subinventory            := tl_rcv_transactions_interface.subinventory;
        tl_rcv_transactions_interface.expected_receipt_date   := SYSDATE;
        tl_rcv_transactions_interface.destination_context     := 'INVENTORY';
        tl_rcv_transactions_interface.vendor_id := v_header.vendor_id;
        tl_rcv_transactions_interface.vendor_site_id := v_header.Vendor_Site_Id;
        tl_rcv_transactions_interface.po_header_id := v_line.po_header_id;
        tl_rcv_transactions_interface.po_line_id := v_line.po_line_id;
      --  tl_rcv_transactions_interface.po_line_location_id := 103689;
      --  tl_rcv_transactions_interface.po_distribution_id  := 103322;
      ---  tl_rcv_transactions_interface.oe_order_header_id      := v_line.header_id;
      --  tl_rcv_transactions_interface.oe_order_line_id        := v_line.order_line_id;
      ----  tl_rcv_transactions_interface.customer_id             := tl_rcv_headers_interface.customer_id;
        tl_rcv_transactions_interface.header_interface_id   := tl_rcv_headers_interface.header_interface_id;
        tl_rcv_transactions_interface.last_update_date  := SYSDATE;
        tl_rcv_transactions_interface.last_updated_by   := fnd_profile.VALUE('user_id');--fnd_global.user_id;
        tl_rcv_transactions_interface.creation_date     := SYSDATE;
        tl_rcv_transactions_interface.created_by        := fnd_profile.VALUE('user_id');--fnd_global.user_id;
        tl_rcv_transactions_interface.last_update_login := NULL;--fnd_global.login_id;
        
        tl_rcv_transactions_interface.interface_source_code    := 'IMES_TO_ERP';
        tl_rcv_transactions_interface.interface_source_line_id := v_line.INTERFACE_ID;
        
        tl_rcv_transactions_interface.attribute1 := v_line.DELIVERY_NUMBER;
        tl_rcv_transactions_interface.attribute4 := v_line.DELIVERY_NO;
        tl_rcv_transactions_interface.attribute2 := v_line.DELIVERY_PO;
        tl_rcv_transactions_interface.attribute15 := v_line.INTERFACE_ID;------为了后面好检查是否接收成功
        
        insert into rcv_transactions_interface values tl_rcv_transactions_interface;
        COMMIT;
        
        UPDATE JW_PO_IMES_ERP_INTERFACE JP
           SET JP.FLAG = 'Y'
         WHERE JP.ROWID = v_line.ROW_ID;
        COMMIT;  
          
        null;
      exception
        when OTHERS then
          UPDATE JW_PO_IMES_ERP_INTERFACE JP
             SET JP.FLAG = 'F'
           WHERE JP.ROWID = v_line.ROW_ID;
          COMMIT;
      end;
      end loop;
      null;
    exception
      when others then
        null;
    end;  
    end loop;
    
    ------------提交系统标准的请求
    ln_request_id := fnd_request.submit_request(application => 'PO'
                                                       ,program     => 'RVCTP'  
                                                       ,sub_request => FALSE
                                                       ,argument1   => 'BATCH'--v_split.OPERATING_UNIT
                                                       ,argument2   => null--tl_rcv_headers_interface.group_id--v_split.order_source_id
                                                       ,argument3   => NULL--v_split.orig_sys_document_ref
                                                       ,argument4   => ''
                                                       ,argument5   => ''
                                                       ,argument6   => ''
                                                       ,argument7   => ''
                                                       ,argument8   => ''
                                                       ,argument9   => ''
                                                       ,argument10  => ''
                                                       ,argument11  => ''
                                                       ,argument12  => ''
                                                       ,argument13  => ''
                                                       ,argument14  => ''
                                                       ,argument15  => '');
   commit;
   if ln_request_id <> 0 then
     lb_success := fnd_concurrent.wait_for_request(request_id => ln_request_id
                                                           ,INTERVAL   => 5
                                                           ,phase      => lv_phase
                                                           ,status     => lv_status
                                                           ,dev_phase  => lv_dev_phase
                                                           ,dev_status => lv_dev_status
                                                           ,message    => lv_message);
            
     if lb_success AND lv_dev_status = 'NORMAL' THEN
       check_interface(L_ERROR_MESSAGE, L_STATUS);
     end if;
   end if;
   null;
  end;


 

 

你可能感兴趣的:(PO)