WIP 完工事务处理Demo

DECLARE
  l_itface_move_rec   wip_move_txn_interface%ROWTYPE;
  l_itface_cst_rec    cst_comp_snap_interface%ROWTYPE;
  l_itface_mtran_rec  mtl_transactions_interface%ROWTYPE;
  l_itface_serial_rec mtl_serial_numbers_interface%ROWTYPE;

  l_error_status  VARCHAR2(2);
  l_error_count   NUMBER := 0;
  l_error_message VARCHAR2(10000);
  l_count         NUMBER := 0;
  l_verify_count  NUMBER;
  ln_request_no   NUMBER := 0;

  l_assembly_id     NUMBER;
  l_available_qty   NUMBER;
  l_completion_date DATE;
  l_max_seq_num     NUMBER;
  l_min_seq_num     NUMBER;
  l_wip_entity_id   NUMBER;
  l_date_released   DATE;
  l_subinventory    VARCHAR2(50);
  l_serial_ctl      NUMBER;
  l_qty_completed   NUMBER;
  l_locator_id      NUMBER;
  l_serial_num      VARCHAR2(50);

BEGIN
  fnd_global.apps_initialize(user_id => 2411, resp_id => 50647, resp_appl_id => 20003);

  dbms_output.put_line('Organization' || chr(9) || 'Job No.' || chr(9) || 'Assembly' || chr(9) || 'Quantity' || chr(9) ||
                       'Serial Number' || chr(9) || 'Completion Date' || chr(9) || 'Status' || chr(9) || 'Error Message');
  
    l_itface_move_rec   := NULL;
    l_itface_cst_rec    := NULL;
    l_itface_mtran_rec  := NULL;
    l_itface_serial_rec := NULL;
    l_itface_move_rec   := NULL;
    l_error_status      := 'S';
    l_error_message     := NULL;
    l_serial_num        := NULL;
    l_assembly_id       := NULL;
    l_available_qty     := NULL;
    l_completion_date   := NULL;
    l_max_seq_num       := NULL;
    l_min_seq_num       := NULL;
    l_wip_entity_id     := NULL;
    l_date_released     := NULL;
    l_subinventory      := NULL;
    l_serial_ctl        := NULL;
    l_qty_completed     := NULL;
    l_serial_num        := NULL;
  
    l_error_status  := 'S';
    l_error_message := NULL;
  
    l_count := l_count + 1;
  
    --Validate organization                      
    BEGIN
      SELECT ood.organization_id,
             ood.organization_code
        INTO l_itface_move_rec.organization_id,
             l_itface_move_rec.organization_code
        FROM org_organization_definitions ood
       WHERE ood.organization_code = 'WE1';
    EXCEPTION
      WHEN OTHERS THEN
        l_error_status  := 'E';
        l_error_message := 'The organization is invalid!';
    END;
  
    --Validate job                      
    IF l_itface_move_rec.organization_id IS NOT NULL THEN
      BEGIN
        SELECT wen.wip_entity_name,
               wen.wip_entity_id,
               wdj.primary_item_id,
               wdj.start_quantity - wdj.quantity_completed - wdj.quantity_scrapped,
               wdj.quantity_completed,
               wdj.date_released,
               wdj.completion_subinventory,
               wdj.completion_locator_id,
               wdj.attribute3 serial
          INTO l_itface_move_rec.wip_entity_name,
               l_wip_entity_id,
               l_assembly_id,
               l_available_qty,
               l_qty_completed,
               l_date_released,
               l_subinventory,
               l_locator_id,
               l_serial_num
          FROM wip_discrete_jobs wdj,
               wip_entities      wen
         WHERE wdj.wip_entity_id = wen.wip_entity_id
           AND wdj.organization_id = wen.organization_id
           AND wen.wip_entity_name = 'LCY_TEST01'
           AND wdj.organization_id = l_itface_move_rec.organization_id
           AND wdj.status_type = 3; --status released                      
      EXCEPTION
        WHEN OTHERS THEN
          l_error_status  := 'E';
          l_error_message := l_error_message || '|' || 'The job is invalid!';
      END;
    END IF;
  
    --Validate item                      
    IF l_assembly_id IS NOT NULL THEN
      BEGIN
        SELECT msi.primary_uom_code,
               msi.serial_number_control_code
          INTO l_itface_move_rec.transaction_uom,
               l_serial_ctl
          FROM mtl_system_items_b msi
         WHERE msi.inventory_item_id = l_assembly_id
           AND msi.organization_id = l_itface_move_rec.organization_id
           /*AND msi.segment1 = ''*/;
      EXCEPTION
        WHEN OTHERS THEN
          l_error_status  := 'E';
          l_error_message := l_error_message || '|' || 'The item is invalid!';
      END;
    
      IF l_subinventory IS NULL THEN
        l_error_status  := 'E';
        l_error_message := l_error_message || '|' || 'The job default subinventory is null!';
      END IF;
    END IF;
  
    IF l_available_qty < nvl(1, 0) OR nvl(1, 0) < 0 THEN
      l_error_status  := 'E';
      l_error_message := l_error_message || '|' || 'The qty is invalid!';
    END IF;
  
    --Validate completion_date                      
    BEGIN
      l_completion_date := SYSDATE;--to_date(jobc.completion_date, 'dd/mm/yyyy hh24:mi:ss');
      IF l_completion_date < l_date_released OR l_completion_date > SYSDATE THEN
        l_error_status  := 'E';
        l_error_message := l_error_message || '|' || 'The completion date should between release date and system date!';
      END IF;
    EXCEPTION
      WHEN OTHERS THEN
        l_error_status  := 'E';
        l_error_message := l_error_message || '|' || 'The completion date is dd/mm/yyyy hh24:mi:ss!';
    END;
  
    --get seq                      
    IF l_wip_entity_id IS NOT NULL THEN
      SELECT MIN(wop.operation_seq_num),
             MAX(wop.operation_seq_num)
        INTO l_min_seq_num,
             l_max_seq_num
        FROM wip_operations wop
       WHERE wop.wip_entity_id = l_wip_entity_id
         AND wop.organization_id = l_itface_move_rec.organization_id;
    
      IF l_min_seq_num IS NULL OR l_wip_entity_id IS NULL THEN
        l_error_status  := 'E';
        l_error_message := l_error_message || '|' || 'Faild to get operation seq!';
      END IF;
    
      --validate serial                       
      IF l_serial_num IS NULL THEN
        IF l_serial_ctl <> 1 THEN
          l_error_status  := 'E';
          l_error_message := l_error_message || '|' || 'The assembly need a serial!';
        END IF;
        l_itface_move_rec.transaction_type := 2;
      ELSE
        IF 1 > 1 THEN
          l_error_status  := 'E';
          l_error_message := l_error_message || '|' || 'The qty can not greater than 1 with serial!';
        END IF;
      
        SELECT COUNT(*)
          INTO l_verify_count
          FROM mtl_serial_numbers msn
         WHERE msn.inventory_item_id = l_assembly_id
           AND msn.serial_number = l_serial_num
           AND msn.current_subinventory_code = l_subinventory --l_transaction_record.subinventory_code                      
           AND (msn.current_locator_id = nvl(l_locator_id, msn.current_locator_id) OR
               msn.current_locator_id IS NULL AND l_locator_id IS NULL)
           AND msn.current_organization_id = l_itface_move_rec.organization_id;
      
        IF l_verify_count > 0 THEN
          l_error_status  := 'E';
          l_error_message := l_error_message || '|' || 'The serial number is invalid!';
        END IF;
      
        l_itface_move_rec.transaction_type := 1;
      END IF;
    END IF;
  
    IF l_error_status = 'S' THEN
    
      l_itface_mtran_rec.last_update_date  := SYSDATE;
      l_itface_mtran_rec.last_updated_by   := -1;
      l_itface_mtran_rec.creation_date     := SYSDATE;
      l_itface_mtran_rec.created_by        := -1;
      l_itface_mtran_rec.last_update_login := -1;
    
      SELECT mtl_material_transactions_s.nextval INTO l_itface_mtran_rec.transaction_interface_id FROM dual;
      l_itface_mtran_rec.transaction_header_id := l_itface_mtran_rec.transaction_interface_id;
      l_itface_mtran_rec.transaction_mode      := 3;
      l_itface_mtran_rec.process_flag          := 1;
      l_itface_mtran_rec.transaction_type_id   := 44;
      l_itface_mtran_rec.transaction_source_id := l_wip_entity_id;
      l_itface_mtran_rec.operation_seq_num     := l_max_seq_num;
      l_itface_mtran_rec.organization_id       := l_itface_move_rec.organization_id;
      l_itface_mtran_rec.inventory_item_id     := l_assembly_id;
      l_itface_mtran_rec.subinventory_code     := l_subinventory;
      l_itface_mtran_rec.transaction_quantity  := 1;
      l_itface_mtran_rec.transaction_uom       := l_itface_move_rec.transaction_uom;
      l_itface_mtran_rec.transaction_date      := l_completion_date;
      l_itface_mtran_rec.final_completion_flag := 'Y';
      l_itface_mtran_rec.source_code           := 'Manual Import';
      l_itface_mtran_rec.source_header_id      := 987654321;
      l_itface_mtran_rec.source_line_id        := 987654321;
      INSERT INTO inv.mtl_transactions_interface VALUES l_itface_mtran_rec;
    
      FOR opera IN (SELECT wop.operation_seq_num
                      FROM wip_operations wop
                     WHERE wop.wip_entity_id = l_wip_entity_id
                       AND wop.organization_id = l_itface_move_rec.organization_id
                     ORDER BY wop.operation_seq_num) LOOP
        l_itface_cst_rec.transaction_interface_id := l_itface_mtran_rec.transaction_interface_id;
        l_itface_cst_rec.last_update_date         := SYSDATE;
        l_itface_cst_rec.last_updated_by          := 1124;
        l_itface_cst_rec.creation_date            := SYSDATE;
        l_itface_cst_rec.created_by               := 1124;
        l_itface_cst_rec.last_update_login        := -1;
      
        l_itface_cst_rec.wip_entity_id      := l_wip_entity_id;
        l_itface_cst_rec.operation_seq_num  := opera.operation_seq_num;
        l_itface_cst_rec.quantity_completed := 1; --l_qty_completed;                      
        l_itface_cst_rec.primary_quantity   := 1;
      
        INSERT INTO cst_comp_snap_interface VALUES l_itface_cst_rec;
      END LOOP;
    
      l_itface_serial_rec.last_update_date  := SYSDATE;
      l_itface_serial_rec.last_updated_by   := -1; --l_user_id;                      
      l_itface_serial_rec.creation_date     := SYSDATE;
      l_itface_serial_rec.created_by        := -1; --l_user_id;                      
      l_itface_serial_rec.last_update_login := -1;
    
      l_itface_serial_rec.transaction_interface_id := l_itface_mtran_rec.transaction_interface_id;
      l_itface_serial_rec.fm_serial_number         := l_serial_num;
      l_itface_serial_rec.to_serial_number         := l_serial_num;
    
      INSERT INTO mtl_serial_numbers_interface VALUES l_itface_serial_rec;
    
    ELSE
      l_error_count := l_error_count + 1;
    
    END IF;
  
    dbms_output.put_line(/*jobc.organization || chr(9) || jobc.job_no || chr(9) || jobc.assembly || chr(9) || jobc.quantity ||
                         chr(9) || jobc.serial_number || chr(9) || jobc.completion_date || chr(9) ||*/ l_error_status || chr(9) ||
                         l_error_message);
  --END LOOP;

  dbms_output.put_line('Total:' || l_count);
  dbms_output.put_line('Error:' || l_error_count);

  IF l_error_count > 0 THEN
    ROLLBACK;
  ELSE
    COMMIT;
    ln_request_no := apps.fnd_request.submit_request(application => 'INV' --cv_wip_app_name                      
                                                    ,
                                                     program     => 'INCTCM' --cv_move_api                      
                                                    ,
                                                     description => NULL);
  
    IF ln_request_no > 0 THEN
      COMMIT;
      dbms_output.put_line('Request_id:' || ln_request_no);
    ELSE
      COMMIT;
      dbms_output.put_line('Submit standrd request faild');
    END IF;
  
  END IF;
END;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值