EBS中收藏的一段实现on-insert、on-delete、on-update、on-lock代码

下面的代码是摘自EBS的form,仅供参考。比如,数据源名称是CUX_XXXX_TEST,那么可以在form中定义一个程序单元,命名为:XXXX_TEST_PRIVATE,那么程序头和程序体的代码分别如下:

包头:

PACKAGE xxxx_test_private IS
  PROCEDURE insert_row;
  PROCEDURE lock_row;
  PROCEDURE update_row;
  PROCEDURE delete_row;
END xxxx_test_private;

包体:

PACKAGE BODY xxxx_test_private IS

  /*=====================================
  ** PROCEDURE:   insert_row()
  **=====================================*/
  PROCEDURE insert_row IS
  
    CURSOR row_id IS
      SELECT ROWID
        FROM cux_xxxx_test
       WHERE tolerance_id = :xxxx_test.tolerance_id;
  
  BEGIN
  
    fnd_standard.set_who;
  
    IF :xxxx_test.tolerance_id IS NULL THEN
      SELECT cux_xxxx_test_s.nextval
        INTO :xxxx_test.tolerance_id
        FROM sys.dual;
    END IF;
  
    :xxxx_test.row_version_number := 1;
  
    INSERT INTO cux_xxxx_test
      (tolerance_id,
       tolerance_ccid,
       exchange_gal_ccid,
       min_ap_tolerance,
       max_ap_tolerance,
       min_tax_tolerance,
       max_tax_tolerance,
       row_version_number,
       creation_date,
       created_by,
       last_updated_by,
       last_update_date,
       last_update_login,
       attribute_category,
       attribute1,
       attribute2,
       attribute3,
       attribute4,
       attribute5,
       attribute6,
       attribute7,
       attribute8,
       attribute9,
       attribute10,
       attribute11,
       attribute12,
       attribute13,
       attribute14,
       attribute15)
    VALUES
      (:xxxx_test.tolerance_id,
       :xxxx_test.tolerance_ccid,
       :xxxx_test.exchange_gal_ccid,
       :xxxx_test.min_ap_tolerance,
       :xxxx_test.max_ap_tolerance,
       :xxxx_test.min_tax_tolerance,
       :xxxx_test.max_tax_tolerance,
       :xxxx_test.row_version_number,
       :xxxx_test.creation_date,
       :xxxx_test.created_by,
       :xxxx_test.last_updated_by,
       :xxxx_test.last_update_date,
       :xxxx_test.last_update_login,
       :xxxx_test.attribute_category,
       :xxxx_test.attribute1,
       :xxxx_test.attribute2,
       :xxxx_test.attribute3,
       :xxxx_test.attribute4,
       :xxxx_test.attribute5,
       :xxxx_test.attribute6,
       :xxxx_test.attribute7,
       :xxxx_test.attribute8,
       :xxxx_test.attribute9,
       :xxxx_test.attribute10,
       :xxxx_test.attribute11,
       :xxxx_test.attribute12,
       :xxxx_test.attribute13,
       :xxxx_test.attribute14,
       :xxxx_test.attribute15);
  
    OPEN row_id;
    FETCH row_id
      INTO :xxxx_test.row_id;
    IF (row_id%NOTFOUND) THEN
      CLOSE row_id;
      RAISE no_data_found;
    END IF;
    CLOSE row_id;
  
  END insert_row;

  /*=====================================
  ** PROCEDURE:   lock_row()
  **=====================================*/
  PROCEDURE lock_row IS
  
    CURSOR c_row IS
      SELECT *
        FROM cux_xxxx_test
       WHERE ROWID = :xxxx_test.row_id
         FOR UPDATE OF tolerance_id NOWAIT;
  
    rec c_row%ROWTYPE;
    i   NUMBER := 0;
  BEGIN
  
    LOOP
      BEGIN
        i := i + 1;
        OPEN c_row;
        FETCH c_row
          INTO rec;
        IF (c_row%NOTFOUND) THEN
          CLOSE c_row;
          fnd_message.set_name('FND',
                               'FORM_RECORD_DELETED');
          fnd_message.error;
          RAISE form_trigger_failure;
        END IF;
        CLOSE c_row;
      
        IF ((rec.tolerance_id = :xxxx_test.tolerance_id) AND
           ((rec.tolerance_ccid = :xxxx_test.tolerance_ccid) OR ((rec.tolerance_ccid IS NULL) AND (:xxxx_test.tolerance_ccid IS NULL))) AND
           ((rec.min_ap_tolerance = :xxxx_test.min_ap_tolerance) OR ((rec.min_ap_tolerance IS NULL) AND (:xxxx_test.min_ap_tolerance IS NULL))) AND
           ((rec.max_ap_tolerance = :xxxx_test.max_ap_tolerance) OR ((rec.max_ap_tolerance IS NULL) AND (:xxxx_test.max_ap_tolerance IS NULL))) AND
           ((rec.min_tax_tolerance = :xxxx_test.min_tax_tolerance) OR ((rec.min_tax_tolerance IS NULL) AND (:xxxx_test.min_tax_tolerance IS NULL))) AND
           ((rec.max_tax_tolerance = :xxxx_test.max_tax_tolerance) OR ((rec.max_tax_tolerance IS NULL) AND (:xxxx_test.max_tax_tolerance IS NULL))) AND
           ((rec.row_version_number = :xxxx_test.row_version_number) OR
           ((rec.row_version_number IS NULL) AND (:xxxx_test.row_version_number IS NULL))) AND
           ((rec.creation_date = :xxxx_test.creation_date) OR ((rec.creation_date IS NULL) AND (:xxxx_test.creation_date IS NULL))) AND
           ((rec.created_by = :xxxx_test.created_by) OR ((rec.created_by IS NULL) AND (:xxxx_test.created_by IS NULL))) AND
           ((rec.last_updated_by = :xxxx_test.last_updated_by) OR ((rec.last_updated_by IS NULL) AND (:xxxx_test.last_updated_by IS NULL))) AND
           ((rec.last_update_date = :xxxx_test.last_update_date) OR ((rec.last_update_date IS NULL) AND (:xxxx_test.last_update_date IS NULL))) AND
           ((rec.last_update_login = :xxxx_test.last_update_login) OR ((rec.last_update_login IS NULL) AND (:xxxx_test.last_update_login IS NULL))) AND
           ((rec.attribute_category = :xxxx_test.attribute_category) OR
           ((rec.attribute_category IS NULL) AND (:xxxx_test.attribute_category IS NULL))) AND
           ((rec.attribute1 = :xxxx_test.attribute1) OR ((rec.attribute1 IS NULL) AND (:xxxx_test.attribute1 IS NULL))) AND
           ((rec.attribute2 = :xxxx_test.attribute2) OR ((rec.attribute2 IS NULL) AND (:xxxx_test.attribute2 IS NULL))) AND
           ((rec.attribute3 = :xxxx_test.attribute3) OR ((rec.attribute3 IS NULL) AND (:xxxx_test.attribute3 IS NULL))) AND
           ((rec.attribute4 = :xxxx_test.attribute4) OR ((rec.attribute4 IS NULL) AND (:xxxx_test.attribute4 IS NULL))) AND
           ((rec.attribute5 = :xxxx_test.attribute5) OR ((rec.attribute5 IS NULL) AND (:xxxx_test.attribute5 IS NULL))) AND
           ((rec.attribute6 = :xxxx_test.attribute6) OR ((rec.attribute6 IS NULL) AND (:xxxx_test.attribute6 IS NULL))) AND
           ((rec.attribute7 = :xxxx_test.attribute7) OR ((rec.attribute7 IS NULL) AND (:xxxx_test.attribute7 IS NULL))) AND
           ((rec.attribute8 = :xxxx_test.attribute8) OR ((rec.attribute8 IS NULL) AND (:xxxx_test.attribute8 IS NULL))) AND
           ((rec.attribute9 = :xxxx_test.attribute9) OR ((rec.attribute9 IS NULL) AND (:xxxx_test.attribute9 IS NULL))) AND
           ((rec.attribute10 = :xxxx_test.attribute10) OR ((rec.attribute10 IS NULL) AND (:xxxx_test.attribute10 IS NULL))) AND
           ((rec.attribute11 = :xxxx_test.attribute11) OR ((rec.attribute11 IS NULL) AND (:xxxx_test.attribute11 IS NULL))) AND
           ((rec.attribute12 = :xxxx_test.attribute12) OR ((rec.attribute12 IS NULL) AND (:xxxx_test.attribute12 IS NULL))) AND
           ((rec.attribute13 = :xxxx_test.attribute13) OR ((rec.attribute13 IS NULL) AND (:xxxx_test.attribute13 IS NULL))) AND
           ((rec.attribute14 = :xxxx_test.attribute14) OR ((rec.attribute14 IS NULL) AND (:xxxx_test.attribute14 IS NULL))) AND
           ((rec.attribute15 = :xxxx_test.attribute15) OR ((rec.attribute15 IS NULL) AND (:xxxx_test.attribute15 IS NULL)))) THEN
          RETURN;
        ELSE
          fnd_message.set_name('FND',
                               'FORM_RECORD_CHANGED');
          fnd_message.error;
          RAISE form_trigger_failure;
        END IF;
      
      EXCEPTION
        WHEN app_exception.record_lock_exception THEN
          app_exception.record_lock_error(i);
      END;
    END LOOP;
  
  END lock_row;

  /*=====================================
  ** PROCEDURE:   update_row()
  **=====================================*/
  PROCEDURE update_row IS
  BEGIN
  
    fnd_standard.set_who;
  
    :xxxx_test.row_version_number := :xxxx_test.row_version_number + 1;
  
    UPDATE cux_xxxx_test
       SET tolerance_id       = :xxxx_test.tolerance_id,
           tolerance_ccid     = :xxxx_test.tolerance_ccid,
           exchange_gal_ccid  = :xxxx_test.exchange_gal_ccid,
           min_ap_tolerance   = :xxxx_test.min_ap_tolerance,
           max_ap_tolerance   = :xxxx_test.max_ap_tolerance,
           min_tax_tolerance  = :xxxx_test.min_tax_tolerance,
           max_tax_tolerance  = :xxxx_test.max_tax_tolerance,
           row_version_number = :xxxx_test.row_version_number,
           creation_date      = :xxxx_test.creation_date,
           created_by         = :xxxx_test.created_by,
           last_updated_by    = :xxxx_test.last_updated_by,
           last_update_date   = :xxxx_test.last_update_date,
           last_update_login  = :xxxx_test.last_update_login,
           attribute_category = :xxxx_test.attribute_category,
           attribute1         = :xxxx_test.attribute1,
           attribute2         = :xxxx_test.attribute2,
           attribute3         = :xxxx_test.attribute3,
           attribute4         = :xxxx_test.attribute4,
           attribute5         = :xxxx_test.attribute5,
           attribute6         = :xxxx_test.attribute6,
           attribute7         = :xxxx_test.attribute7,
           attribute8         = :xxxx_test.attribute8,
           attribute9         = :xxxx_test.attribute9,
           attribute10        = :xxxx_test.attribute10,
           attribute11        = :xxxx_test.attribute11,
           attribute12        = :xxxx_test.attribute12,
           attribute13        = :xxxx_test.attribute13,
           attribute14        = :xxxx_test.attribute14,
           attribute15        = :xxxx_test.attribute15
     WHERE ROWID = :xxxx_test.row_id;
  
    IF (SQL%NOTFOUND) THEN
      RAISE no_data_found;
    END IF;
  
  END update_row;

  /*=====================================
  ** PROCEDURE:   delete_row()
  **=====================================*/
  PROCEDURE delete_row IS
  BEGIN
  
    DELETE FROM cux_xxxx_test
     WHERE tolerance_id = :xxxx_test.tolerance_id;
  
    IF (SQL%NOTFOUND) THEN
      RAISE no_data_found;
    END IF;
  
  END delete_row;

END xxxx_test_private;

EBS中可以像上面这样写,Retek中需要略有改动,比如报错信息的方式会有点不一样。

本文标题:EBS中收藏的一段实现on-insert、on-delete、on-update、on-lock代码

本文链接:http://yedward.net/?id=370

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章