PROCEDURE insert_formuladetail(
p_formula_id NUMBER ,
p_ingredient_id NUMBER ,
p_new_qty NUMBER ,
p_uom VARCHAR2 DEFAULT NULL,
p_return_status OUT VARCHAR2 ,
p_message OUT VARCHAR2 )
IS
l_api_version CONSTANT NUMBER := 1.0;
l_init_msg_list VARCHAR2 (1) := FND_API.G_TRUE ;
l_commit VARCHAR2 (1) := FND_API.G_FALSE;
l_called_from_forms VARCHAR2 (10) := ‘NO’;
l_return_status VARCHAR2 (1);
l_msg_count NUMBER ;
l_msg_data VARCHAR2 (400);
L_FORMULA_DETAIL_TBL GMD_FORMULA_DETAIL_PUB.FORMULA_INSERT_DTL_TBL_TYPE;
— l_formula_head fm_form_mst_b%rowtype;
L_LINE_NO NUMBER ;
— i pls_ integer := 1;
no_proc_finish EXCEPTION ;
BEGIN
IF (p_formula_id IS NULL) THEN
p_message := ‘P_formula_id parameter can not be empty ‘;
raise no_proc_finish;
END IF ;
BEGIN
SELECT *
INTO l_formula_head
FROM fm_form_mst_b fm
WHERE fm.formula_id = p_formula_id;
EXCEPTION
WHEN OTHERS THEN
p_message := ‘ Could not managed to find a formula ‘;
raise no_proc_finish;
END ;
BEGIN
SELECT MAX (fm.line_no)
INTO l_line_no
FROM fm_matl_dtl fm
WHERE fm.FORMULA_ID = p_formula_id
AND fm.line_type = -1;
EXCEPTION
WHEN OTHERS THEN
p_message := ‘ Could not find a string formula ‘;
raise no_proc_finish;
END ;
gme_common_pvt.set_who;
l_formula_detail_tbl(i).formula_id := p_formula_id;
l_formula_detail_tbl(i).formula_no := l_formula_head.formula_no;
l_formula_detail_tbl(i).formula_vers := l_formula_head.formula_vers;
l_formula_detail_tbl(i).line_type := -1;
l_formula_detail_tbl(i).line_no := l_line_no + 1;
l_formula_detail_tbl(i).inventory_item_id := p_ingredient_id;
l_formula_detail_tbl(i).QTY := p_new_qty;
L_FORMULA_DETAIL_TBL(I).RELEASE_TYPE := 1; — manually
IF (p_uom IS NOT NULL) THEN
l_formula_detail_tbl(i).DETAIL_UOM := p_uom;
END IF ;
gmd_formula_detail_pub.insert_formuladetail( p_api_version => l_api_version ,p_init_msg_list => l_init_msg_list ,p_commit => l_commit ,p_called_from_forms => l_called_from_forms ,x_return_status => l_return_status ,x_msg_count => l_msg_count ,x_msg_data => l_msg_data ,p_formula_detail_tbl => l_formula_detail_tbl );
IF l_return_status <> FND_API.g_ret_sts_success THEN
IF l_msg_count = 1 THEN
p_message := FND_MSG_PUB.get(1,’F’);
RAISE no_proc_finish;
ELSE
FOR l IN 1..l_msg_count
LOOP
FND_MSG_PUB.get (p_msg_index => l ,p_encoded => ‘ F ‘ ,p_data => p_message ,p_msg_index_out => l_msg_count);
END LOOP ;
RAISE no_proc_finish;
END IF ;
END IF ;
p_return_status := ‘ S ‘;
EXCEPTION
WHEN no_proc_finish THEN
p_return_status := ‘ E ‘;
WHEN OTHERS THEN
p_message := SQLERRM ;
p_return_status := ‘ E ‘;
END ;
1. Create a staging table say “MJIL_FORMULA_UPLOAD” whose structure is given below.
CREATE TABLE MJIL_FORMULA_UPLOAD
(
RECORD_TYPE VARCHAR2 (1 BYTE),
FORMULA_NO VARCHAR2 (32 BYTE),
FORMULA_VERS NUMBER,
FORMULA_TYPE NUMBER,
FORMULA_DESC1 VARCHAR2 (70 BYTE),
FORMULA_DESC2 VARCHAR2 (70 BYTE),
FORMULA_CLASS VARCHAR2 (32 BYTE),
FMCONTROL_CLASS VARCHAR2 (32 BYTE),
INACTIVE_IND NUMBER,
OWNER_ORGANIZATION_ID NUMBER,
TOTAL_INPUT_QTY NUMBER,
TOTAL_OUTPUT_QTY NUMBER,
YIELD_UOM VARCHAR2 (3 BYTE),
FORMULA_STATUS VARCHAR2 (30 BYTE),
OWNER_ID NUMBER (15),
FORMULA_ID NUMBER,
FORMULALINE_ID NUMBER,
LINE_TYPE NUMBER,
LINE_NO NUMBER,
ITEM_NO VARCHAR2 (2000 BYTE),
INVENTORY_ITEM_ID NUMBER,
REVISION VARCHAR2 (3 BYTE),
QTY NUMBER,
DETAIL_UOM VARCHAR2 (3 BYTE),
MASTER_FORMULA_ID NUMBER,
RELEASE_TYPE NUMBER,
SCRAP_FACTOR NUMBER,
SCALE_TYPE_HDR NUMBER,
SCALE_TYPE_DTL NUMBER,
COST_ALLOC NUMBER,
PHANTOM_TYPE NUMBER,
REWORK_TYPE NUMBER,
BUFFER_IND NUMBER,
BY_PRODUCT_TYPE VARCHAR2 (1 BYTE),
INGREDIENT_END_DATE DATE,
ATTRIBUTE1 VARCHAR2 (240 BYTE),
ATTRIBUTE2 VARCHAR2 (240 BYTE),
ATTRIBUTE3 VARCHAR2 (240 BYTE),
ATTRIBUTE4 VARCHAR2 (240 BYTE),
ATTRIBUTE5 VARCHAR2 (240 BYTE),
ATTRIBUTE6 VARCHAR2 (240 BYTE),
ATTRIBUTE7 VARCHAR2 (240 BYTE),
ATTRIBUTE8 VARCHAR2 (240 BYTE),
ATTRIBUTE9 VARCHAR2 (240 BYTE),
ATTRIBUTE10 VARCHAR2 (240 BYTE),
ATTRIBUTE11 VARCHAR2 (240 BYTE),
ATTRIBUTE12 VARCHAR2 (240 BYTE),
ATTRIBUTE13 VARCHAR2 (240 BYTE),
ATTRIBUTE14 VARCHAR2 (240 BYTE),
ATTRIBUTE15 VARCHAR2 (240 BYTE),
ATTRIBUTE16 VARCHAR2 (240 BYTE),
ATTRIBUTE17 VARCHAR2 (240 BYTE),
ATTRIBUTE18 VARCHAR2 (240 BYTE),
ATTRIBUTE19 VARCHAR2 (240 BYTE),
ATTRIBUTE20 VARCHAR2 (240 BYTE),
ATTRIBUTE21 VARCHAR2 (240 BYTE),
ATTRIBUTE22 VARCHAR2 (240 BYTE),
ATTRIBUTE23 VARCHAR2 (240 BYTE),
ATTRIBUTE24 VARCHAR2 (240 BYTE),
ATTRIBUTE25 VARCHAR2 (240 BYTE),
ATTRIBUTE26 VARCHAR2 (240 BYTE),
ATTRIBUTE27 VARCHAR2 (240 BYTE),
ATTRIBUTE28 VARCHAR2 (240 BYTE),
ATTRIBUTE29 VARCHAR2 (240 BYTE),
ATTRIBUTE30 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE1 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE2 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE3 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE4 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE5 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE6 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE7 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE8 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE9 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE10 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE11 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE12 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE13 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE14 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE15 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE16 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE17 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE18 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE19 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE20 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE21 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE22 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE23 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE24 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE25 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE26 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE27 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE28 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE29 VARCHAR2 (240 BYTE),
DTL_ATTRIBUTE30 VARCHAR2 (240 BYTE),
ATTRIBUTE_CATEGORY VARCHAR2 (30 BYTE),
DTL_ATTRIBUTE_CATEGORY VARCHAR2 (30 BYTE),
TPFORMULA_ID NUMBER,
IAFORMULA_ID NUMBER,
SCALE_MULTIPLE NUMBER,
CONTRIBUTE_YIELD_IND VARCHAR2 (1 BYTE),
SCALE_UOM VARCHAR2 (4 BYTE),
CONTRIBUTE_STEP_QTY_IND VARCHAR2 (1 BYTE),
SCALE_ROUNDING_VARIANCE NUMBER,
ROUNDING_DIRECTION NUMBER,
TEXT_CODE_HDR NUMBER,
TEXT_CODE_DTL NUMBER,
USER_ID NUMBER,
CREATION_DATE DATE,
CREATED_BY NUMBER (15),
LAST_UPDATED_BY NUMBER (15),
LAST_UPDATE_DATE DATE,
LAST_UPDATE_LOGIN NUMBER (15),
USER_NAME VARCHAR2 (100 BYTE),
DELETE_MARK NUMBER DEFAULT 0,
AUTO_PRODUCT_CALC VARCHAR2 (1 BYTE),
PROD_PERCENT NUMBER
);
2. Next create a procedure similar to the one given below.
CREATE OR REPLACE PROCEDURE APPS.CONA_FML_UPLOAD_PD (ERRBUF OUT VARCHAR2,
RETCODE OUT NUMBER)
IS
/******************************************************************************
NAME: CONA_FML_UPLOAD_PD
PURPOSE: Formula Uploading
REVISIONS:
Ver Date Author Description
——— ———- ————— ————————————
1.0 8/16/2013 1. Oracle User Created this procedure.
NOTES:
Automatically available Auto Replace Keywords:
Object Name: CONA_FML_UPLOAD_PD
******************************************************************************/
mjil_fml_tabtype apps.gmd_formula_pub.formula_insert_hdr_tbl_type;
CURSOR c1
IS
SELECT *
FROM MJIL_FORMULA_UPLOAD
WHERE formula_no NOT IN (SELECT formula_no FROM fm_form_mst);
cnt NUMBER;
l_return_status VARCHAR2 (1);
l_msg_count NUMBER;
l_msg_data VARCHAR2 (1000);
l_out_index NUMBER := 0;
l_user_id NUMBER := 1114;
l_responsibility_id NUMBER := 22883;
l_responsibility_app_id NUMBER;
BEGIN
FND_GLOBAL.
APPS_INITIALIZE (l_user_id, l_responsibility_id, l_responsibility_app_id);
cnt := 0;
FOR i IN c1
LOOP
cnt := cnt + 1;
mjil_fml_tabtype (cnt).record_type := i.record_type;
mjil_fml_tabtype (cnt).FORMULA_NO := TRIM (i.FORMULA_NO);
mjil_fml_tabtype (cnt).FORMULA_VERS := i.formula_vers;
mjil_fml_tabtype (cnt).formula_type := i.formula_type;
mjil_fml_tabtype (cnt).formula_desc1 := i.formula_desc1;
mjil_fml_tabtype (cnt).formula_desc2 := i.formula_desc2;
mjil_fml_tabtype (cnt).inactive_ind := i.inactive_ind;
mjil_fml_tabtype (cnt).OWNER_ORGANIZATION_ID := i.owner_organization_id;
mjil_fml_tabtype (cnt).total_input_qty := i.total_input_qty;
mjil_fml_tabtype (cnt).total_output_qty := i.total_output_qty;
mjil_fml_tabtype (cnt).formula_status := i.formula_status;
mjil_fml_tabtype (cnt).line_no := i.line_no;
mjil_fml_tabtype (cnt).line_type := i.line_type;
mjil_fml_tabtype (cnt).item_no := i.item_no;
mjil_fml_tabtype (cnt).qty := i.qty;
mjil_fml_tabtype (cnt).detail_uom := i.detail_uom;
mjil_fml_tabtype (cnt).release_type := i.release_Type;
mjil_fml_tabtype (cnt).scrap_factor := i.scrap_factor;
mjil_fml_tabtype (cnt).scale_type_hdr := i.scale_type_hdr;
mjil_fml_tabtype (cnt).scale_type_dtl := i.scale_type_dtl;
mjil_fml_tabtype (cnt).cost_alloc := i.cost_alloc;
mjil_fml_tabtype (cnt).phantom_type := i.phantom_type;
mjil_fml_tabtype (cnt).rework_type := i.rework_type;
mjil_fml_tabtype (cnt).buffer_ind := i.buffer_ind;
mjil_fml_tabtype (cnt).contribute_yield_ind := i.contribute_yield_ind;
mjil_fml_tabtype (cnt).contribute_step_qty_ind :=
i.contribute_step_qty_ind;
mjil_fml_tabtype (cnt).delete_mark := i.delete_mark;
END LOOP;
GMD_FORMULA_PUB.Insert_Formula (p_api_version => 1,
p_init_msg_list => FND_API.G_TRUE,
p_commit => FND_API.G_TRUE,
p_called_from_forms => ‘NO’,
x_return_status => l_return_status,
x_msg_count => l_msg_count,
x_msg_data => l_msg_data,
p_formula_header_tbl => mjil_fml_tabtype);
DBMS_OUTPUT.put_line (‘Return status – ‘ || l_return_status);
DBMS_OUTPUT.put_line (‘Message count – ‘ || l_msg_count);
FOR i IN 1 .. l_msg_count
LOOP
FND_MSG_PUB.get (p_msg_index => i,
p_encoded => ‘F’,
p_data => l_msg_data,
P_MSG_INDEX_OUT => l_out_index);
DBMS_OUTPUT.PUT_LINE (‘Message Text ‘ || l_msg_data);
END LOOP;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line (‘Return status – ‘ || l_return_status);
DBMS_OUTPUT.put_line (‘Message count – ‘ || l_msg_count);
FOR i IN 1 .. l_msg_count
LOOP
FND_MSG_PUB.get (p_msg_index => i,
p_encoded => ‘F’,
p_data => l_msg_data,
P_MSG_INDEX_OUT => l_out_index);
DBMS_OUTPUT.PUT_LINE (‘Message Text ‘ || l_msg_data);
END LOOP;
END;
3. Register and run the procedure in Oracle Apps.
The procedure to delete the row from the formula
PROCEDURE delete_formuladetail(
p_formula_id NUMBER ,
p_formulaline_id NUMBER ,
p_return_status OUT VARCHAR2 ,
p_message OUT VARCHAR2 )
IS
l_api_version CONSTANT NUMBER := 1.1;
l_init_msg_list VARCHAR2(1) := FND_API.G_TRUE ;
l_commit VARCHAR2(1) := FND_API.G_FALSE;
l_called_from_forms VARCHAR2(10) := ‘NO’;
l_return_status VARCHAR2(1) ;
l_msg_count NUMBER ;
l_msg_data VARCHAR2(400) ;
L_FORMULA_DETAIL_TBL GMD_FORMULA_DETAIL_PUB.FORMULA_UPDATE_DTL_TBL_TYPE;
— l_formula_head fm_form_mst_b%rowtype;
L_FORMULA_LINE FM_MATL_DTL%ROWTYPE;
— i pls_integer := 1;
NO_PROC_FINISH EXCEPTION ;
BEGIN
IF (P_FORMULA_ID IS NULL) THEN
P_MESSAGE := ‘ P_formula_id parameter can not be empty ‘;
RAISE NO_PROC_FINISH;
END IF ;
— получаем данные заголовка
BEGIN
SELECT *
INTO l_formula_head
FROM fm_form_mst_b fm
WHERE fm.formula_id = p_formula_id;
EXCEPTION
WHEN OTHERS THEN
p_message := ‘ Unable to find a formula ‘;
raise no_proc_finish;
END ;
— get the data string formula
BEGIN
SELECT *
INTO l_formula_line
FROM fm_matl_dtl fm
WHERE fm.formulaline_id = p_formulaline_id;
EXCEPTION
WHEN OTHERS THEN
p_message := ‘ Could not find a string formula ‘;
raise no_proc_finish;
END ;
gme_common_pvt.set_who;
l_formula_detail_tbl(i).RECORD_TYPE := ‘D’;
l_formula_detail_tbl(i).formula_id := p_formula_id;
l_formula_detail_tbl(i).formula_no := l_formula_head.formula_no;
l_formula_detail_tbl(i).formula_vers := l_formula_head.formula_vers;
l_formula_detail_tbl(i).formulaline_id := p_formulaline_id;
GMD_FORMULA_DETAIL_PUB.DELETE_FORMULADETAIL( P_API_VERSION => L_API_VERSION, P_INIT_MSG_LIST => L_INIT_MSG_LIST, P_COMMIT => L_COMMIT, P_CALLED_FROM_FORMS => L_CALLED_FROM_FORMS, X_RETURN_STATUS => L_RETURN_STATUS, X_MSG_COUNT => L_MSG_COUNT, X_MSG_DATA => L_MSG_DATA, P_FORMULA_DETAIL_TBL => L_FORMULA_DETAIL_TBL );
IF l_return_status != FND_API.g_ret_sts_success THEN
IF l_msg_count = 1 THEN
p_message := FND_MSG_PUB.get(1,’F’);
RAISE no_proc_finish;
ELSE
FOR l IN 1..l_msg_count
LOOP
FND_MSG_PUB.get (p_msg_index => l ,p_encoded => ‘F’ ,p_data => p_message ,p_msg_index_out => l_msg_count);
END LOOP ;
RAISE no_proc_finish;
END IF ;
END IF ;
p_return_status := ‘S’;
EXCEPTION
WHEN no_proc_finish THEN
p_return_status := ‘ E ‘;
WHEN OTHERS THEN
p_message := SQLERRM ;
p_return_status := ‘ E ‘;
END ;
These context dependent flexfields were at first not possible in framework because the references like BLOCK etc (which you can use in Forms) are not applicable to framework pages. Starting from release 12.0.6 of E-Business Suite there is a way to implement context descriptive flexfields on framework pages.
As an example I’ll use some example we encountered during an implementation. There was a requirement that additional details should be given to a control item in Project Management. Control Items in Project Management can be used to record your issues and risk on your running projects. In this case we have 2 Control Item Types being Issue and Risk. Based on the type we need to display additional segments in a DFF for the end user to use. This DFF must change with every type of issue.
To implement this behaviour we need to do a number of things:
- Implement the DFF and add segments on it for 2 context values (Issue and Risk)
- Implement a reference value used by the DFF which is the Control Item Type
- Enable the Descriptive Flexfield on the Control Item page of a project
- Add a so called Flex Map to the Descriptive Flexfield on the OAF page to hold the control item type (and used by the DFF definition
- Bounce Apache
Key thing in the above is step number 4. Starting from release 12.0.6 E-Business Suite introduces the functionality of Flex Maps. Follow the below steps to implement the behaviour. Of course the same method can be used in other parts of E-Business Suite if the page has a seeded DFF. If that’s not the case than also a self made descriptive flexfield can be added but I’ll write a post about that in near future.
Step 1: Implement the DFF for Control Items
a) Go to Application Developer – Flexfield – Decriptive – Segments and query the Control Item flexfield with the name Control Items Desc Flex.
b) Unfreeze the Flexfield Definition if needed. Tick the checkbox Synchronize with Reference Field to make sure the context is updated when you move along control items. Also untick the Displayed checkbox as we don’t want to show the Context field to the end user. Set the Reference Field. Add the syntax :$PROFILES$.<Name>. As a name anything can be used. Remember that name because we need it in a later step. In my example I’ll set it to :$PROFILES$.TypeCICyriel
c) Add Context Field values. I’ll add 2 values named Issue and Risk. It’s very important that these names represent the exact naming of your control item types. Add as many as you like representing each option you have for the types. Add your segments to the contexts and assign them to one of the attribute fields.
By default the segments are set to be a required segment. If applicable turn this off by opening the segment (click on Open) and untick the required checkbox.
d) When done adding your context field values and the related segments save the work and freeze the Flexfield definition. Your DFF should compile without problems.
Step 2: Handle the DFF on the framework page (Control Items)
- Create Seeded Personalizations
- FND: Personalization Region Link Enabled
- FND: Personalization Seeding Mode
- HR: Enable User Personalization
- Personalize Self-Service Defn
Make sure the DFF is enabled (Shown) for the page. If that’s not the case than click the Personalize pencil on the row Flex: (PaDescFlex) and change the rendered setting to Yes.
Step 3: Add a Flex Map (bean) to the DFF in OAF through personalization
a) Click on Create Item on the row Flex: (PaDescFlex). You get a new screen where you define the Flex Map settings.
b) Enter the ID which can be anything you want. Leave the Attribute Set and Comments blank. For Name you have to use the exact name as defined in the reference field setting in the DFF definition without the :$PROFILES$. I used the reference field name settting :$PROFILES$.TypeCICyriel so the name of the Reference Value of the Flex Map must be TypeCICyriel.
The Reference Value is very important and will be the placeholder for in this case the Control Item Type name. This setting can use the so called SPEL language with which you reference an attribute of the page or view object of the OAF page. In this case the Control Item Type name is a seeded attribute of the ControlItemVO object of the page. We enter ${oa.ControlItemVO.CiTypeName} as the reference value. The Refers Context option needs to be set to true as we use this Flex Map as a context item.
c) Save all your work and bounce apache if the changes are not reflexted immediately.
The end result will be that when you create a new control item being, in our example, a risk or an issue the applicable additional segments are shown for the type. We’ve unticked the Displayed checkbox within the DFF definition so it’s also not visible in the OAF page. See below the shots for the end results. Good luck with using this feature 🙂
Risk showing the 2 defined risk segments of the DFF (Context hidden) |
Issue showing the 2 defined issue segments of the DFF (Context hidden) |
Steps to AME configuration for any user:
1) Select the User Management responsibility.
2) Select the Users page.
3) Search for the user to whom you wish to grant AME roles.
4) In the results table, click Update. In the Update User page, you can view user details along with a list of roles available to the user.
5) Click Assign Roles.
6) Select following roles and click Apply.
1) Approvals Management Administrator
2) Approvals Management Analyst
3) Approvals Management System Viewer
4) Approvals Management System Administrator
5) Approvals Management Process Owner
7) Grant data access to users
1) Login as Administrator.
2) Select the Functional Administrator responsibility.
3) Select the Grants tab.
4) Click Create Grant.
5) Select Specific User as grantee type.
6) Select the user as grantee key.
7) Select AME Transaction Types as Object
8) Select AME Calling Applications as Set
9) Follow the screen and click on Finish
8) Run “Workflow Directory Services User/Role Validation”
9) Select Approval Management Business Analyst responsibility and check functionality.
Latest Posts
- R12 – How to Handle NULL for :$FLEX$.VALUE_SET_NAME In Oracle ERPAugust 25, 2023 - 1:20 pm
- R12 – How to Delete Oracle AR TransactionsMarch 22, 2019 - 8:37 pm
- How to Define Custom Key Flexfield (KFF) in R12January 19, 2018 - 5:43 pm
- AutoLock Box Concepts In R12November 10, 2017 - 8:30 am
- R12 – java.sql.SQLException: Invalid column type in OAFSeptember 15, 2017 - 9:39 am
Recent Comments