* relocated to ddlutils/oracle/functions and ddlutils/oracle/procedures

This commit is contained in:
Heng Sin Low 2007-02-12 02:02:44 +00:00
parent ea1c5af324
commit 4455acc4b0
43 changed files with 0 additions and 4816 deletions

View File

@ -1,64 +0,0 @@
CREATE OR REPLACE FUNCTION acctBalance
(
p_Account_ID IN NUMBER,
p_AmtDr IN NUMBER,
p_AmtCr IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2004 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: Acct_Balance.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Aclculate Balance based on Account Sign + Type
* Description:
* If an account is specified and found
* - If the account sign is Natural it sets it based on Account Type
* Returns Credit or Debit Balance
* Test:
SELECT Acct_Balance (0,11,22) FROM DUAL
SELECT AccountType, AccountSign,
Acct_Balance(C_ElementValue_ID, 20, 10) "DR Balance",
Acct_Balance(C_ElementValue_ID, 10, 20) "CR Balance"
FROM C_ElementValue
WHERE AccountSign<>'N'
ORDER BY AccountSign
************************************************************************/
AS
v_balance NUMBER;
v_AccountType C_ElementValue.AccountType%TYPE;
v_AccountSign C_ElementValue.AccountSign%TYPE;
BEGIN
v_balance := p_AmtDr - p_AmtCr;
--
IF (p_Account_ID > 0) THEN
SELECT AccountType, AccountSign
INTO v_AccountType, v_AccountSign
FROM C_ElementValue
WHERE C_ElementValue_ID=p_Account_ID;
-- DBMS_OUTPUT.PUT_LINE('Type=' || v_AccountType || ' - Sign=' || v_AccountSign);
-- Natural Account Sign
IF (v_AccountSign='N') THEN
IF (v_AccountType IN ('A','E')) THEN
v_AccountSign := 'D';
ELSE
v_AccountSign := 'C';
END IF;
-- DBMS_OUTPUT.PUT_LINE('Type=' || v_AccountType || ' - Sign=' || v_AccountSign);
END IF;
-- Debit Balance
IF (v_AccountSign = 'C') THEN
v_balance := p_AmtCr - p_AmtDr;
END IF;
END IF;
--
RETURN v_balance;
EXCEPTION WHEN OTHERS THEN
-- In case Acct not found
RETURN p_AmtDr - p_AmtCr;
END acctBalance;
/

View File

@ -1,48 +0,0 @@
CREATE OR REPLACE FUNCTION bomPriceLimit
(
Product_ID IN NUMBER,
PriceList_Version_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2002 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: BOM_PriceLimit.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Return Limit Price of Product/BOM
* Description:
* if not found: 0
************************************************************************/
AS
v_Price NUMBER;
v_ProductPrice NUMBER;
-- Get BOM Product info
CURSOR CUR_BOM IS
SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM
FROM M_Product_BOM b, M_Product p
WHERE b.M_ProductBOM_ID=p.M_Product_ID
AND b.M_Product_ID=Product_ID;
--
BEGIN
-- Try to get price from PriceList directly
SELECT COALESCE (SUM(PriceLimit), 0)
INTO v_Price
FROM M_ProductPrice
WHERE M_PriceList_Version_ID=PriceList_Version_ID AND M_Product_ID=Product_ID;
-- DBMS_OUTPUT.PUT_LINE('Price=' || v_Price);
-- No Price - Check if BOM
IF (v_Price = 0) THEN
FOR bom IN CUR_BOM LOOP
v_ProductPrice := bomPriceLimit (bom.M_ProductBOM_ID, PriceList_Version_ID);
v_Price := v_Price + (bom.BOMQty * v_ProductPrice);
END LOOP;
END IF;
--
RETURN v_Price;
END bomPriceLimit;
/

View File

@ -1,49 +0,0 @@
CREATE OR REPLACE FUNCTION bomPriceList
(
Product_ID IN NUMBER,
PriceList_Version_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2002 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: BOM_PriceList.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Return List Price of Product/BOM
* Description:
* if not found: 0
************************************************************************/
AS
v_Price NUMBER;
v_ProductPrice NUMBER;
-- Get BOM Product info
CURSOR CUR_BOM IS
SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM
FROM M_Product_BOM b, M_Product p
WHERE b.M_ProductBOM_ID=p.M_Product_ID
AND b.M_Product_ID=Product_ID;
--
BEGIN
-- Try to get price from pricelist directly
SELECT COALESCE (SUM(PriceList), 0)
INTO v_Price
FROM M_ProductPrice
WHERE M_PriceList_Version_ID=PriceList_Version_ID AND M_Product_ID=Product_ID;
-- DBMS_OUTPUT.PUT_LINE('Price=' || Price);
-- No Price - Check if BOM
IF (v_Price = 0) THEN
FOR bom IN CUR_BOM LOOP
v_ProductPrice := bomPriceList (bom.M_ProductBOM_ID, PriceList_Version_ID);
v_Price := v_Price + (bom.BOMQty * v_ProductPrice);
-- DBMS_OUTPUT.PUT_LINE('Qry=' || bom.BOMQty || ' @ ' || v_ProductPrice || ', Price=' || v_Price);
END LOOP; -- BOM
END IF;
--
RETURN v_Price;
END bomPriceList;
/

View File

@ -1,49 +0,0 @@
CREATE OR REPLACE FUNCTION bomPriceStd
(
Product_ID IN NUMBER,
PriceList_Version_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2002 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: BOM_PriceStd.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Return Standard Price of Product/BOM
* Description:
* if not found: 0
************************************************************************/
AS
v_Price NUMBER;
v_ProductPrice NUMBER;
-- Get BOM Product info
CURSOR CUR_BOM IS
SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM
FROM M_Product_BOM b, M_Product p
WHERE b.M_ProductBOM_ID=p.M_Product_ID
AND b.M_Product_ID=Product_ID;
--
BEGIN
-- Try to get price from pricelist directly
SELECT COALESCE(SUM(PriceStd), 0)
INTO v_Price
FROM M_ProductPrice
WHERE M_PriceList_Version_ID=PriceList_Version_ID AND M_Product_ID=Product_ID;
-- DBMS_OUTPUT.PUT_LINE('Price=' || v_Price);
-- No Price - Check if BOM
IF (v_Price = 0) THEN
FOR bom IN CUR_BOM LOOP
v_ProductPrice := bomPriceStd (bom.M_ProductBOM_ID, PriceList_Version_ID);
v_Price := v_Price + (bom.BOMQty * v_ProductPrice);
-- DBMS_OUTPUT.PUT_LINE('Price=' || v_Price);
END LOOP; -- BOM
END IF;
--
RETURN v_Price;
END bomPriceStd;
/

View File

@ -1,21 +0,0 @@
CREATE OR REPLACE FUNCTION bomQtyAvailable
(
Product_ID IN NUMBER,
Warehouse_ID IN NUMBER,
Locator_ID IN NUMBER -- Only used, if warehouse is null
)
RETURN NUMBER
/******************************************************************************
* ** Adempiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
* Open Source Software Provided "AS IS" without warranty or liability
* When you use any parts (changed or unchanged), add "Powered by Adempiere" to
* your product name; See license details http://www.adempiere.org/license.html
******************************************************************************
* Return quantity available for BOM
*/
AS
BEGIN
RETURN bomQtyOnHand(Product_ID, Warehouse_ID, Locator_ID)
- bomQtyReserved(Product_ID, Warehouse_ID, Locator_ID);
END bomQtyAvailable;
/

View File

@ -1,120 +0,0 @@
CREATE OR REPLACE FUNCTION bomQtyOnHand
(
Product_ID IN NUMBER,
Warehouse_ID IN NUMBER,
Locator_ID IN NUMBER -- Only used, if warehouse is null
)
RETURN NUMBER
/******************************************************************************
* ** Adempiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
* Open Source Software Provided "AS IS" without warranty or liability
* When you use any parts (changed or unchanged), add "Powered by Adempiere" to
* your product name; See license details http://www.adempiere.org/license.html
******************************************************************************
* Return quantity on hand for BOM
*/
AS
myWarehouse_ID NUMBER;
Quantity NUMBER := 99999; -- unlimited
IsBOM CHAR(1);
IsStocked CHAR(1);
ProductType CHAR(1);
ProductQty NUMBER;
StdPrecision NUMBER;
-- Get BOM Product info
CURSOR CUR_BOM IS
SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM, p.IsStocked, p.ProductType
FROM M_Product_BOM b, M_Product p
WHERE b.M_ProductBOM_ID=p.M_Product_ID
AND b.M_Product_ID=Product_ID;
--
BEGIN
-- Check Parameters
myWarehouse_ID := Warehouse_ID;
IF (myWarehouse_ID IS NULL) THEN
IF (Locator_ID IS NULL) THEN
RETURN 0;
ELSE
SELECT SUM(M_Warehouse_ID) INTO myWarehouse_ID
FROM M_Locator
WHERE M_Locator_ID=Locator_ID;
END IF;
END IF;
IF (myWarehouse_ID IS NULL) THEN
RETURN 0;
END IF;
-- DBMS_OUTPUT.PUT_LINE('Warehouse=' || myWarehouse_ID);
-- Check, if product exists and if it is stocked
BEGIN
SELECT IsBOM, ProductType, IsStocked
INTO IsBOM, ProductType, IsStocked
FROM M_Product
WHERE M_Product_ID=Product_ID;
--
EXCEPTION -- not found
WHEN OTHERS THEN
RETURN 0;
END;
-- Unimited capacity if no item
IF (IsBOM='N' AND (ProductType<>'I' OR IsStocked='N')) THEN
RETURN Quantity;
-- Stocked item
ELSIF (IsStocked='Y') THEN
-- Get ProductQty
SELECT NVL(SUM(QtyOnHand), 0)
INTO ProductQty
FROM M_Storage s
WHERE M_Product_ID=Product_ID
AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
AND l.M_Warehouse_ID=myWarehouse_ID);
--
-- DBMS_OUTPUT.PUT_LINE('Qty=' || ProductQty);
RETURN ProductQty;
END IF;
-- Go though BOM
-- DBMS_OUTPUT.PUT_LINE('BOM');
FOR bom IN CUR_BOM LOOP
-- Stocked Items "leaf node"
IF (bom.ProductType = 'I' AND bom.IsStocked = 'Y') THEN
-- Get ProductQty
SELECT NVL(SUM(QtyOnHand), 0)
INTO ProductQty
FROM M_Storage s
WHERE M_Product_ID=bom.M_ProductBOM_ID
AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
AND l.M_Warehouse_ID=myWarehouse_ID);
-- Get Rounding Precision
SELECT NVL(MAX(u.StdPrecision), 0)
INTO StdPrecision
FROM C_UOM u, M_Product p
WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=bom.M_ProductBOM_ID;
-- How much can we make with this product
ProductQty := ROUND (ProductQty/bom.BOMQty, StdPrecision);
-- How much can we make overall
IF (ProductQty < Quantity) THEN
Quantity := ProductQty;
END IF;
-- Another BOM
ELSIF (bom.IsBOM = 'Y') THEN
ProductQty := bomQtyOnHand (bom.M_ProductBOM_ID, myWarehouse_ID, Locator_ID);
-- How much can we make overall
IF (ProductQty < Quantity) THEN
Quantity := ProductQty;
END IF;
END IF;
END LOOP; -- BOM
IF (Quantity > 0) THEN
-- Get Rounding Precision for Product
SELECT NVL(MAX(u.StdPrecision), 0)
INTO StdPrecision
FROM C_UOM u, M_Product p
WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=Product_ID;
--
RETURN ROUND (Quantity, StdPrecision);
END IF;
RETURN 0;
END bomQtyOnHand;
/

View File

@ -1,126 +0,0 @@
CREATE OR REPLACE FUNCTION bomQtyOrdered
(
p_Product_ID IN NUMBER,
p_Warehouse_ID IN NUMBER,
p_Locator_ID IN NUMBER -- Only used, if warehouse is null
)
RETURN NUMBER
/******************************************************************************
* ** Adempiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
* Open Source Software Provided "AS IS" without warranty or liability
* When you use any parts (changed or unchanged), add "Powered by Adempiere" to
* your product name; See license details http://www.adempiere.org/license.html
******************************************************************************
* Return quantity ordered for BOM
*/
AS
v_Warehouse_ID NUMBER;
v_Quantity NUMBER := 99999; -- unlimited
v_IsBOM CHAR(1);
v_IsStocked CHAR(1);
v_ProductType CHAR(1);
v_ProductQty NUMBER;
v_StdPrecision NUMBER;
-- Get BOM Product info
CURSOR CUR_BOM IS
SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM, p.IsStocked, p.ProductType
FROM M_Product_BOM b, M_Product p
WHERE b.M_ProductBOM_ID=p.M_Product_ID
AND b.M_Product_ID=p_Product_ID;
--
BEGIN
-- Check Parameters
v_Warehouse_ID := p_Warehouse_ID;
IF (v_Warehouse_ID IS NULL) THEN
IF (p_Locator_ID IS NULL) THEN
RETURN 0;
ELSE
SELECT MAX(M_Warehouse_ID) INTO v_Warehouse_ID
FROM M_Locator
WHERE M_Locator_ID=p_Locator_ID;
END IF;
END IF;
IF (v_Warehouse_ID IS NULL) THEN
RETURN 0;
END IF;
-- DBMS_OUTPUT.PUT_LINE('Warehouse=' || v_Warehouse_ID);
-- Check, if product exists and if it is stocked
BEGIN
SELECT IsBOM, ProductType, IsStocked
INTO v_IsBOM, v_ProductType, v_IsStocked
FROM M_Product
WHERE M_Product_ID=p_Product_ID;
--
EXCEPTION -- not found
WHEN OTHERS THEN
RETURN 0;
END;
-- No reservation for non-stocked
IF (v_IsBOM='N' AND (v_ProductType<>'I' OR v_IsStocked='N')) THEN
RETURN 0;
-- Stocked item
ELSIF (v_IsStocked='Y') THEN
-- Get ProductQty
SELECT NVL(SUM(QtyOrdered), 0)
INTO v_ProductQty
FROM M_Storage s
WHERE M_Product_ID=p_Product_ID
AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
AND l.M_Warehouse_ID=v_Warehouse_ID);
--
RETURN v_ProductQty;
END IF;
-- Go though BOM
-- DBMS_OUTPUT.PUT_LINE('BOM');
FOR bom IN CUR_BOM LOOP
-- Stocked Items "leaf node"
IF (bom.ProductType = 'I' AND bom.IsStocked = 'Y') THEN
-- Get ProductQty
SELECT NVL(SUM(QtyOrdered), 0)
INTO v_ProductQty
FROM M_Storage s
WHERE M_Product_ID=bom.M_ProductBOM_ID
AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
AND l.M_Warehouse_ID=v_Warehouse_ID);
-- Get Rounding Precision
SELECT NVL(MAX(u.StdPrecision), 0)
INTO v_StdPrecision
FROM C_UOM u, M_Product p
WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=bom.M_ProductBOM_ID;
-- How much can we make with this product
v_ProductQty := ROUND (v_ProductQty/bom.BOMQty, v_StdPrecision);
-- How much can we make overall
IF (v_ProductQty < v_Quantity) THEN
v_Quantity := v_ProductQty;
END IF;
-- Another BOM
ELSIF (bom.IsBOM = 'Y') THEN
v_ProductQty := bomQtyOrdered (bom.M_ProductBOM_ID, v_Warehouse_ID, p_Locator_ID);
-- How much can we make overall
IF (v_ProductQty < v_Quantity) THEN
v_Quantity := v_ProductQty;
END IF;
END IF;
END LOOP; -- BOM
-- Unlimited (e.g. only services)
IF (v_Quantity = 99999) THEN
RETURN 0;
END IF;
IF (v_Quantity > 0) THEN
-- Get Rounding Precision for Product
SELECT NVL(MAX(u.StdPrecision), 0)
INTO v_StdPrecision
FROM C_UOM u, M_Product p
WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=p_Product_ID;
--
RETURN ROUND (v_Quantity, v_StdPrecision);
END IF;
--
RETURN 0;
END bomQtyOrdered;
/

View File

@ -1,125 +0,0 @@
CREATE OR REPLACE FUNCTION bomQtyReserved
(
p_Product_ID IN NUMBER,
p_Warehouse_ID IN NUMBER,
p_Locator_ID IN NUMBER -- Only used, if warehouse is null
)
RETURN NUMBER
/******************************************************************************
* ** Adempiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
* Open Source Software Provided "AS IS" without warranty or liability
* When you use any parts (changed or unchanged), add "Powered by Adempiere" to
* your product name; See license details http://www.adempiere.org/license.html
******************************************************************************
* Return quantity reserved for BOM
*/
AS
v_Warehouse_ID NUMBER;
v_Quantity NUMBER := 99999; -- unlimited
v_IsBOM CHAR(1);
v_IsStocked CHAR(1);
v_ProductType CHAR(1);
v_ProductQty NUMBER;
v_StdPrecision NUMBER;
-- Get BOM Product info
CURSOR CUR_BOM IS
SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM, p.IsStocked, p.ProductType
FROM M_Product_BOM b, M_Product p
WHERE b.M_ProductBOM_ID=p.M_Product_ID
AND b.M_Product_ID=p_Product_ID;
--
BEGIN
-- Check Parameters
v_Warehouse_ID := p_Warehouse_ID;
IF (v_Warehouse_ID IS NULL) THEN
IF (p_Locator_ID IS NULL) THEN
RETURN 0;
ELSE
SELECT MAX(M_Warehouse_ID) INTO v_Warehouse_ID
FROM M_Locator
WHERE M_Locator_ID=p_Locator_ID;
END IF;
END IF;
IF (v_Warehouse_ID IS NULL) THEN
RETURN 0;
END IF;
-- DBMS_OUTPUT.PUT_LINE('Warehouse=' || v_Warehouse_ID);
-- Check, if product exists and if it is stocked
BEGIN
SELECT IsBOM, ProductType, IsStocked
INTO v_IsBOM, v_ProductType, v_IsStocked
FROM M_Product
WHERE M_Product_ID=p_Product_ID;
--
EXCEPTION -- not found
WHEN OTHERS THEN
RETURN 0;
END;
-- No reservation for non-stocked
IF (v_IsBOM='N' AND (v_ProductType<>'I' OR v_IsStocked='N')) THEN
RETURN 0;
-- Stocked item
ELSIF (v_IsStocked='Y') THEN
-- Get ProductQty
SELECT NVL(SUM(QtyReserved), 0)
INTO v_ProductQty
FROM M_Storage s
WHERE M_Product_ID=p_Product_ID
AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
AND l.M_Warehouse_ID=v_Warehouse_ID);
--
RETURN v_ProductQty;
END IF;
-- Go though BOM
-- DBMS_OUTPUT.PUT_LINE('BOM');
FOR bom IN CUR_BOM LOOP
-- Stocked Items "leaf node"
IF (bom.ProductType = 'I' AND bom.IsStocked = 'Y') THEN
-- Get ProductQty
SELECT NVL(SUM(QtyReserved), 0)
INTO v_ProductQty
FROM M_Storage s
WHERE M_Product_ID=bom.M_ProductBOM_ID
AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
AND l.M_Warehouse_ID=v_Warehouse_ID);
-- Get Rounding Precision
SELECT NVL(MAX(u.StdPrecision), 0)
INTO v_StdPrecision
FROM C_UOM u, M_Product p
WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=bom.M_ProductBOM_ID;
-- How much can we make with this product
v_ProductQty := ROUND (v_ProductQty/bom.BOMQty, v_StdPrecision);
-- How much can we make overall
IF (v_ProductQty < v_Quantity) THEN
v_Quantity := v_ProductQty;
END IF;
-- Another BOM
ELSIF (bom.IsBOM = 'Y') THEN
v_ProductQty := bomQtyReserved (bom.M_ProductBOM_ID, v_Warehouse_ID, p_Locator_ID);
-- How much can we make overall
IF (v_ProductQty < v_Quantity) THEN
v_Quantity := v_ProductQty;
END IF;
END IF;
END LOOP; -- BOM
-- Unlimited (e.g. only services)
IF (v_Quantity = 99999) THEN
RETURN 0;
END IF;
IF (v_Quantity > 0) THEN
-- Get Rounding Precision for Product
SELECT NVL(MAX(u.StdPrecision), 0)
INTO v_StdPrecision
FROM C_UOM u, M_Product p
WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=p_Product_ID;
--
RETURN ROUND (v_Quantity, v_StdPrecision);
END IF;
RETURN 0;
END bomQtyReserved;
/

View File

@ -1,34 +0,0 @@
CREATE OR REPLACE FUNCTION bpartnerRemitLocation
(
p_C_BPartner_ID C_BPartner.C_BPartner_ID%TYPE
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2002 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_BPartner_RemitLocation.SQL,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Return the first RemitTo C_Location_ID of a Business Partner
* Description:
*
************************************************************************/
AS
v_C_Location_ID NUMBER := NULL;
CURSOR CUR_BPLoc IS
SELECT IsRemitTo, C_Location_ID
FROM C_BPartner_Location
WHERE C_BPartner_ID=p_C_BPartner_ID
ORDER BY IsRemitTo DESC;
BEGIN
FOR l IN CUR_BPLoc LOOP
IF (v_C_Location_ID IS NULL) THEN
v_C_Location_ID := l.C_Location_ID;
END IF;
END LOOP;
RETURN v_C_Location_ID;
END bpartnerRemitLocation;
/

View File

@ -1,47 +0,0 @@
CREATE OR REPLACE FUNCTION currencyBase
(
p_Amount IN NUMBER,
p_CurFrom_ID IN NUMBER,
p_ConvDate IN DATE,
p_Client_ID IN NUMBER,
p_Org_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Base_Convert.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Convert Amount to Base Currency of Client
* Description:
* Get CurrencyTo from Client
* Returns NULL, if conversion not found
* Standard Rounding
* Test:
* SELECT C_Base_Convert(100,116,11,null) FROM DUAL => 64.72
************************************************************************/
AS
v_CurTo_ID NUMBER;
BEGIN
-- Get Currency
SELECT MAX(ac.C_Currency_ID)
INTO v_CurTo_ID
FROM AD_ClientInfo ci, C_AcctSchema ac
WHERE ci.C_AcctSchema1_ID=ac.C_AcctSchema_ID
AND ci.AD_Client_ID=p_Client_ID;
-- Same as Currency_Conversion - if currency/rate not found - return 0
IF (v_CurTo_ID IS NULL) THEN
RETURN NULL;
END IF;
-- Same currency
IF (p_CurFrom_ID = v_CurTo_ID) THEN
RETURN p_Amount;
END IF;
RETURN currencyConvert (p_Amount, p_CurFrom_ID, v_CurTo_ID, p_ConvDate, null, p_Client_ID, p_Org_ID);
END currencyBase;
/

View File

@ -1,51 +0,0 @@
CREATE OR REPLACE FUNCTION currencyConvert
(
p_Amount IN NUMBER,
p_CurFrom_ID IN NUMBER,
p_CurTo_ID IN NUMBER,
p_ConvDate IN DATE,
p_ConversionType_ID IN NUMBER,
p_Client_ID IN NUMBER,
p_Org_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Currency_Convert.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Convert Amount (using IDs)
* Description:
* from CurrencyFrom_ID to CurrencyTo_ID
* Returns NULL, if conversion not found
* Standard Rounding
* Test:
* SELECT C_Currency_Convert(100,116,100,null,null) FROM DUAL => 64.72
* SELECT C_Currency_Convert(100,116,100) FROM DUAL => 64.72
************************************************************************/
AS
v_Rate NUMBER;
BEGIN
-- Return Amount
IF (p_Amount = 0 OR p_CurFrom_ID = p_CurTo_ID) THEN
RETURN p_Amount;
END IF;
-- Return NULL
IF (p_Amount IS NULL OR p_CurFrom_ID IS NULL OR p_CurTo_ID IS NULL) THEN
RETURN NULL;
END IF;
-- Get Rate
v_Rate := currencyRate (p_CurFrom_ID, p_CurTo_ID, p_ConvDate, p_ConversionType_ID, p_Client_ID, p_Org_ID);
IF (v_Rate IS NULL) THEN
RETURN NULL;
END IF;
-- Standard Precision
RETURN currencyRound(p_Amount * v_Rate, p_CurTo_ID, null);
END currencyConvert;
/

View File

@ -1,171 +0,0 @@
CREATE OR REPLACE FUNCTION currencyRate
(
p_CurFrom_ID IN NUMBER,
p_CurTo_ID IN NUMBER,
p_ConvDate IN DATE,
p_ConversionType_ID IN NUMBER,
p_Client_ID IN NUMBER,
p_Org_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Currency_Rate.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Return Conversion Rate
* Description:
* from CurrencyFrom_ID to CurrencyTo_ID
* Returns NULL, if rate not found
* Test
* SELECT C_Currency_Rate(116, 100, null, null) FROM DUAL; => .647169
* SELECT C_Currency_Rate(116, 100) FROM DUAL; => .647169
************************************************************************/
AS
-- Currency From variables
cf_IsEuro CHAR(1);
cf_IsEMUMember CHAR(1);
cf_EMUEntryDate DATE;
cf_EMURate NUMBER;
-- Currency To variables
ct_IsEuro CHAR(1);
ct_IsEMUMember CHAR(1);
ct_EMUEntryDate DATE;
ct_EMURate NUMBER;
-- Triangle
v_CurrencyFrom NUMBER;
v_CurrencyTo NUMBER;
v_CurrencyEuro NUMBER;
--
v_ConvDate DATE := SysDate;
v_ConversionType_ID NUMBER := 0;
v_Rate NUMBER;
BEGIN
-- No Conversion
IF (p_CurFrom_ID = p_CurTo_ID) THEN
RETURN 1;
END IF;
-- Default Date Parameter
IF (p_ConvDate IS NOT NULL) THEN
v_ConvDate := p_ConvDate; -- SysDate
END IF;
-- Default Conversion Type
IF (p_ConversionType_ID IS NULL OR p_ConversionType_ID = 0) THEN
BEGIN
SELECT C_ConversionType_ID
INTO v_ConversionType_ID
FROM C_ConversionType
WHERE IsDefault='Y'
AND AD_Client_ID IN (0,p_Client_ID)
AND ROWNUM=1
ORDER BY AD_Client_ID DESC;
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Conversion Type Not Found');
END;
ELSE
v_ConversionType_ID := p_ConversionType_ID;
END IF;
-- Get Currency Info
SELECT MAX(IsEuro), MAX(IsEMUMember), MAX(EMUEntryDate), MAX(EMURate)
INTO cf_IsEuro, cf_IsEMUMember, cf_EMUEntryDate, cf_EMURate
FROM C_Currency
WHERE C_Currency_ID = p_CurFrom_ID;
-- Not Found
IF (cf_IsEuro IS NULL) THEN
DBMS_OUTPUT.PUT_LINE('From Currency Not Found');
RETURN NULL;
END IF;
SELECT MAX(IsEuro), MAX(IsEMUMember), MAX(EMUEntryDate), MAX(EMURate)
INTO ct_IsEuro, ct_IsEMUMember, ct_EMUEntryDate, ct_EMURate
FROM C_Currency
WHERE C_Currency_ID = p_CurTo_ID;
-- Not Found
IF (ct_IsEuro IS NULL) THEN
DBMS_OUTPUT.PUT_LINE('To Currency Not Found');
RETURN NULL;
END IF;
-- Fixed - From Euro to EMU
IF (cf_IsEuro = 'Y' AND ct_IsEMUMember ='Y' AND v_ConvDate >= ct_EMUEntryDate) THEN
RETURN ct_EMURate;
END IF;
-- Fixed - From EMU to Euro
IF (ct_IsEuro = 'Y' AND cf_IsEMUMember ='Y' AND v_ConvDate >= cf_EMUEntryDate) THEN
RETURN 1 / cf_EMURate;
END IF;
-- Fixed - From EMU to EMU
IF (cf_IsEMUMember = 'Y' AND cf_IsEMUMember ='Y'
AND v_ConvDate >= cf_EMUEntryDate AND v_ConvDate >= ct_EMUEntryDate) THEN
RETURN ct_EMURate / cf_EMURate;
END IF;
-- Flexible Rates
v_CurrencyFrom := p_CurFrom_ID;
v_CurrencyTo := p_CurTo_ID;
-- if EMU Member involved, replace From/To Currency
IF ((cf_isEMUMember = 'Y' AND v_ConvDate >= cf_EMUEntryDate)
OR (ct_isEMUMember = 'Y' AND v_ConvDate >= ct_EMUEntryDate)) THEN
SELECT MAX(C_Currency_ID)
INTO v_CurrencyEuro
FROM C_Currency
WHERE IsEuro = 'Y';
-- Conversion Rate not Found
IF (v_CurrencyEuro IS NULL) THEN
DBMS_OUTPUT.PUT_LINE('Euro Not Found');
RETURN NULL;
END IF;
IF (cf_isEMUMember = 'Y' AND v_ConvDate >= cf_EMUEntryDate) THEN
v_CurrencyFrom := v_CurrencyEuro;
ELSE
v_CurrencyTo := v_CurrencyEuro;
END IF;
END IF;
-- Get Rate
DECLARE
CURSOR CUR_Rate IS
SELECT MultiplyRate
FROM C_Conversion_Rate
WHERE C_Currency_ID=v_CurrencyFrom AND C_Currency_ID_To=v_CurrencyTo
AND C_ConversionType_ID=v_ConversionType_ID
AND v_ConvDate BETWEEN ValidFrom AND ValidTo
AND AD_Client_ID IN (0,p_Client_ID) AND AD_Org_ID IN (0,p_Org_ID)
ORDER BY AD_Client_ID DESC, AD_Org_ID DESC, ValidFrom DESC;
BEGIN
FOR c IN CUR_Rate LOOP
v_Rate := c.MultiplyRate;
EXIT; -- only first
END LOOP;
END;
-- Not found
IF (v_Rate IS NULL) THEN
DBMS_OUTPUT.PUT_LINE('Conversion Rate Not Found');
RETURN NULL;
END IF;
-- Currency From was EMU
IF (cf_isEMUMember = 'Y' AND v_ConvDate >= cf_EMUEntryDate) THEN
RETURN v_Rate / cf_EMURate;
END IF;
-- Currency To was EMU
IF (ct_isEMUMember = 'Y' AND v_ConvDate >= ct_EMUEntryDate) THEN
RETURN v_Rate * ct_EMURate;
END IF;
RETURN v_Rate;
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
RETURN NULL;
END currencyRate;
/

View File

@ -1,49 +0,0 @@
CREATE OR REPLACE FUNCTION currencyRound
(
p_Amount IN NUMBER,
p_CurTo_ID IN NUMBER,
p_Costing IN VARCHAR2 -- Default 'N'
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Currency_Round.SQL,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Round amount for Traget Currency
* Description:
* Round Amount using Costing or Standard Precision
* Returns unmodified amount if currency not found
* Test:
* SELECT C_Currency_Round(C_Currency_Convert(100,116,100,null,null),100,null) FROM DUAL => 64.72
************************************************************************/
AS
v_StdPrecision NUMBER;
v_CostPrecision NUMBER;
BEGIN
-- Nothing to convert
IF (p_Amount IS NULL OR p_CurTo_ID IS NULL) THEN
RETURN p_Amount;
END IF;
-- Ger Precision
SELECT MAX(StdPrecision), MAX(CostingPrecision)
INTO v_StdPrecision, v_CostPrecision
FROM C_Currency
WHERE C_Currency_ID = p_CurTo_ID;
-- Currency Not Found
IF (v_StdPrecision IS NULL) THEN
RETURN p_Amount;
END IF;
IF (p_Costing = 'Y') THEN
RETURN ROUND (p_Amount, v_CostPrecision);
END IF;
RETURN ROUND (p_Amount, v_StdPrecision);
END currencyRound;
/

View File

@ -1,74 +0,0 @@
CREATE OR REPLACE FUNCTION invoiceDiscount
(
p_C_Invoice_ID IN NUMBER,
p_PayDate IN DATE,
p_C_InvoicePaySchedule_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Invoice_Discount.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Calculate Payment Discount Amount
* Description:
* - Calculate discountable amount (i.e. with or without tax)
* - Calculate and return payment discount
************************************************************************/
AS
v_Amount NUMBER;
v_IsDiscountLineAmt CHAR(1);
v_GrandTotal NUMBER;
v_TotalLines NUMBER;
v_C_PaymentTerm_ID NUMBER(10);
v_DocDate DATE;
v_PayDate DATE := SysDate;
v_IsPayScheduleValid CHAR(1);
BEGIN
SELECT ci.IsDiscountLineAmt, i.GrandTotal, i.TotalLines,
i.C_PaymentTerm_ID, i.DateInvoiced, i.IsPayScheduleValid
INTO v_IsDiscountLineAmt, v_GrandTotal, v_TotalLines,
v_C_PaymentTerm_ID, v_DocDate, v_IsPayScheduleValid
FROM AD_ClientInfo ci, C_Invoice i
WHERE ci.AD_Client_ID=i.AD_Client_ID
AND i.C_Invoice_ID=p_C_Invoice_ID;
-- What Amount is the Discount Base?
IF (v_IsDiscountLineAmt = 'Y') THEN
v_Amount := v_TotalLines;
ELSE
v_Amount := v_GrandTotal;
END IF;
-- Anything to discount?
IF (v_Amount = 0) THEN
RETURN 0;
END IF;
IF (p_PayDate IS NOT NULL) THEN
v_PayDate := p_PayDate;
END IF;
-- Valid Payment Schedule
IF (v_IsPayScheduleValid='Y' AND p_C_InvoicePaySchedule_ID > 0) THEN
SELECT COALESCE(MAX(DiscountAmt),0)
INTO v_Amount
FROM C_InvoicePaySchedule
WHERE C_InvoicePaySchedule_ID=p_C_InvoicePaySchedule_ID
AND DiscountDate <= v_PayDate;
--
RETURN v_Amount;
END IF;
-- return discount amount
RETURN paymentTermDiscount (v_Amount, 0, v_C_PaymentTerm_ID, v_DocDate, p_PayDate);
-- Most likely if invoice not found
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END invoiceDiscount;
/

View File

@ -1,115 +0,0 @@
CREATE OR REPLACE FUNCTION invoiceOpen
(
p_C_Invoice_ID IN NUMBER,
p_C_InvoicePaySchedule_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Invoice_Open.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Calculate Open Item Amount in Invoice Currency
* Description:
* Add up total amount open for C_Invoice_ID if no split payment.
* Grand Total minus Sum of Allocations in Invoice Currency
*
* For Split Payments:
* Allocate Payments starting from first schedule.
SELECT C_Invoice_Open (109) FROM DUAL;
SELECT C_Invoice_Open (109, null) FROM DUAL;
SELECT C_Invoice_Open (109, 11) FROM DUAL;
SELECT C_Invoice_Open (109, 102) FROM DUAL;
SELECT C_Invoice_Open (109, 103) FROM DUAL;
SELECT * FROM RV_OpenItem WHERE C_Invoice_ID=109;
SELECT C_InvoicePaySchedule_ID, DueAmt FROM C_InvoicePaySchedule WHERE C_Invoice_ID=109 ORDER BY DueDate;
* Cannot be used for IsPaid as mutating
************************************************************************/
AS
v_Currency_ID NUMBER(10);
v_TotalOpenAmt NUMBER := 0;
v_PaidAmt NUMBER := 0;
v_Remaining NUMBER := 0;
v_MultiplierAP NUMBER := 0;
v_MultiplierCM NUMBER := 0;
v_Temp NUMBER := 0;
--
CURSOR Cur_Alloc IS
SELECT a.AD_Client_ID, a.AD_Org_ID,
al.Amount, al.DiscountAmt, al.WriteOffAmt,
a.C_Currency_ID, a.DateTrx
FROM C_AllocationLine al
INNER JOIN C_AllocationHdr a ON (al.C_AllocationHdr_ID=a.C_AllocationHdr_ID)
WHERE al.C_Invoice_ID = p_C_Invoice_ID
AND a.IsActive='Y';
--
CURSOR Cur_PaySchedule IS
SELECT C_InvoicePaySchedule_ID, DueAmt
FROM C_InvoicePaySchedule
WHERE C_Invoice_ID = p_C_Invoice_ID
AND IsValid='Y'
ORDER BY DueDate;
BEGIN
-- Get Currency
BEGIN
SELECT MAX(C_Currency_ID), SUM(GrandTotal), MAX(MultiplierAP), MAX(Multiplier)
INTO v_Currency_ID, v_TotalOpenAmt, v_MultiplierAP, v_MultiplierCM
FROM C_Invoice_v -- corrected for CM / Split Payment
WHERE C_Invoice_ID = p_C_Invoice_ID;
EXCEPTION -- Invoice in draft form
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('InvoiceOpen - ' || SQLERRM);
RETURN NULL;
END;
-- DBMS_OUTPUT.PUT_LINE('== C_Invoice_ID=' || p_C_Invoice_ID || ', Total=' || v_TotalOpenAmt || ', AP=' || v_MultiplierAP || ', CM=' || v_MultiplierCM);
-- Calculate Allocated Amount
FOR a IN Cur_Alloc LOOP
v_Temp := a.Amount + a.DisCountAmt + a.WriteOffAmt;
v_PaidAmt := v_PaidAmt
-- Allocation
+ currencyConvert(v_Temp * v_MultiplierAP,
a.C_Currency_ID, v_Currency_ID, a.DateTrx, null, a.AD_Client_ID, a.AD_Org_ID);
DBMS_OUTPUT.PUT_LINE(' PaidAmt=' || v_PaidAmt || ', Allocation=' || v_Temp || ' * ' || v_MultiplierAP);
END LOOP;
-- Do we have a Payment Schedule ?
IF (p_C_InvoicePaySchedule_ID > 0) THEN -- if not valid = lists invoice amount
v_Remaining := v_PaidAmt;
FOR s IN Cur_PaySchedule LOOP
IF (s.C_InvoicePaySchedule_ID = p_C_InvoicePaySchedule_ID) THEN
v_TotalOpenAmt := (s.DueAmt*v_MultiplierCM) + v_Remaining;
IF (s.DueAmt - v_Remaining < 0) THEN
v_TotalOpenAmt := 0;
END IF;
-- DBMS_OUTPUT.PUT_LINE('Sched Total=' || v_TotalOpenAmt || ', Due=' || s.DueAmt || ',Remaining=' || v_Remaining || ',CM=' || v_MultiplierCM);
ELSE -- calculate amount, which can be allocated to next schedule
v_Remaining := v_Remaining - s.DueAmt;
IF (v_Remaining < 0) THEN
v_Remaining := 0;
END IF;
-- DBMS_OUTPUT.PUT_LINE('Remaining=' || v_Remaining);
END IF;
END LOOP;
ELSE
v_TotalOpenAmt := v_TotalOpenAmt - v_PaidAmt;
END IF;
-- DBMS_OUTPUT.PUT_LINE('== Total=' || v_TotalOpenAmt);
-- Ignore Rounding
IF (v_TotalOpenAmt BETWEEN -0.00999 AND 0.00999) THEN
v_TotalOpenAmt := 0;
END IF;
-- Round to penny
v_TotalOpenAmt := ROUND(COALESCE(v_TotalOpenAmt,0), 2);
RETURN v_TotalOpenAmt;
END invoiceOpen;
/

View File

@ -1,60 +0,0 @@
CREATE OR REPLACE FUNCTION invoicePaid
(
p_C_Invoice_ID IN NUMBER,
p_C_Currency_ID IN NUMBER,
p_MultiplierAP IN NUMBER -- DEFAULT 1
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Invoice_Paid.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Calculate Paid/Allocated amount in Currency
* Description:
* Add up total amount paid for for C_Invoice_ID.
* Split Payments are ignored.
* all allocation amounts converted to invoice C_Currency_ID
* round it to the nearest cent
* and adjust for CreditMemos by using C_Invoice_v
* and for Payments with the multiplierAP (-1, 1)
*
SELECT C_Invoice_ID, IsPaid, IsSOTrx, GrandTotal,
C_Invoice_Paid (C_Invoice_ID, C_Currency_ID, MultiplierAP)
FROM C_Invoice_v;
--
UPDATE C_Invoice_v1
SET IsPaid = CASE WHEN C_Invoice_Paid(C_Invoice_ID,C_Currency_ID,MultiplierAP)=GrandTotal THEN 'Y' ELSE 'N' END
WHERE C_Invoice_ID>1000000
*
************************************************************************/
AS
v_MultiplierAP NUMBER := 1;
v_PaymentAmt NUMBER := 0;
CURSOR Cur_Alloc IS
SELECT a.AD_Client_ID, a.AD_Org_ID,
al.Amount, al.DiscountAmt, al.WriteOffAmt,
a.C_Currency_ID, a.DateTrx
FROM C_AllocationLine al
INNER JOIN C_AllocationHdr a ON (al.C_AllocationHdr_ID=a.C_AllocationHdr_ID)
WHERE al.C_Invoice_ID = p_C_Invoice_ID
AND a.IsActive='Y';
BEGIN
-- Default
IF (p_MultiplierAP IS NOT NULL) THEN
v_MultiplierAP := p_MultiplierAP;
END IF;
-- Calculate Allocated Amount
FOR a IN Cur_Alloc LOOP
v_PaymentAmt := v_PaymentAmt
+ currencyConvert(a.Amount + a.DisCountAmt + a.WriteOffAmt,
a.C_Currency_ID, p_C_Currency_ID, a.DateTrx, null, a.AD_Client_ID, a.AD_Org_ID);
END LOOP;
--
RETURN ROUND(NVL(v_PaymentAmt,0), 2) * v_MultiplierAP;
END invoicePaid;
/

View File

@ -1,71 +0,0 @@
CREATE OR REPLACE FUNCTION paymentTermDiscount
(
Amount IN NUMBER,
Currency_ID IN NUMBER,
PaymentTerm_ID IN NUMBER,
DocDate IN DATE,
PayDate IN DATE
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_PaymentTerm_Discount.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Calculate Discount
* Description:
* Calculate the allowable Discount Amount of the Payment Term
*
* Test: SELECT C_PaymentTerm_Discount(17777, 103, '10-DEC-1999') FROM DUAL
************************************************************************/
AS
Discount NUMBER := 0;
CURSOR Cur_PT IS
SELECT *
FROM C_PaymentTerm
WHERE C_PaymentTerm_ID = PaymentTerm_ID;
Discount1Date DATE;
Discount2Date DATE;
Add1Date NUMBER := 0;
Add2Date NUMBER := 0;
BEGIN
-- No Data - No Discount
IF (Amount IS NULL OR PaymentTerm_ID IS NULL OR DocDate IS NULL) THEN
RETURN 0;
END IF;
FOR p IN Cur_PT LOOP -- for convineance only
-- DBMS_OUTPUT.PUT_LINE(p.Name || ' - Doc = ' || TO_CHAR(DocDate));
Discount1Date := TRUNC(DocDate + p.DiscountDays + p.GraceDays);
Discount2Date := TRUNC(DocDate + p.DiscountDays2 + p.GraceDays);
-- Next Business Day
IF (p.IsNextBusinessDay='Y') THEN
-- Not fully correct - only does weekends (7=Saturday, 1=Sunday)
SELECT DECODE(TO_CHAR(Discount1Date,'D'), '7',2, '1',1, 0),
DECODE(TO_CHAR(Discount2Date,'D'), '7',2, '1',1, 0)
INTO Add1Date, Add2Date
FROM DUAL;
Discount1Date := Discount1Date+Add1Date;
Discount2Date := Discount2Date+Add2Date;
END IF;
-- Discount 1
IF (Discount1Date >= TRUNC(PayDate)) THEN
-- DBMS_OUTPUT.PUT_LINE('Discount 1 ' || TO_CHAR(Discount1Date) || ' ' || p.Discount);
Discount := Amount * p.Discount / 100;
-- Discount 2
ELSIF (Discount2Date >= TRUNC(PayDate)) THEN
-- DBMS_OUTPUT.PUT_LINE('Discount 2 ' || TO_CHAR(Discount2Date) || ' ' || p.Discount2);
Discount := Amount * p.Discount2 / 100;
END IF;
END LOOP;
--
RETURN ROUND(NVL(Discount,0), 2); -- fixed rounding
END paymentTermDiscount;
/

View File

@ -1,52 +0,0 @@
CREATE OR REPLACE FUNCTION paymentTermDueDate
(
PaymentTerm_ID IN NUMBER,
DocDate IN DATE
)
RETURN DATE
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_PaymentTerm_DueDate.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Get Due Date
* Description:
* Returns the due date
************************************************************************/
AS
Days NUMBER := 0;
DueDate DATE := TRUNC(DocDate);
--
CURSOR Cur_PT IS
SELECT *
FROM C_PaymentTerm
WHERE C_PaymentTerm_ID = PaymentTerm_ID;
FirstDay DATE;
NoDays NUMBER;
BEGIN
FOR p IN Cur_PT LOOP -- for convineance only
-- DBMS_OUTPUT.PUT_LINE(p.Name || ' - Doc = ' || TO_CHAR(DocDate));
-- Due 15th of following month
IF (p.IsDueFixed = 'Y') THEN
-- DBMS_OUTPUT.PUT_LINE(p.Name || ' - Day = ' || p.FixMonthDay);
FirstDay := TRUNC(DocDate, 'MM');
NoDays := TRUNC(DocDate) - FirstDay;
DueDate := FirstDay + (p.FixMonthDay-1); -- starting on 1st
DueDate := ADD_MONTHS(DueDate, p.FixMonthOffset);
IF (NoDays > p.FixMonthCutoff) THEN
DueDate := ADD_MONTHS(DueDate, 1);
END IF;
ELSE
-- DBMS_OUTPUT.PUT_LINE('Net = ' || p.NetDays);
DueDate := TRUNC(DocDate) + p.NetDays;
END IF;
END LOOP;
-- DBMS_OUTPUT.PUT_LINE('Due = ' || TO_CHAR(DueDate) || ', Pay = ' || TO_CHAR(PayDate));
RETURN DueDate;
END paymentTermDueDate;
/

View File

@ -1,58 +0,0 @@
CREATE OR REPLACE FUNCTION paymentTermDueDays
(
PaymentTerm_ID IN NUMBER,
DocDate IN DATE,
PayDate IN DATE
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_PaymentTerm_DueDays.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Get Due Days
* Description:
* Returns the days due (positive) or the days till due (negative)
* Grace days are not considered!
* If record is not found it assumes due immediately
*
* Test: SELECT C_PaymentTerm_DueDays(103, '01-DEC-2000', '15-DEC-2000') FROM DUAL
************************************************************************/
AS
Days NUMBER := 0;
DueDate DATE := TRUNC(DocDate);
--
CURSOR Cur_PT IS
SELECT *
FROM C_PaymentTerm
WHERE C_PaymentTerm_ID = PaymentTerm_ID;
FirstDay DATE;
NoDays NUMBER;
BEGIN
FOR p IN Cur_PT LOOP -- for convineance only
-- DBMS_OUTPUT.PUT_LINE(p.Name || ' - Doc = ' || TO_CHAR(DocDate));
-- Due 15th of following month
IF (p.IsDueFixed = 'Y') THEN
-- DBMS_OUTPUT.PUT_LINE(p.Name || ' - Day = ' || p.FixMonthDay);
FirstDay := TRUNC(DocDate, 'MM');
NoDays := TRUNC(DocDate) - FirstDay;
DueDate := FirstDay + (p.FixMonthDay-1); -- starting on 1st
DueDate := ADD_MONTHS(DueDate, p.FixMonthOffset);
IF (NoDays > p.FixMonthCutoff) THEN
DueDate := ADD_MONTHS(DueDate, 1);
END IF;
ELSE
-- DBMS_OUTPUT.PUT_LINE('Net = ' || p.NetDays);
DueDate := TRUNC(DocDate) + p.NetDays;
END IF;
END LOOP;
-- DBMS_OUTPUT.PUT_LINE('Due = ' || TO_CHAR(DueDate) || ', Pay = ' || TO_CHAR(PayDate));
Days := TRUNC(PayDate) - DueDate;
RETURN Days;
END paymentTermDueDays;
/

View File

@ -1,57 +0,0 @@
CREATE OR REPLACE FUNCTION paymentAllocated
(
p_C_Payment_ID IN NUMBER,
p_C_Currency_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Payment_Allocated.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Calculate Allocated Payment Amount in Payment Currency
* Description:
--
SELECT C_Payment_Allocated(C_Payment_ID,C_Currency_ID), PayAmt, IsAllocated
FROM C_Payment_v
WHERE C_Payment_ID>=1000000;
--
UPDATE C_Payment_v
SET IsAllocated=CASE WHEN C_Payment_Allocated(C_Payment_ID, C_Currency_ID)=PayAmt THEN 'Y' ELSE 'N' END
WHERE C_Payment_ID>=1000000;
************************************************************************/
AS
v_AllocatedAmt NUMBER := 0;
v_PayAmt NUMBER;
CURSOR Cur_Alloc IS
SELECT a.AD_Client_ID, a.AD_Org_ID, al.Amount, a.C_Currency_ID, a.DateTrx
FROM C_AllocationLine al
INNER JOIN C_AllocationHdr a ON (al.C_AllocationHdr_ID=a.C_AllocationHdr_ID)
WHERE al.C_Payment_ID = p_C_Payment_ID
AND a.IsActive='Y';
-- AND al.C_Invoice_ID IS NOT NULL;
BEGIN
-- Charge - nothing available
SELECT MAX(PayAmt)
INTO v_PayAmt
FROM C_Payment
WHERE C_Payment_ID=p_C_Payment_ID AND C_Charge_ID > 0;
IF (v_PayAmt IS NOT NULL) THEN
RETURN 0;
END IF;
-- Calculate Allocated Amount
FOR a IN Cur_Alloc LOOP
v_AllocatedAmt := v_AllocatedAmt
+ currencyConvert(a.Amount, a.C_Currency_ID, p_C_Currency_ID, a.DateTrx, null, a.AD_Client_ID, a.AD_Org_ID);
END LOOP;
-- Round to penny
v_AllocatedAmt := ROUND(NVL(v_AllocatedAmt,0), 2);
RETURN v_AllocatedAmt;
END paymentAllocated;
/

View File

@ -1,62 +0,0 @@
CREATE OR REPLACE FUNCTION paymentAvailable
(
p_C_Payment_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Payment_Available.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Calculate Available Payment Amount in Payment Currency
* Description:
* similar to C_Invoice_Open
************************************************************************/
AS
v_Currency_ID NUMBER(10);
v_AvailableAmt NUMBER := 0;
v_IsReceipt C_Payment.IsReceipt%TYPE;
v_Amt NUMBER := 0;
CURSOR Cur_Alloc IS
SELECT a.AD_Client_ID, a.AD_Org_ID, al.Amount, a.C_Currency_ID, a.DateTrx
FROM C_AllocationLine al
INNER JOIN C_AllocationHdr a ON (al.C_AllocationHdr_ID=a.C_AllocationHdr_ID)
WHERE al.C_Payment_ID = p_C_Payment_ID
AND a.IsActive='Y';
-- AND al.C_Invoice_ID IS NOT NULL;
BEGIN
-- Charge - fully allocated
SELECT MAX(PayAmt)
INTO v_Amt
FROM C_Payment
WHERE C_Payment_ID=p_C_Payment_ID AND C_Charge_ID > 0;
IF (v_Amt IS NOT NULL) THEN
RETURN v_Amt;
END IF;
-- Get Currency
SELECT C_Currency_ID, PayAmt, IsReceipt
INTO v_Currency_ID, v_AvailableAmt, v_IsReceipt
FROM C_Payment_v -- corrected for AP/AR
WHERE C_Payment_ID = p_C_Payment_ID;
-- DBMS_OUTPUT.PUT_LINE('== C_Payment_ID=' || p_C_Payment_ID || ', PayAmt=' || v_AvailableAmt || ', Receipt=' || v_IsReceipt);
-- Calculate Allocated Amount
FOR a IN Cur_Alloc LOOP
v_Amt := currencyConvert(a.Amount, a.C_Currency_ID, v_Currency_ID, a.DateTrx, null, a.AD_Client_ID, a.AD_Org_ID);
v_AvailableAmt := v_AvailableAmt - v_Amt;
-- DBMS_OUTPUT.PUT_LINE(' Allocation=' || a.Amount || ' - Available=' || v_AvailableAmt);
END LOOP;
-- Ignore Rounding
IF (v_AvailableAmt BETWEEN -0.00999 AND 0.00999) THEN
v_AvailableAmt := 0;
END IF;
-- Round to penny
v_AvailableAmt := ROUND(NVL(v_AvailableAmt,0), 2);
RETURN v_AvailableAmt;
END paymentAvailable;
/

View File

@ -1,59 +0,0 @@
CREATE OR REPLACE FUNCTION DBA_ConstraintCmd
(
p_ConstraintName IN VARCHAR2
)
RETURN VARCHAR2
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: DBA_ConstraintCmd.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
* $Source: /cvs/adempiere/db/database/Functions/DBA_ConstraintCmd.sql,v $
***
* Title: Create DML command for given constraint
* Description:
* SELECT DBA_ConstraintCmd(Constraint_Name) FROM User_Constraints WHERE CONSTRAINT_TYPE='R'
************************************************************************/
AS
v_Result VARCHAR2(2000);
v_TableName VARCHAR2(256);
v_ColumnName VARCHAR2(256);
v_ConstraintName VARCHAR2(256);
v_DeleteRule VARCHAR2(256);
BEGIN
-- Get First Part
SELECT c.Table_Name, cc.Column_name, c.R_Constraint_Name, c.Delete_Rule
INTO v_TableName, v_ColumnName, v_ConstraintName, v_DeleteRule
FROM USER_Constraints c, USER_Cons_Columns cc
WHERE c.Constraint_Name=cc.Constraint_Name
AND cc.Constraint_Name=p_ConstraintName;
-- Create First Part
v_Result := 'ALTER TABLE ' || v_TableName || ' ADD CONSTRAINT ' || p_ConstraintName
|| ' FOREIGN KEY (' || v_ColumnName || ') ';
-- Not a valid FK Reference
IF (v_ConstraintName IS NULL) THEN
RETURN NULL;
END IF;
-- Get Second Part
SELECT c.Table_Name, cc.Column_name
INTO v_TableName, v_ColumnName
FROM USER_Constraints c, USER_Cons_Columns cc
WHERE c.Constraint_Name=cc.Constraint_Name
AND cc.Constraint_Name=v_ConstraintName;
-- Create Second Part
v_Result := v_Result || 'REFERENCES ' || v_TableName || '(' || v_ColumnName || ')';
IF (v_DeleteRule = 'CASCADE') THEN
v_Result := v_Result || ' ON DELETE CASCADE';
END IF;
-- DBMS_OUTPUT.PUT_LINE(v_Result);
RETURN v_Result;
END DBA_ConstraintCmd;
/

View File

@ -1,46 +0,0 @@
CREATE OR REPLACE FUNCTION DBA_DisplayType
(
AD_Reference_ID IN NUMBER
)
RETURN VARCHAR2
AS
BEGIN
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: DBA_DisplayType.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Show clear text od DisplayType
* Description:
************************************************************************/
IF (AD_Reference_ID = 10) THEN RETURN 'String = 10';
ELSIF (AD_Reference_ID = 11) THEN RETURN 'Integer = 11';
ELSIF (AD_Reference_ID = 12) THEN RETURN 'Amount = 12';
ELSIF (AD_Reference_ID = 13) THEN RETURN 'ID = 13';
ELSIF (AD_Reference_ID = 14) THEN RETURN 'Text = 14';
ELSIF (AD_Reference_ID = 15) THEN RETURN 'Date = 15';
ELSIF (AD_Reference_ID = 16) THEN RETURN 'DateTime = 16';
ELSIF (AD_Reference_ID = 17) THEN RETURN 'List = 17';
ELSIF (AD_Reference_ID = 18) THEN RETURN 'Table = 18';
ELSIF (AD_Reference_ID = 19) THEN RETURN 'TableDir = 19';
ELSIF (AD_Reference_ID = 20) THEN RETURN 'YesNo = 20';
ELSIF (AD_Reference_ID = 21) THEN RETURN 'Location = 21';
ELSIF (AD_Reference_ID = 22) THEN RETURN 'Number = 22';
ELSIF (AD_Reference_ID = 23) THEN RETURN 'Binary = 23';
ELSIF (AD_Reference_ID = 24) THEN RETURN 'Time = 24';
ELSIF (AD_Reference_ID = 25) THEN RETURN 'Account = 25';
ELSIF (AD_Reference_ID = 26) THEN RETURN 'RowID = 26';
ELSIF (AD_Reference_ID = 27) THEN RETURN 'Color = 27';
ELSIF (AD_Reference_ID = 28) THEN RETURN 'Button = 28';
ELSIF (AD_Reference_ID = 29) THEN RETURN 'Quantity = 29';
ELSIF (AD_Reference_ID = 30) THEN RETURN 'Search = 30';
ELSIF (AD_Reference_ID = 31) THEN RETURN 'Locator = 31';
ELSIF (AD_Reference_ID = 32) THEN RETURN 'Image = 32';
ELSIF (AD_Reference_ID = 33) THEN RETURN 'Assignment= 33';
ELSE RETURN 'Unknown ('||AD_Reference_ID||')'; END IF;
END DBA_DisplayType;
/

View File

@ -1,84 +0,0 @@
CREATE OR REPLACE FUNCTION productAttribute
(
p_M_AttributeSetInstance_ID IN NUMBER
)
RETURN NVARCHAR2
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: M_Attribute_Name.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Return Instance Attribute Info
* Description:
*
* Test:
SELECT M_Attribute_Name (M_AttributeSetInstance_ID)
FROM M_InOutLine WHERE M_AttributeSetInstance_ID > 0
--
SELECT p.Name
FROM C_InvoiceLine il LEFT OUTER JOIN M_Product p ON (il.M_Product_ID=p.M_Product_ID);
SELECT p.Name || M_Attribute_Name (il.M_AttributeSetInstance_ID)
FROM C_InvoiceLine il LEFT OUTER JOIN M_Product p ON (il.M_Product_ID=p.M_Product_ID);
************************************************************************/
AS
v_Name NVARCHAR2(2000) := NULL;
v_NameAdd NVARCHAR2(2000) := '';
--
v_Lot M_AttributeSetInstance.Lot%TYPE;
v_LotStart M_AttributeSet.LotCharSOverwrite%TYPE;
v_LotEnd M_AttributeSet.LotCharEOverwrite%TYPE;
v_SerNo M_AttributeSetInstance.SerNo%TYPE;
v_SerNoStart M_AttributeSet.SerNoCharSOverwrite%TYPE;
v_SerNoEnd M_AttributeSet.SerNoCharEOverwrite%TYPE;
v_GuaranteeDate M_AttributeSetInstance.GuaranteeDate%TYPE;
--
CURSOR CUR_Attributes IS
SELECT ai.Value, a.Name
FROM M_AttributeInstance ai
INNER JOIN M_Attribute a ON (ai.M_Attribute_ID=a.M_Attribute_ID AND a.IsInstanceAttribute='Y')
WHERE ai.M_AttributeSetInstance_ID=p_M_AttributeSetInstance_ID;
BEGIN
/* -- Get Product Name
SELECT Name
INTO v_Name
FROM M_Product WHERE M_Product_ID=p_M_Product_ID;
*/
-- Get Product Attribute Set Instance
IF (p_M_AttributeSetInstance_ID > 0) THEN
SELECT asi.Lot, asi.SerNo, asi.GuaranteeDate,
COALESCE(a.SerNoCharSOverwrite, N'#'), COALESCE(a.SerNoCharEOverwrite, N''),
COALESCE(a.LotCharSOverwrite, N'<EFBFBD>'), COALESCE(a.LotCharEOverwrite, N'<EFBFBD>')
INTO v_Lot, v_SerNo, v_GuaranteeDate,
v_SerNoStart, v_SerNoEnd, v_LotStart, v_LotEnd
FROM M_AttributeSetInstance asi
INNER JOIN M_AttributeSet a ON (asi.M_AttributeSet_ID=a.M_AttributeSet_ID)
WHERE asi.M_AttributeSetInstance_ID=p_M_AttributeSetInstance_ID;
--
IF (v_SerNo IS NOT NULL) THEN
v_NameAdd := v_NameAdd || v_SerNoStart || v_SerNo || v_SerNoEnd || ' ';
END IF;
IF (v_Lot IS NOT NULL) THEN
v_NameAdd := v_NameAdd || v_LotStart || v_Lot || v_LotEnd || ' ';
END IF;
IF (v_GuaranteeDate IS NOT NULL) THEN
v_NameAdd := v_NameAdd || v_GuaranteeDate || ' ';
END IF;
--
FOR a IN CUR_Attributes LOOP
v_NameAdd := v_NameAdd || a.Name || ':' || a.Value || ' ';
END LOOP;
--
IF (LENGTH(v_NameAdd) > 0) THEN
v_Name := v_Name || ' (' || TRIM(v_NameAdd) || ')';
END IF;
END IF;
RETURN v_Name;
END productAttribute;
/

View File

@ -1,280 +0,0 @@
CREATE OR REPLACE PROCEDURE AD_Column_Sync
(
p_PInstance_ID IN NUMBER
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: AD_Column_Sync.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Synchronize Column with Database
* Description:
************************************************************************/
AS
-- Logistice
v_ResultStr VARCHAR2(2000);
v_Message VARCHAR2(2000);
v_Result NUMBER := 1; -- 0=failure
v_Record_ID NUMBER;
v_AD_User_ID NUMBER;
-- Parameter
CURSOR Cur_Parameter (pp_PInstance NUMBER) IS
SELECT i.Record_ID, i.AD_User_ID,
p.ParameterName, p.P_String, p.P_Number, p.P_Date
FROM AD_PInstance i, AD_PInstance_Para p
WHERE i.AD_PInstance_ID=pp_PInstance
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
ORDER BY p.SeqNo;
-- Parameter Variables
-- Variables
v_TableName AD_Table.TableName%TYPE;
v_ColumnName AD_Column.ColumnName%TYPE;
v_AD_Reference_ID AD_Column.AD_Reference_ID%TYPE;
v_FieldLength AD_Column.FieldLength%TYPE;
v_DefaultValue AD_Column.DefaultValue%TYPE;
v_IsMandatory AD_Column.IsMandatory%TYPE;
--
v_DB_DataType USER_TAB_COLUMNS.DATA_TYPE%TYPE;
v_Cmd VARCHAR2(255);
v_DB_TableName VARCHAR(60) := NULL;
BEGIN
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_PInstance_ID);
v_ResultStr := 'PInstanceNotFound';
UPDATE AD_PInstance
SET Created = SysDate,
IsProcessing = 'Y'
WHERE AD_PInstance_ID=p_PInstance_ID;
COMMIT;
-- Get Parameters
v_ResultStr := 'ReadingParameters';
FOR p IN Cur_Parameter (p_PInstance_ID) LOOP
v_Record_ID := p.Record_ID;
v_AD_User_ID := p.AD_User_ID;
END LOOP; -- Get Parameter
DBMS_OUTPUT.PUT_LINE(' Record_ID=' || v_Record_ID);
-- Get Table/Column Info
v_ResultStr := 'ReadingColumnInfo';
SELECT t.TableName, c.ColumnName, c.AD_Reference_ID, c.FieldLength,
c.DefaultValue, c.IsMandatory
INTO v_TableName, v_ColumnName, v_AD_Reference_ID, v_FieldLength,
v_DefaultValue, v_IsMandatory
FROM AD_Table t, AD_Column c
WHERE t.AD_Table_ID = c.AD_Table_ID
AND c.AD_Column_ID = v_Record_ID;
-- Check if Table exists
v_ResultStr := 'ReadingDBTableInfo';
BEGIN
SELECT Table_Name
INTO v_DB_TableName
FROM USER_TABLES
WHERE Table_Name=UPPER(v_TableName);
EXCEPTION
WHEN OTHERS THEN NULL;
END;
-- Table does not exists
IF (v_DB_TableName IS NULL) THEN
v_ResultStr := 'CreateTableCommand';
BEGIN
v_CMD := 'CREATE TABLE ' || SYS_CONTEXT('USERENV', 'CURRENT_USER') || '.'
|| UPPER(v_TableName) || ' (XXXX CHAR(1))';
EXECUTE IMMEDIATE v_Cmd;
EXCEPTION
WHEN OTHERS THEN
v_Result := 0; -- failure
v_Message := 'Error: ' || SQLERRM || ' - Command: ' || v_Cmd;
GOTO FINISH_PROCESS;
END;
END IF;
-- Get Data Dictionary Info
v_ResultStr := 'ReadingDBColumnInfo';
BEGIN
SELECT DATA_TYPE --, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE, DATA_DEFAULT
INTO v_DB_DataType
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME=UPPER(v_TableName)
AND COLUMN_NAME=UPPER(v_ColumnName);
EXCEPTION
WHEN OTHERS THEN NULL;
END;
/**
* Create Column in Database
*/
IF (v_DB_DataType IS NULL) THEN
v_ResultStr := 'CreateALTERCommand';
BEGIN
-- Get TableName
v_Cmd := 'ALTER TABLE ' || v_TableName || ' ADD ' || v_ColumnName || ' ';
-- Map Data Type
IF (v_AD_Reference_ID IN (10,14)) THEN
-- String, Text
v_Cmd := v_Cmd || 'NVARCHAR2(' || v_FieldLength || ')';
ELSIF (v_AD_Reference_ID IN (17,20,28)) THEN
-- List,YesNo,Button
v_Cmd := v_Cmd || 'CHAR(' || v_FieldLength || ')';
ELSIF (v_AD_Reference_ID IN (13,18,19,21,25,27,30,31)) THEN
-- ID,Table,TableDir,Location,Account,Color,Search,Locator
v_Cmd := v_Cmd || 'NUMBER(10)';
ELSIF (v_AD_Reference_ID IN (11,12,22,29)) THEN
-- Integer,Amount,Number,Quantity
v_Cmd := v_Cmd || 'NUMBER';
ELSIF (v_AD_Reference_ID IN (15,16)) THEN
-- Date,DateTime
v_Cmd := v_Cmd || 'DATE';
ELSE -- 23-Binary, 24-Radio, 26-RowID, 32-Image
v_Result := 0; -- failure
v_Message := 'DisplayType Not Supported';
END IF;
-- Default (literal)
IF (v_DefaultValue IS NOT NULL AND LENGTH(v_DefaultValue) <> 0) THEN
IF (v_AD_Reference_ID IN (10,14,17,20,28)) THEN
v_Cmd := v_Cmd || ' DEFAULT (''' || v_DefaultValue || ''')';
ELSE
v_Cmd := v_Cmd || ' DEFAULT ' || v_DefaultValue;
END IF;
END IF;
-- Mandatory
IF (v_IsMandatory = 'Y') THEN
IF (v_DefaultValue IS NULL OR LENGTH(v_DefaultValue) = 0) THEN
v_Result := 0; -- failure
v_Message := 'Mandatory requites literal default value';
ELSE
v_Cmd := v_Cmd || ' NOT NULL';
END IF;
END IF;
-- Execute it
IF (v_Result = 1) THEN
EXECUTE IMMEDIATE v_Cmd;
v_Message := '@Created@ - ' || v_Cmd;
END IF;
EXCEPTION
WHEN OTHERS THEN
v_Result := 0; -- failure
v_Message := 'Error: ' || SQLERRM || ' - Command: ' || v_Cmd;
END;
/**
* Change certain Attributes
*/
ELSE
v_ResultStr := 'CreateALTERCommand';
BEGIN
-- Get TableName
v_Cmd := 'ALTER TABLE ' || v_TableName || ' MODIFY ' || v_ColumnName || ' ';
-- Map Data Type
IF (v_AD_Reference_ID IN (10,14)) THEN
-- String, Text
v_Cmd := v_Cmd || 'NVARCHAR2(' || v_FieldLength || ')';
ELSIF (v_AD_Reference_ID IN (17,20,28)) THEN
-- List,YesNo,Button
v_Cmd := v_Cmd || 'CHAR(' || v_FieldLength || ')';
ELSIF (v_AD_Reference_ID IN (13,18,19,21,25,27,30,31)) THEN
-- ID,Table,TableDir,Location,Account,Color,Search,Locator
v_Cmd := v_Cmd || 'NUMBER(10)';
ELSIF (v_AD_Reference_ID IN (11,12,22,29)) THEN
-- Integer,Amount,Number,Quantity
v_Cmd := v_Cmd || 'NUMBER';
ELSIF (v_AD_Reference_ID IN (15,16)) THEN
-- Date,DateTime
v_Cmd := v_Cmd || 'DATE';
ELSE -- 23-Binary, 24-Radio, 26-RowID, 32-Image
v_Result := 0; -- failure
v_Message := 'DisplayType Not Supported';
END IF;
-- Default (literal)
IF (v_DefaultValue IS NOT NULL AND LENGTH(v_DefaultValue) <> 0) THEN
IF (v_AD_Reference_ID IN (10,14,17,20,28)) THEN
v_Cmd := v_Cmd || ' DEFAULT (''' || v_DefaultValue || ''')';
ELSE
v_Cmd := v_Cmd || ' DEFAULT ' || v_DefaultValue;
END IF;
END IF;
-- Mandatory
IF (v_IsMandatory = 'Y') THEN
IF (v_DefaultValue IS NULL OR LENGTH(v_DefaultValue) = 0) THEN
v_Result := 0; -- failure
v_Message := 'Mandatory requites literal default value';
ELSE
v_Cmd := v_Cmd || ' NOT NULL';
END IF;
END IF;
-- Execute it
IF (v_Result = 1) THEN
EXECUTE IMMEDIATE v_Cmd;
v_Message := '@Updated@ - ' || v_Cmd;
END IF;
EXCEPTION
WHEN OTHERS THEN
v_Result := 0; -- failure
v_Message := 'Error: ' || SQLERRM || ' - Command: ' || v_Cmd;
END;
END IF;
/**
* Delete Column
*
ELSE
v_Cmd := 'ALTER TABLE ' || v_TableName
|| ' DROP COLUMN ' || v_ColumnName;
-- Execute it
EXECUTE IMMEDIATE v_Cmd;
END IF;
/**/
-- Table did not exist - drop initial column
IF (v_DB_TableName IS NULL) THEN
v_ResultStr := 'CreateDropXXColumnCommand';
BEGIN
v_CMD := 'ALTER TABLE ' || v_TableName || ' DROP COLUMN XXXX';
EXECUTE IMMEDIATE v_Cmd;
EXCEPTION
WHEN OTHERS THEN
v_Result := 0; -- failure
v_Message := 'Error: ' || SQLERRM || ' - Command: ' || v_Cmd;
END;
END IF;
<<FINISH_PROCESS>>
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = v_Result, -- 1=success
ErrorMsg = v_Message
WHERE AD_PInstance_ID=p_PInstance_ID;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
v_ResultStr := v_ResultStr || ': ' || SQLERRM || ' - ' || v_Message;
DBMS_OUTPUT.PUT_LINE(v_ResultStr);
ROLLBACK;
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 0, -- failure
ErrorMsg = v_ResultStr
WHERE AD_PInstance_ID=p_PInstance_ID;
COMMIT;
RETURN;
END AD_Column_Sync;
/

View File

@ -1,92 +0,0 @@
CREATE OR REPLACE PROCEDURE AD_PrintPaper_Default
(
p_AD_PInstance_ID IN NUMBER
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: AD_PrintPaper_Default.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Set Current Format as Default
* Description:
************************************************************************/
AS
-- Logistice
v_ResultStr VARCHAR2(2000);
v_Message VARCHAR2(2000);
p_Record_ID NUMBER;
-- Parameter
CURSOR Cur_Parameter (PInstance NUMBER) IS
SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
FROM AD_PInstance i, AD_PInstance_Para p
WHERE i.AD_PInstance_ID=PInstance
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
ORDER BY p.SeqNo;
-- Parameter Variables
p_AD_Client_ID NUMBER := NULL;
BEGIN
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_AD_PInstance_ID);
v_ResultStr := 'PInstanceNotFound';
UPDATE AD_PInstance
SET Created = SysDate,
IsProcessing = 'Y'
WHERE AD_PInstance_ID=p_AD_PInstance_ID;
COMMIT;
-- Get Parameters
v_ResultStr := 'ReadingParameters';
FOR p IN Cur_Parameter (p_AD_PInstance_ID) LOOP
p_Record_ID := p.Record_ID;
IF (p.ParameterName = 'AD_Client_ID') THEN
p_AD_Client_ID := p.P_Number;
DBMS_OUTPUT.PUT_LINE(' AD_Client_ID=' || p_AD_Client_ID);
ELSE
DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
END IF;
END LOOP; -- Get Parameter
DBMS_OUTPUT.PUT_LINE(' Record_ID=' || p_Record_ID);
v_ResultStr := 'Updating';
UPDATE AD_PrintFormat pf
SET AD_PrintPaper_ID = p_Record_ID
WHERE (AD_Client_ID = p_AD_Client_ID OR p_AD_Client_ID IS NULL)
AND EXISTS (SELECT * FROM AD_PrintPaper pp
WHERE pf.AD_PrintPaper_ID=pp.AD_PrintPaper_ID
AND IsLandscape = (SELECT IsLandscape FROM AD_PrintPaper
WHERE AD_PrintPaper_ID=p_Record_ID));
v_Message := '@Copied@=' || SQL%ROWCOUNT;
<<FINISH_PROCESS>>
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 1, -- success
ErrorMsg = v_Message
WHERE AD_PInstance_ID=p_AD_PInstance_ID;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
v_ResultStr := v_ResultStr || ': ' || SQLERRM || ' - ' || v_Message;
DBMS_OUTPUT.PUT_LINE(v_ResultStr);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 0, -- failure
ErrorMsg = v_ResultStr
WHERE AD_PInstance_ID=p_AD_PInstance_ID;
COMMIT;
RETURN;
END AD_PrintPaper_Default;
/

View File

@ -1,56 +0,0 @@
CREATE OR REPLACE PROCEDURE AD_Sequence_Doc
(
p_SequenceName IN VARCHAR2,
p_AD_Client_ID IN NUMBER,
o_DocumentNo OUT VARCHAR2
)
AS
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: AD_Sequence_Doc.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Get the next DocumentNo of TableName
* Description:
* store in parameter o_DocumentNo
* if ID < 1000000, use System Doc Sequence
************************************************************************/
v_NextNo NUMBER;
v_NextNoSys NUMBER;
v_Prefix VARCHAR2(30);
v_Suffix VARCHAR2(30);
BEGIN
SELECT CurrentNext, CurrentNextSys, Prefix, Suffix
INTO v_NextNo, v_NextNoSys, v_Prefix, v_Suffix
FROM AD_Sequence
WHERE Name = p_SequenceName
AND IsActive = 'Y'
AND IsTableID = 'N'
AND IsAutoSequence = 'Y'
AND AD_Client_ID = p_AD_Client_ID
FOR UPDATE OF CurrentNext, CurrentNextSys;
IF (v_NextNoSys <> -1 AND p_AD_Client_ID < 1000000) THEN -- System No
UPDATE AD_Sequence
SET CurrentNextSys = CurrentNextSys + IncrementNo,
Updated = SysDate
WHERE Name = p_SequenceName;
o_DocumentNo := NVL(v_Prefix, '') || v_NextNoSys || NVL(v_Suffix, '');
ELSE -- Standard No
UPDATE AD_Sequence
SET CurrentNext = CurrentNext + IncrementNo,
Updated = SysDate
WHERE Name = p_SequenceName;
o_DocumentNo := NVL(v_Prefix, '') || v_NextNo || NVL(v_Suffix, '');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20100, 'Document Sequence not found - ' || p_SequenceName);
END AD_Sequence_Doc;
/

View File

@ -1,80 +0,0 @@
CREATE OR REPLACE PROCEDURE AD_Sequence_DocType
(
p_DocType_ID IN NUMBER,
p_ID IN NUMBER,
p_DocumentNo OUT VARCHAR2
)
AS
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: AD_Sequence_DocType.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Get the next DocumentNo of Document Type
* Description:
* store in parameter p_DocumentNo
* If ID < 1000000, use System Doc Sequence
* If no Document Sequence is defined, return null !
* Use AD_Sequence_Doc('DocumentNo_myTable',.. to get it directly
************************************************************************/
v_NextNo NUMBER;
v_NextNoSys NUMBER;
v_Sequence_ID NUMBER := NULL;
v_Prefix VARCHAR2(30);
v_Suffix VARCHAR2(30);
BEGIN
-- Is a document Sequence defined and valid?
BEGIN
SELECT DocNoSequence_ID
INTO v_Sequence_ID
FROM C_DocType
WHERE C_DocType_ID=p_DocType_ID -- parameter
AND IsDocNoControlled='Y'
AND IsActive='Y';
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
IF (v_Sequence_ID IS NULL) THEN -- No Sequence Number
p_DocumentNo := ''; -- Return NULL
DBMS_OUTPUT.PUT_LINE('[AD_Sequence_DocType: not found - C_DocType_ID=' || p_DocType_ID || ']');
RETURN;
END IF;
-- Get the numbers
SELECT s.AD_Sequence_ID, s.CurrentNext, s.CurrentNextSys, s.Prefix, s.Suffix
INTO v_Sequence_ID, v_NextNo, v_NextNoSys, v_Prefix, v_Suffix
FROM C_DocType d, AD_Sequence s
WHERE d.C_DocType_ID=p_DocType_ID -- parameter
AND d.DocNoSequence_ID=s.AD_Sequence_ID
AND s.IsActive = 'Y'
AND s.IsTableID = 'N'
AND s.IsAutoSequence = 'Y'
FOR UPDATE OF CurrentNext, CurrentNextSys;
IF (v_NextNoSys <> -1 AND p_ID < 1000000) THEN -- System No
UPDATE AD_Sequence
SET CurrentNextSys = CurrentNextSys + IncrementNo
WHERE AD_Sequence_ID = v_Sequence_ID;
p_DocumentNo := NVL(v_Prefix, '') || v_NextNoSys || NVL(v_Suffix, '');
ELSE -- Standard No
UPDATE AD_Sequence
SET CurrentNext = CurrentNext + IncrementNo
WHERE AD_Sequence_ID = v_Sequence_ID;
p_DocumentNo := NVL(v_Prefix, '') || v_NextNo || NVL(v_Suffix, '');
END IF;
-- DBMS_OUTPUT.PUT_LINE(p_DocumentNo);
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20100, 'AD_Sequence_DocType: not found - DocType_ID='
|| p_DocType_ID || ', Sequence_ID=' || v_Sequence_ID);
END AD_Sequence_DocType;
/

View File

@ -1,56 +0,0 @@
CREATE OR REPLACE PROCEDURE AD_Sequence_Next
(
p_TableName IN VARCHAR2,
p_ID IN NUMBER,
p_NextNo OUT NUMBER
)
AS
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: AD_Sequence_Next.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Get the next sequence number of TableName
* Description:
* store in parameter p_NextNo
* if ID < 1000000, use System Doc Sequence
************************************************************************/
v_NextNoSys NUMBER;
v_ResultStr VARCHAR(255);
BEGIN
v_ResultStr := 'Read';
SELECT CurrentNext, CurrentNextSys
INTO p_NextNo, v_NextNoSys
FROM AD_Sequence
WHERE Name = p_TableName
AND IsActive = 'Y'
AND IsTableID = 'Y'
AND IsAutoSequence = 'Y'
FOR UPDATE OF CurrentNext, CurrentNextSys;
v_ResultStr := 'Write';
IF (v_NextNoSys <> -1 AND p_ID < 1000000) THEN -- System No
UPDATE AD_Sequence
SET CurrentNextSys = CurrentNextSys + IncrementNo,
Updated = SysDate
WHERE Name = p_TableName;
p_NextNo := v_NextNoSys;
ELSE -- Standard No
UPDATE AD_Sequence
SET CurrentNext = CurrentNext + IncrementNo,
Updated = SysDate
WHERE Name = p_TableName;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20100, 'Table Sequence not found ');
-- || v_ResultStr || ': ' || p_TableName);
END AD_Sequence_Next;
/

View File

@ -1,775 +0,0 @@
CREATE OR REPLACE PROCEDURE AD_Synchronize
(
p_PInstance_ID IN NUMBER -- DEFAULT NULL
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2003 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: AD_Syncronize.sql,v 1.2 2006/05/03 00:06:58 jjanke Exp $
***
* Title: Syncronize Application Dictionary
* Description:
* Synchronize Elements
* Update Column and Field with Names from Element and Process
* Update Process Parameters from Elements
* Update Workflow Notes from Windows
* Update Menu from Window/Form/Process/Task
************************************************************************/
AS
-- Logistice
v_ResultStr VARCHAR2(2000);
v_Message VARCHAR2(2000);
v_Result NUMBER := 1; -- 0=failure
v_Record_ID NUMBER;
v_AD_User_ID NUMBER;
-- Parameter
CURSOR Cur_Parameter (pp_PInstance NUMBER) IS
SELECT i.Record_ID, i.AD_User_ID,
p.ParameterName, p.P_String, p.P_Number, p.P_Date
FROM AD_PInstance i, AD_PInstance_Para p
WHERE i.AD_PInstance_ID=pp_PInstance
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
ORDER BY p.SeqNo;
-- Parameter Variables
BEGIN
IF (p_PInstance_ID IS NOT NULL) THEN
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_PInstance_ID);
v_ResultStr := 'PInstanceNotFound';
UPDATE AD_PInstance
SET Created = SysDate,
IsProcessing = 'Y'
WHERE AD_PInstance_ID=p_PInstance_ID;
COMMIT;
-- Get Parameters
v_ResultStr := 'ReadingParameters';
FOR p IN Cur_Parameter (p_PInstance_ID) LOOP
v_Record_ID := p.Record_ID;
v_AD_User_ID := p.AD_User_ID;
END LOOP; -- Get Parameter
DBMS_OUTPUT.PUT_LINE(' Record_ID=' || v_Record_ID);
END IF;
---------------------------------------------------------------------------
DBMS_OUTPUT.PUT_LINE('Adding missing Elements');
DECLARE
NextNo NUMBER;
CURSOR Cur_Column IS
SELECT DISTINCT ColumnName, Name, Description, Help, EntityType
FROM AD_Column c
WHERE NOT EXISTS
(SELECT * FROM AD_Element e
WHERE UPPER(c.ColumnName)=UPPER(e.ColumnName));
CURSOR Cur_Process IS
SELECT DISTINCT ColumnName, Name, Description, Help, EntityType
FROM AD_Process_Para p
WHERE NOT EXISTS
(SELECT * FROM AD_Element e
WHERE UPPER(p.ColumnName)=UPPER(e.ColumnName));
CC Cur_Column%ROWTYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE('Column:');
FOR CC IN Cur_Column LOOP
AD_Sequence_Next('AD_Element', 0, NextNo); -- get ID
INSERT INTO AD_ELEMENT
(AD_ELEMENT_ID, AD_CLIENT_ID, AD_ORG_ID,
ISACTIVE, CREATED, CREATEDBY, UPDATED, UPDATEDBY,
ColumnName, Name, PrintName, Description, Help, EntityType)
VALUES
(NextNo, 0, 0,
'Y', SysDate, 0, SysDate, 0,
CC.ColumnName, CC.Name, CC.Name, CC.Description, CC.Help, CC.EntityType);
DBMS_OUTPUT.PUT_LINE(' added ' || cc.ColumnName);
COMMIT;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Parameter:');
FOR CC IN Cur_Process LOOP
AD_Sequence_Next('AD_Element', 0, NextNo); -- get ID
INSERT INTO AD_ELEMENT
(AD_ELEMENT_ID, AD_CLIENT_ID, AD_ORG_ID,
ISACTIVE, CREATED, CREATEDBY, UPDATED, UPDATEDBY,
ColumnName, Name, PrintName, Description, Help, EntityType)
VALUES
(NextNo, 0, 0,
'Y', SysDate, 0, SysDate, 0,
CC.ColumnName, CC.Name, CC.Name, CC.Description, CC.Help, CC.EntityType);
DBMS_OUTPUT.PUT_LINE(' added ' || cc.ColumnName);
COMMIT;
END LOOP;
END;
DBMS_OUTPUT.PUT_LINE('Adding missing Element Translations');
INSERT INTO AD_Element_Trl (AD_Element_ID, AD_Language, AD_Client_ID, AD_Org_ID,
IsActive, Created, CreatedBy, Updated, UpdatedBy,
Name, PrintName, Description, Help, IsTranslated)
SELECT m.AD_Element_ID, l.AD_Language, m.AD_Client_ID, m.AD_Org_ID,
m.IsActive, m.Created, m.CreatedBy, m.Updated, m.UpdatedBy,
m.Name, m.PrintName, m.Description, m.Help, 'N'
FROM AD_Element m, AD_Language l
WHERE l.IsActive = 'Y' AND l.IsSystemLanguage = 'Y'
AND AD_Element_ID || AD_Language NOT IN
(SELECT AD_Element_ID || AD_Language FROM AD_Element_Trl);
DBMS_OUTPUT.PUT_LINE(' rows added: ' || SQL%ROWCOUNT);
DBMS_OUTPUT.PUT_LINE('Creating link from Element to Column');
UPDATE AD_Column c
SET AD_Element_id =
(SELECT AD_Element_ID FROM AD_Element e
WHERE UPPER(c.ColumnName)=UPPER(e.ColumnName))
WHERE AD_Element_ID IS NULL;
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
COMMIT;
DBMS_OUTPUT.PUT_LINE('Deleting unused Elements');
DELETE AD_Element_Trl
WHERE AD_Element_ID IN
(SELECT AD_Element_ID FROM AD_Element e
WHERE NOT EXISTS
(SELECT * FROM AD_Column c WHERE UPPER(e.ColumnName)=UPPER(c.ColumnName))
AND NOT EXISTS
(SELECT * FROM AD_Process_Para p WHERE UPPER(e.ColumnName)=UPPER(p.ColumnName)));
DELETE AD_Element e
WHERE NOT EXISTS
(SELECT * FROM AD_Column c WHERE UPPER(e.ColumnName)=UPPER(c.ColumnName))
AND NOT EXISTS
(SELECT * FROM AD_Process_Para p WHERE UPPER(e.ColumnName)=UPPER(p.ColumnName));
DBMS_OUTPUT.PUT_LINE(' rows deleted: ' || SQL%ROWCOUNT);
---------------------------------------------------------------------------
-- Columns
DBMS_OUTPUT.PUT_LINE('Synchronize Column');
/* Identify offending column
SELECT UPPER(ColumnName)
FROM AD_Element
GROUP BY UPPER(ColumnName)
HAVING COUNT(UPPER(ColumnName)) > 1
SELECT c.ColumnName, e.ColumnName
FROM AD_Column c
INNER JOIN AD_Element e ON (c.AD_Element_ID=e.AD_Element_ID)
WHERE c.ColumnName <> e.ColumnName
*/
UPDATE AD_Column c
SET (ColumnName, Name, Description, Help) =
(SELECT ColumnName, Name, Description, Help
FROM AD_Element e WHERE c.AD_Element_ID=e.AD_Element_ID),
Updated = SysDate
WHERE EXISTS (SELECT * FROM AD_Element e
WHERE c.AD_Element_ID=e.AD_Element_ID
AND (c.ColumnName <> e.ColumnName OR c.Name <> e.Name
OR NVL(c.Description,' ') <> NVL(e.Description,' ') OR NVL(c.Help,' ') <> NVL(e.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Fields should now be syncronized
DBMS_OUTPUT.PUT_LINE('Synchronize Field');
UPDATE AD_Field f
SET (Name, Description, Help) =
(SELECT e.Name, e.Description, e.Help
FROM AD_Element e, AD_Column c
WHERE e.AD_Element_ID=c.AD_Element_ID AND c.AD_Column_ID=f.AD_Column_ID),
Updated = SysDate
WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND EXISTS (SELECT * FROM AD_Element e, AD_Column c
WHERE f.AD_Column_ID=c.AD_Column_ID
AND c.AD_Element_ID=e.AD_Element_ID AND c.AD_Process_ID IS NULL
AND (f.Name <> e.Name OR NVL(f.Description,' ') <> NVL(e.Description,' ') OR NVL(f.Help,' ') <> NVL(e.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Field Translations
DBMS_OUTPUT.PUT_LINE('Synchronize Field Translations');
UPDATE AD_Field_trl trl
SET Name = (SELECT e.Name FROM AD_Element_trl e, AD_Column c, AD_Field f
WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
Description = (SELECT e.Description FROM AD_Element_trl e, AD_Column c, AD_Field f
WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
Help = (SELECT e.Help FROM AD_Element_trl e, AD_Column c, AD_Field f
WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
IsTranslated = (SELECT e.IsTranslated FROM AD_Element_trl e, AD_Column c, AD_Field f
WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
Updated = SysDate
WHERE EXISTS (SELECT * FROM AD_Field f, AD_Element_trl e, AD_Column c
WHERE trl.AD_Field_ID=f.AD_Field_ID
AND f.AD_Column_ID=c.AD_Column_ID
AND c.AD_Element_ID=e.AD_Element_ID AND c.AD_Process_ID IS NULL
AND trl.AD_Language=e.AD_Language
AND f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND (trl.Name <> e.Name OR NVL(trl.Description,' ') <> NVL(e.Description,' ') OR NVL(trl.Help,' ') <> NVL(e.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Fields should now be syncronized
DBMS_OUTPUT.PUT_LINE('Synchronize PO Field');
UPDATE AD_Field f
SET Name = (SELECT e.PO_Name FROM AD_Element e, AD_Column c
WHERE e.AD_Element_ID=c.AD_Element_ID AND c.AD_Column_ID=f.AD_Column_ID),
Description = (SELECT e.PO_Description FROM AD_Element e, AD_Column c
WHERE e.AD_Element_ID=c.AD_Element_ID AND c.AD_Column_ID=f.AD_Column_ID),
Help = (SELECT e.PO_Help FROM AD_Element e, AD_Column c
WHERE e.AD_Element_ID=c.AD_Element_ID AND c.AD_Column_ID=f.AD_Column_ID),
Updated = SysDate
WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND EXISTS (SELECT * FROM AD_Element e, AD_Column c
WHERE f.AD_Column_ID=c.AD_Column_ID
AND c.AD_Element_ID=e.AD_Element_ID AND c.AD_Process_ID IS NULL
AND (f.Name <> e.PO_Name OR NVL(f.Description,' ') <> NVL(e.PO_Description,' ') OR NVL(f.Help,' ') <> NVL(e.PO_Help,' '))
AND e.PO_Name IS NOT NULL)
AND EXISTS (SELECT * FROM AD_Tab t, AD_Window w
WHERE f.AD_Tab_ID=t.AD_Tab_ID
AND t.AD_Window_ID=w.AD_Window_ID
AND w.IsSOTrx='N');
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Field Translations
DBMS_OUTPUT.PUT_LINE('Synchronize PO Field Translations');
UPDATE AD_Field_trl trl
SET Name = (SELECT e.PO_Name FROM AD_Element_trl e, AD_Column c, AD_Field f
WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
Description = (SELECT e.PO_Description FROM AD_Element_trl e, AD_Column c, AD_Field f
WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
Help = (SELECT e.PO_Help FROM AD_Element_trl e, AD_Column c, AD_Field f
WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
IsTranslated = (SELECT e.IsTranslated FROM AD_Element_trl e, AD_Column c, AD_Field f
WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
Updated = SysDate
WHERE EXISTS (SELECT * FROM AD_Field f, AD_Element_trl e, AD_Column c
WHERE trl.AD_Field_ID=f.AD_Field_ID
AND f.AD_Column_ID=c.AD_Column_ID
AND c.AD_Element_ID=e.AD_Element_ID AND c.AD_Process_ID IS NULL
AND trl.AD_Language=e.AD_Language
AND f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND (trl.Name <> e.PO_Name OR NVL(trl.Description,' ') <> NVL(e.PO_Description,' ') OR NVL(trl.Help,' ') <> NVL(e.PO_Help,' '))
AND e.PO_Name IS NOT NULL)
AND EXISTS (SELECT * FROM AD_Field f, AD_Tab t, AD_Window w
WHERE trl.AD_Field_ID=f.AD_Field_ID
AND f.AD_Tab_ID=t.AD_Tab_ID
AND t.AD_Window_ID=w.AD_Window_ID
AND w.IsSOTrx='N');
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Fields from Process
DBMS_OUTPUT.PUT_LINE('Synchronize Field from Process');
UPDATE AD_Field f
SET Name = (SELECT p.Name FROM AD_Process p, AD_Column c WHERE p.AD_Process_ID=c.AD_Process_ID
AND c.AD_Column_ID=f.AD_Column_ID),
Description = (SELECT p.Description FROM AD_Process p, AD_Column c WHERE p.AD_Process_ID=c.AD_Process_ID
AND c.AD_Column_ID=f.AD_Column_ID),
Help = (SELECT p.Help FROM AD_Process p, AD_Column c WHERE p.AD_Process_ID=c.AD_Process_ID
AND c.AD_Column_ID=f.AD_Column_ID),
Updated = SysDate
WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND EXISTS (SELECT * FROM AD_Process p, AD_Column c
WHERE c.AD_Process_ID=p.AD_Process_ID AND f.AD_Column_ID=c.AD_Column_ID
AND (f.Name<>p.Name OR NVL(f.Description,' ')<>NVL(p.Description,' ') OR NVL(f.Help,' ')<>NVL(p.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Field Translations from Process
DBMS_OUTPUT.PUT_LINE('Synchronize Field Trl from Process Trl');
UPDATE AD_Field_trl trl
SET Name = (SELECT p.Name FROM AD_Process_trl p, AD_Column c, AD_Field f
WHERE p.AD_Process_ID=c.AD_Process_ID AND c.AD_Column_ID=f.AD_Column_ID
AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_Language=trl.AD_Language),
Description = (SELECT p.Description FROM AD_Process_trl p, AD_Column c, AD_Field f
WHERE p.AD_Process_ID=c.AD_Process_ID AND c.AD_Column_ID=f.AD_Column_ID
AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_Language=trl.AD_Language),
Help = (SELECT p.Help FROM AD_Process_trl p, AD_Column c, AD_Field f
WHERE p.AD_Process_ID=c.AD_Process_ID AND c.AD_Column_ID=f.AD_Column_ID
AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_Language=trl.AD_Language),
IsTranslated = (SELECT p.IsTranslated FROM AD_Process_trl p, AD_Column c, AD_Field f
WHERE p.AD_Process_ID=c.AD_Process_ID AND c.AD_Column_ID=f.AD_Column_ID
AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_Language=trl.AD_Language),
Updated = SysDate
WHERE EXISTS (SELECT * FROM AD_Process_Trl p, AD_Column c, AD_Field f
WHERE c.AD_Process_ID=p.AD_Process_ID AND f.AD_Column_ID=c.AD_Column_ID
AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_Language=trl.AD_Language
AND f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND (trl.Name<>p.Name OR NVL(trl.Description,' ')<>NVL(p.Description,' ') OR NVL(trl.Help,' ')<>NVL(p.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Sync Parameter ColumnName
UPDATE AD_Process_Para f
SET ColumnName = (SELECT e.ColumnName FROM AD_Element e
WHERE UPPER(e.ColumnName)=UPPER(f.ColumnName))
WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND EXISTS (SELECT * FROM AD_Element e
WHERE UPPER(e.ColumnName)=UPPER(f.ColumnName)
AND e.ColumnName<>f.ColumnName);
-- Paramenter Fields
UPDATE AD_Process_Para p
SET IsCentrallyMaintained = 'N'
WHERE IsCentrallyMaintained <> 'N'
AND NOT EXISTS (SELECT * FROM AD_Element e WHERE p.ColumnName=e.ColumnName);
-- Parameter Fields
DBMS_OUTPUT.PUT_LINE('Synchronize Process Parameter');
UPDATE AD_Process_Para f
SET Name = (SELECT e.Name FROM AD_Element e
WHERE e.ColumnName=f.ColumnName),
Description = (SELECT e.Description FROM AD_Element e
WHERE e.ColumnName=f.ColumnName),
Help = (SELECT e.Help FROM AD_Element e
WHERE e.ColumnName=f.ColumnName),
Updated = SysDate
WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND EXISTS (SELECT * FROM AD_Element e
WHERE e.ColumnName=f.ColumnName
AND (f.Name <> e.Name OR NVL(f.Description,' ') <> NVL(e.Description,' ') OR NVL(f.Help,' ') <> NVL(e.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Parameter Translations
DBMS_OUTPUT.PUT_LINE('Synchronize Process Parameter Trl');
UPDATE AD_Process_Para_Trl trl
SET Name = (SELECT et.Name FROM AD_Element_Trl et, AD_Element e, AD_Process_Para f
WHERE et.AD_Language=trl.AD_Language AND et.AD_Element_ID=e.AD_Element_ID
AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID),
Description = (SELECT et.Description FROM AD_Element_Trl et, AD_Element e, AD_Process_Para f
WHERE et.AD_Language=trl.AD_Language AND et.AD_Element_ID=e.AD_Element_ID
AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID),
Help = (SELECT et.Help FROM AD_Element_Trl et, AD_Element e, AD_Process_Para f
WHERE et.AD_Language=trl.AD_Language AND et.AD_Element_ID=e.AD_Element_ID
AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID),
IsTranslated = (SELECT et.IsTranslated FROM AD_Element_Trl et, AD_Element e, AD_Process_Para f
WHERE et.AD_Language=trl.AD_Language AND et.AD_Element_ID=e.AD_Element_ID
AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID),
Updated = SysDate
WHERE EXISTS (SELECT * FROM AD_Element_Trl et, AD_Element e, AD_Process_Para f
WHERE et.AD_Language=trl.AD_Language AND et.AD_Element_ID=e.AD_Element_ID
AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID
AND f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND (trl.Name <> et.Name OR NVL(trl.Description,' ') <> NVL(et.Description,' ') OR NVL(trl.Help,' ') <> NVL(et.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Workflow Node - Window
DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node from Window');
UPDATE AD_WF_Node n
SET Name = (SELECT w.Name FROM AD_Window w
WHERE w.AD_Window_ID=n.AD_Window_ID),
Description = (SELECT w.Description FROM AD_Window w
WHERE w.AD_Window_ID=n.AD_Window_ID),
Help = (SELECT w.Help FROM AD_Window w
WHERE w.AD_Window_ID=n.AD_Window_ID)
WHERE n.IsCentrallyMaintained = 'Y'
AND EXISTS (SELECT * FROM AD_Window w
WHERE w.AD_Window_ID=n.AD_Window_ID
AND (w.Name <> n.Name OR NVL(w.Description,' ') <> NVL(n.Description,' ') OR NVL(w.Help,' ') <> NVL(n.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Workflow Translations - Window
DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node Trl from Window Trl');
UPDATE AD_WF_Node_Trl trl
SET Name = (SELECT t.Name FROM AD_Window_trl t, AD_WF_Node n
WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Window_ID=t.AD_Window_ID
AND trl.AD_Language=t.AD_Language),
Description = (SELECT t.Description FROM AD_Window_trl t, AD_WF_Node n
WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Window_ID=t.AD_Window_ID
AND trl.AD_Language=t.AD_Language),
Help = (SELECT t.Help FROM AD_Window_trl t, AD_WF_Node n
WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Window_ID=t.AD_Window_ID
AND trl.AD_Language=t.AD_Language)
WHERE EXISTS (SELECT * FROM AD_Window_Trl t, AD_WF_Node n
WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Window_ID=t.AD_Window_ID
AND trl.AD_Language=t.AD_Language AND n.IsCentrallyMaintained='Y' AND n.IsActive='Y'
AND (trl.Name <> t.Name OR NVL(trl.Description,' ') <> NVL(t.Description,' ') OR NVL(trl.Help,' ') <> NVL(t.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Workflow Node - Form
DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node from Form');
UPDATE AD_WF_Node n
SET (Name, Description, Help) = (SELECT f.Name, f.Description, f.Help
FROM AD_Form f
WHERE f.AD_Form_ID=n.AD_Form_ID)
WHERE n.IsCentrallyMaintained = 'Y'
AND EXISTS (SELECT * FROM AD_Form f
WHERE f.AD_Form_ID=n.AD_Form_ID
AND (f.Name <> n.Name OR NVL(f.Description,' ') <> NVL(n.Description,' ') OR NVL(f.Help,' ') <> NVL(n.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Workflow Translations - Form
DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node Trl from Form Trl');
UPDATE AD_WF_Node_Trl trl
SET (Name, Description, Help) = (SELECT t.Name, t.Description, t.Help
FROM AD_Form_trl t, AD_WF_Node n
WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Form_ID=t.AD_Form_ID
AND trl.AD_Language=t.AD_Language)
WHERE EXISTS (SELECT * FROM AD_Form_Trl t, AD_WF_Node n
WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Form_ID=t.AD_Form_ID
AND trl.AD_Language=t.AD_Language AND n.IsCentrallyMaintained='Y' AND n.IsActive='Y'
AND (trl.Name <> t.Name OR NVL(trl.Description,' ') <> NVL(t.Description,' ') OR NVL(trl.Help,' ') <> NVL(t.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Workflow Node - Report
DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node from Process');
UPDATE AD_WF_Node n
SET (Name, Description, Help) = (SELECT f.Name, f.Description, f.Help
FROM AD_Process f
WHERE f.AD_Process_ID=n.AD_Process_ID)
WHERE n.IsCentrallyMaintained = 'Y'
AND EXISTS (SELECT * FROM AD_Process f
WHERE f.AD_Process_ID=n.AD_Process_ID
AND (f.Name <> n.Name OR NVL(f.Description,' ') <> NVL(n.Description,' ') OR NVL(f.Help,' ') <> NVL(n.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Workflow Translations - Form
DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node Trl from Process Trl');
UPDATE AD_WF_Node_Trl trl
SET (Name, Description, Help) = (SELECT t.Name, t.Description, t.Help
FROM AD_Process_trl t, AD_WF_Node n
WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Process_ID=t.AD_Process_ID
AND trl.AD_Language=t.AD_Language)
WHERE EXISTS (SELECT * FROM AD_Process_Trl t, AD_WF_Node n
WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Process_ID=t.AD_Process_ID
AND trl.AD_Language=t.AD_Language AND n.IsCentrallyMaintained='Y' AND n.IsActive='Y'
AND (trl.Name <> t.Name OR NVL(trl.Description,' ') <> NVL(t.Description,' ') OR NVL(trl.Help,' ') <> NVL(t.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Need centrally maintained flag here!
DBMS_OUTPUT.PUT_LINE('Synchronize PrintFormatItem Name from Element');
UPDATE AD_PrintFormatItem pfi
SET Name = (SELECT e.Name
FROM AD_Element e, AD_Column c
WHERE e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=pfi.AD_Column_ID)
WHERE pfi.IsCentrallyMaintained='Y'
AND EXISTS (SELECT *
FROM AD_Element e, AD_Column c
WHERE e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=pfi.AD_Column_ID
AND e.Name<>pfi.Name)
AND EXISTS (SELECT * FROM AD_Client
WHERE AD_Client_ID=pfi.AD_Client_ID AND IsMultiLingualDocument='Y');
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
DBMS_OUTPUT.PUT_LINE('Synchronize PrintFormatItem PrintName from Element');
UPDATE AD_PrintFormatItem pfi
SET PrintName = (SELECT e.PrintName
FROM AD_Element e, AD_Column c
WHERE e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=pfi.AD_Column_ID)
WHERE pfi.IsCentrallyMaintained='Y'
AND EXISTS (SELECT *
FROM AD_Element e, AD_Column c, AD_PrintFormat pf
WHERE e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=pfi.AD_Column_ID
AND LENGTH(pfi.PrintName) > 0
AND e.PrintName<>pfi.PrintName
AND pf.AD_PrintFormat_ID=pfi.AD_PrintFormat_ID
AND pf.IsForm='N' AND IsTableBased='Y')
AND EXISTS (SELECT * FROM AD_Client
WHERE AD_Client_ID=pfi.AD_Client_ID AND IsMultiLingualDocument='Y');
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
DBMS_OUTPUT.PUT_LINE('Synchronize PrintFormatItem Trl from Element Trl (Multi-Lingual)');
UPDATE AD_PrintFormatItem_Trl trl
SET PrintName = (SELECT e.PrintName
FROM AD_Element_Trl e, AD_Column c, AD_PrintFormatItem pfi
WHERE e.AD_Language=trl.AD_Language
AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=pfi.AD_Column_ID
AND pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID)
WHERE EXISTS (SELECT *
FROM AD_Element_Trl e, AD_Column c, AD_PrintFormatItem pfi, AD_PrintFormat pf
WHERE e.AD_Language=trl.AD_Language
AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=pfi.AD_Column_ID
AND pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID
AND pfi.IsCentrallyMaintained='Y'
AND LENGTH(pfi.PrintName) > 0
AND (e.PrintName<>trl.PrintName OR trl.PrintName IS NULL)
AND pf.AD_PrintFormat_ID=pfi.AD_PrintFormat_ID
AND pf.IsForm='N' AND IsTableBased='Y')
AND EXISTS (SELECT * FROM AD_Client
WHERE AD_Client_ID=trl.AD_Client_ID AND IsMultiLingualDocument='Y');
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
DBMS_OUTPUT.PUT_LINE('Synchronize PrintFormatItem Trl (Not Multi-Lingual)');
UPDATE AD_PrintFormatItem_Trl trl
SET PrintName = (SELECT pfi.PrintName
FROM AD_PrintFormatItem pfi
WHERE pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID)
WHERE EXISTS (SELECT *
FROM AD_PrintFormatItem pfi, AD_PrintFormat pf
WHERE pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID
AND pfi.IsCentrallyMaintained='Y'
AND LENGTH(pfi.PrintName) > 0
AND pfi.PrintName<>trl.PrintName
AND pf.AD_PrintFormat_ID=pfi.AD_PrintFormat_ID
AND pf.IsForm='N' AND pf.IsTableBased='Y')
AND EXISTS (SELECT * FROM AD_Client
WHERE AD_Client_ID=trl.AD_Client_ID AND IsMultiLingualDocument='N');
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
DBMS_OUTPUT.PUT_LINE('Reset PrintFormatItem Trl where not used in base table');
UPDATE AD_PrintFormatItem_Trl trl
SET PrintName = NULL
WHERE PrintName IS NOT NULL
AND EXISTS (SELECT *
FROM AD_PrintFormatItem pfi
WHERE pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID
AND pfi.IsCentrallyMaintained='Y'
AND (LENGTH (pfi.PrintName) = 0 OR pfi.PrintName IS NULL));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
/**
SELECT e.PrintName "Element", pfi.PrintName "FormatItem", trl.AD_Language, trl.PrintName "Trl"
FROM AD_Element e
INNER JOIN AD_Column c ON (e.AD_Element_ID=c.AD_Element_ID)
INNER JOIN AD_PrintFormatItem pfi ON (c.AD_Column_ID=pfi.AD_Column_ID)
INNER JOIN AD_PrintFormatItem_Trl trl ON (pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID)
WHERE pfi.AD_PrintFormatItem_ID=?
**/
-- Sync Names - Window
DBMS_OUTPUT.PUT_LINE('Synchronizing Menu with Window');
UPDATE AD_Menu m
SET Name = (SELECT Name FROM AD_Window w WHERE m.AD_Window_ID=w.AD_Window_ID),
Description = (SELECT Description FROM AD_Window w WHERE m.AD_Window_ID=w.AD_Window_ID)
WHERE AD_Window_ID IS NOT NULL
AND Action = 'W';
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
UPDATE AD_Menu_Trl mt
SET Name = (SELECT wt.Name FROM AD_Window_Trl wt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Window_ID=wt.AD_Window_ID
AND mt.AD_Language=wt.AD_Language),
Description = (SELECT wt.Description FROM AD_Window_Trl wt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Window_ID=wt.AD_Window_ID
AND mt.AD_Language=wt.AD_Language),
IsTranslated = (SELECT wt.IsTranslated FROM AD_Window_Trl wt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Window_ID=wt.AD_Window_ID
AND mt.AD_Language=wt.AD_Language)
WHERE EXISTS (SELECT * FROM AD_Window_Trl wt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Window_ID=wt.AD_Window_ID
AND mt.AD_Language=wt.AD_Language
AND m.AD_Window_ID IS NOT NULL
AND m.Action = 'W');
DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
-- Sync Names - Process
DBMS_OUTPUT.PUT_LINE('Synchronizing Menu with Processes');
UPDATE AD_Menu m
SET Name = (SELECT p.Name FROM AD_Process p WHERE m.AD_Process_ID=p.AD_Process_ID),
Description = (SELECT p.Description FROM AD_Process p WHERE m.AD_Process_ID=p.AD_Process_ID)
WHERE m.AD_Process_ID IS NOT NULL
AND m.Action IN ('R', 'P');
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
UPDATE AD_Menu_Trl mt
SET Name = (SELECT pt.Name FROM AD_Process_Trl pt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Process_ID=pt.AD_Process_ID
AND mt.AD_Language=pt.AD_Language),
Description = (SELECT pt.Description FROM AD_Process_Trl pt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Process_ID=pt.AD_Process_ID
AND mt.AD_Language=pt.AD_Language),
IsTranslated = (SELECT pt.IsTranslated FROM AD_Process_Trl pt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Process_ID=pt.AD_Process_ID
AND mt.AD_Language=pt.AD_Language)
WHERE EXISTS (SELECT * FROM AD_Process_Trl pt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Process_ID=pt.AD_Process_ID
AND mt.AD_Language=pt.AD_Language
AND m.AD_Process_ID IS NOT NULL
AND Action IN ('R', 'P'));
DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
-- Sync Names = Form
DBMS_OUTPUT.PUT_LINE('Synchronizing Menu with Forms');
UPDATE AD_Menu m
SET Name = (SELECT Name FROM AD_Form f WHERE m.AD_Form_ID=f.AD_Form_ID),
Description = (SELECT Description FROM AD_Form f WHERE m.AD_Form_ID=f.AD_Form_ID)
WHERE AD_Form_ID IS NOT NULL
AND Action = 'X';
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
UPDATE AD_Menu_Trl mt
SET Name = (SELECT ft.Name FROM AD_Form_Trl ft, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Form_ID=ft.AD_Form_ID
AND mt.AD_Language=ft.AD_Language),
Description = (SELECT ft.Description FROM AD_Form_Trl ft, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Form_ID=ft.AD_Form_ID
AND mt.AD_Language=ft.AD_Language),
IsTranslated = (SELECT ft.IsTranslated FROM AD_Form_Trl ft, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Form_ID=ft.AD_Form_ID
AND mt.AD_Language=ft.AD_Language)
WHERE EXISTS (SELECT * FROM AD_Form_Trl ft, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Form_ID=ft.AD_Form_ID
AND mt.AD_Language=ft.AD_Language
AND m.AD_Form_ID IS NOT NULL
AND Action = 'X');
DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
-- Sync Names - Workflow
DBMS_OUTPUT.PUT_LINE('Synchronizing Menu with Workflows');
UPDATE AD_Menu m
SET Name = (SELECT p.Name FROM AD_Workflow p WHERE m.AD_Workflow_ID=p.AD_Workflow_ID),
Description = (SELECT p.Description FROM AD_Workflow p WHERE m.AD_Workflow_ID=p.AD_Workflow_ID)
WHERE m.AD_Workflow_ID IS NOT NULL
AND m.Action = 'F';
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
UPDATE AD_Menu_Trl mt
SET Name = (SELECT pt.Name FROM AD_Workflow_Trl pt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Workflow_ID=pt.AD_Workflow_ID
AND mt.AD_Language=pt.AD_Language),
Description = (SELECT pt.Description FROM AD_Workflow_Trl pt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Workflow_ID=pt.AD_Workflow_ID
AND mt.AD_Language=pt.AD_Language),
IsTranslated = (SELECT pt.IsTranslated FROM AD_Workflow_Trl pt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Workflow_ID=pt.AD_Workflow_ID
AND mt.AD_Language=pt.AD_Language)
WHERE EXISTS (SELECT * FROM AD_Workflow_Trl pt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Workflow_ID=pt.AD_Workflow_ID
AND mt.AD_Language=pt.AD_Language
AND m.AD_Workflow_ID IS NOT NULL
AND Action = 'F');
DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
-- Sync Names = Task
DBMS_OUTPUT.PUT_LINE('Synchronizing Menu with Tasks');
UPDATE AD_Menu m
SET Name = (SELECT Name FROM AD_Task f WHERE m.AD_Task_ID=f.AD_Task_ID),
Description = (SELECT Description FROM AD_Task f WHERE m.AD_Task_ID=f.AD_Task_ID)
WHERE AD_Task_ID IS NOT NULL
AND Action = 'T';
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
UPDATE AD_Menu_Trl mt
SET Name = (SELECT ft.Name FROM AD_Task_Trl ft, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Task_ID=ft.AD_Task_ID
AND mt.AD_Language=ft.AD_Language),
Description = (SELECT ft.Description FROM AD_Task_Trl ft, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Task_ID=ft.AD_Task_ID
AND mt.AD_Language=ft.AD_Language),
IsTranslated = (SELECT ft.IsTranslated FROM AD_Task_Trl ft, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Task_ID=ft.AD_Task_ID
AND mt.AD_Language=ft.AD_Language)
WHERE EXISTS (SELECT * FROM AD_Task_Trl ft, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Task_ID=ft.AD_Task_ID
AND mt.AD_Language=ft.AD_Language
AND m.AD_Task_ID IS NOT NULL
AND Action = 'T');
DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
-- Column Name + Element
DBMS_OUTPUT.PUT_LINE('Synchronizing Column with Element');
UPDATE AD_Column c
SET (Name,Description,Help) =
(SELECT e.Name,e.Description,e.Help
FROM AD_Element e WHERE c.AD_Element_ID=e.AD_Element_ID)
WHERE EXISTS
(SELECT * FROM AD_Element e
WHERE c.AD_Element_ID=e.AD_Element_ID
AND c.Name<>e.Name);
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
UPDATE AD_Column_Trl ct
SET Name = (SELECT e.Name
FROM AD_Column c INNER JOIN AD_Element_Trl e ON (c.AD_Element_ID=e.AD_Element_ID)
WHERE ct.AD_Column_ID=c.AD_Column_ID AND ct.AD_Language=e.AD_Language)
WHERE EXISTS
(SELECT * FROM AD_Column c INNER JOIN AD_Element_Trl e ON (c.AD_Element_ID=e.AD_Element_ID)
WHERE ct.AD_Column_ID=c.AD_Column_ID AND ct.AD_Language=e.AD_Language
AND ct.Name<>e.Name);
DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
-- Table Name + Element
DBMS_OUTPUT.PUT_LINE('Synchronizing Table with Element');
UPDATE AD_Table t
SET (Name,Description) = (SELECT e.Name,e.Description FROM AD_Element e
WHERE t.TableName||'_ID'=e.ColumnName)
WHERE EXISTS (SELECT * FROM AD_Element e
WHERE t.TableName||'_ID'=e.ColumnName
AND t.Name<>e.Name);
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
UPDATE AD_Table_Trl tt
SET Name = (SELECT e.Name
FROM AD_Table t INNER JOIN AD_Element ex ON (t.TableName||'_ID'=ex.ColumnName)
INNER JOIN AD_Element_Trl e ON (ex.AD_Element_ID=e.AD_Element_ID)
WHERE tt.AD_Table_ID=t.AD_Table_ID AND tt.AD_Language=e.AD_Language)
WHERE EXISTS (SELECT *
FROM AD_Table t INNER JOIN AD_Element ex ON (t.TableName||'_ID'=ex.ColumnName)
INNER JOIN AD_Element_Trl e ON (ex.AD_Element_ID=e.AD_Element_ID)
WHERE tt.AD_Table_ID=t.AD_Table_ID AND tt.AD_Language=e.AD_Language
AND tt.Name<>e.Name);
DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
-- Trl Table Name + Element
UPDATE AD_Table t
SET (Name,Description) = (SELECT e.Name||' Trl', e.Description
FROM AD_Element e
WHERE SUBSTR(t.TableName,1,LENGTH(t.TableName)-4)||'_ID'=e.ColumnName)
WHERE TableName LIKE '%_Trl'
AND EXISTS (SELECT * FROM AD_Element e
WHERE SUBSTR(t.TableName,1,LENGTH(t.TableName)-4)||'_ID'=e.ColumnName
AND t.Name<>e.Name);
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
UPDATE AD_Table_Trl tt
SET Name = (SELECT e.Name || ' **'
FROM AD_Table t INNER JOIN AD_Element ex ON (SUBSTR(t.TableName,1,LENGTH(t.TableName)-4)||'_ID'=ex.ColumnName)
INNER JOIN AD_Element_Trl e ON (ex.AD_Element_ID=e.AD_Element_ID)
WHERE tt.AD_Table_ID=t.AD_Table_ID AND tt.AD_Language=e.AD_Language)
WHERE EXISTS (SELECT *
FROM AD_Table t INNER JOIN AD_Element ex ON (SUBSTR(t.TableName,1,LENGTH(t.TableName)-4)||'_ID'=ex.ColumnName)
INNER JOIN AD_Element_Trl e ON (ex.AD_Element_ID=e.AD_Element_ID)
WHERE tt.AD_Table_ID=t.AD_Table_ID AND tt.AD_Language=e.AD_Language
AND t.TableName LIKE '%_Trl'
AND tt.Name<>e.Name);
DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
/** Remaining tables
SELECT Name, TableName FROM AD_Table t WHERE Name=TableName ORDER BY 1
**/
<<FINISH_PROCESS>>
IF (p_PInstance_ID IS NOT NULL) THEN
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = v_Result, -- 1=success
ErrorMsg = v_Message
WHERE AD_PInstance_ID=p_PInstance_ID;
END IF;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
v_ResultStr := v_ResultStr || ': ' || SQLERRM || ' - ' || v_Message;
DBMS_OUTPUT.PUT_LINE(v_ResultStr);
ROLLBACK;
IF (p_PInstance_ID IS NOT NULL) THEN
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 0, -- failure
ErrorMsg = v_ResultStr
WHERE AD_PInstance_ID=p_PInstance_ID;
COMMIT;
END IF;
RETURN;
END AD_Synchronize;
/

View File

@ -1,173 +0,0 @@
CREATE OR REPLACE PROCEDURE C_Order_DrillDown
(
PInstance_ID IN NUMBER
)
/******************************************************************************
* ** Adempiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
* Open Source Software Provided "AS IS" without warranty or liability
* When you use any parts (changed or unchanged), add "Powered by Adempiere" to
* your product name; See license details http://www.adempiere.org/license.html
******************************************************************************
* List Orders with their Shipments and Invoices
* Spool to T_Spool
*/
AS
ResultStr VARCHAR2(2000);
Message VARCHAR2(2000);
Record_ID NUMBER;
CURSOR Cur_Parameter (PInstance NUMBER) IS
SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
FROM AD_PInstance i, AD_PInstance_Para p
WHERE i.AD_PInstance_ID=PInstance
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
ORDER BY p.SeqNo;
-- Parameter
C_Order_ID NUMBER;
--
CURSOR Cur_Order IS
SELECT o.C_Order_ID, d.Name, o.DocumentNo, o.DocStatus, o.DocAction, o.Processed
FROM C_Order o, C_DocType d
WHERE o.C_Order_ID=C_Order_ID
AND o.C_DocType_ID=d.C_DocType_ID
ORDER BY o.DocumentNo DESC;
BEGIN
-- No locking or Updating
-- Get Parameters
ResultStr := 'ReadingParameters';
FOR p IN Cur_Parameter (PInstance_ID) LOOP
Record_ID := p.Record_ID;
IF (p.ParameterName = 'C_Order_ID') THEN
C_Order_ID := p.P_Number;
DBMS_OUTPUT.PUT_LINE(' C_Order_ID=' || C_Order_ID);
ELSE
DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
END IF;
END LOOP; -- Get Parameter
DBMS_OUTPUT.PUT_LINE(' Record_ID=' || Record_ID);
IF (C_Order_ID IS NULL) THEN
C_Order_ID := Record_ID;
END IF;
-- Should be nothing there
DELETE T_Spool
WHERE AD_PInstance_ID=PInstance_ID;
-- Order Info
FOR o IN Cur_Order LOOP
INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
o.Name || ' ' || o.DocumentNo || ': @DocStatus@=' || o.DocStatus
|| ', @DocAction@=' || o.DocAction || ', @Processed@=' || o.Processed);
-- Order Lines
DECLARE
CURSOR Cur_OrderLine IS
SELECT *
FROM C_OrderLine
WHERE C_Order_ID=o.C_Order_ID
ORDER BY Line;
BEGIN
FOR ol IN Cur_OrderLine LOOP
INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
' @QtyOrdered@=' || ol.QtyOrdered || ', @QtyReserved@=' || ol.QtyReserved
|| ', @QtyDelivered@=' || ol.QtyDelivered || ', @QtyInvoiced@=' || ol.QtyInvoiced
|| ' - Wh=' || ol.M_Warehouse_ID
|| ', Prd=' || ol.M_Product_ID);
END LOOP;
END;
-- Shipment
DECLARE
CURSOR Cur_InOut IS
SELECT s.M_InOut_ID, d.Name, s.DocumentNo, s.DocStatus, s.Processed, s.M_Warehouse_ID
FROM M_InOut s, C_DocType d
WHERE s.C_Order_ID = o.C_Order_ID
AND s.C_DocType_ID=d.C_DocType_ID;
BEGIN
FOR s IN Cur_InOut LOOP
INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
'> ' || s.Name || ' ' || s.DocumentNo || ': @DocStatus@=' || s.DocStatus
|| ', @Processed@=' || s.Processed || ', Wh=' || s.M_Warehouse_ID);
-- Shipment Lines
DECLARE
CURSOR Cur_InOutLine IS
SELECT *
FROM M_InOutLine
WHERE M_InOut_ID=s.M_InOut_ID
ORDER BY Line;
BEGIN
FOR sl IN Cur_InOutLine LOOP
INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
' @QtyDelivered@=' || sl.MovementQty || ', Prd=' || sl.M_Product_ID);
END LOOP;
END; -- Shipment Lines
END LOOP; -- Shipments
END; -- Shipment
-- Invoice
DECLARE
CURSOR Cur_Invoice IS
SELECT i.C_Invoice_ID, d.Name, i.DocumentNo, i.DocStatus, i.Processed
FROM C_Invoice i, C_DocType d
WHERE i.C_DocType_ID=d.C_DocType_ID
AND EXISTS (SELECT * FROM C_InvoiceLine l, C_OrderLine ol
WHERE i.C_Invoice_ID = l.C_Invoice_ID
AND l.C_OrderLine_ID = ol.C_OrderLine_ID
AND ol.C_Order_ID=o.C_Order_ID);
BEGIN
FOR i IN Cur_Invoice LOOP
INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
'> ' || i.Name || ' ' || i.DocumentNo || ': @DocStatus@=' || i.DocStatus
|| ', @Processed@=' || i.Processed);
-- Invoice Lines
DECLARE
CURSOR Cur_InvoiceLine IS
SELECT *
FROM C_InvoiceLine
WHERE C_Invoice_ID=i.C_Invoice_ID
ORDER BY Line;
BEGIN
FOR il IN Cur_InvoiceLine LOOP
INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
' @QtyInvoiced@=' || il.QtyInvoiced || ', Prd=' || il.M_Product_ID);
END LOOP;
END; -- Invoice Lines
END LOOP; -- Invoices
END; -- Invoice
END LOOP; -- Order
<<FINISH_PROCESS>>
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || Message);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 1, -- success
ErrorMsg = Message
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
ResultStr := ResultStr || ': ' || SQLERRM || ' - ' || Message;
DBMS_OUTPUT.PUT_LINE(ResultStr);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 0, -- failure
ErrorMsg = ResultStr
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
RETURN;
END C_Order_DrillDown;
/

View File

@ -1,56 +0,0 @@
IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'C_ProcessCreate')
BEGIN
PRINT '<<< DROPPING PROCEDURE C_ProcessCreate >>>'
DROP Procedure C_ProcessCreate
END
go
------------------------------------------------------------------------------
CREATE Procedure C_ProcessCreate
(
@AD_Table_ID Identifier,
@Record_ID Identifier,
@AD_IProcess_ID Identifier OUTPUT
)
--WITH ENCRYPTION
AS
/******************************************************************************
* Author: Jorg Janke (c) ClassApps 1999
* Version: $Header: /cvs/adempiere/db/database/Procedures/C_ProcessCreate.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
*
* Description:
* Create process for background execution
*
* Return values:
* Int_Process_ID
*
* Called by:
*
******************************************************************************/
BEGIN
Set NoCount ON
BEGIN TRANSACTION
SELECT @AD_IProcess_ID = ISNULL(MAX(AD_IProcess_ID), 0)+1
FROM AD_IProcess
---------------------------------
INSERT INTO AD_IProcess
(AD_IProcess_ID, AD_Table_ID, Record_ID, IsProcessing, Updated)
VALUES
(@AD_IProcess_ID, @AD_Table_ID, @Record_ID, 'N', null)
IF (@@ERROR <> 0)
BEGIN
RAISERROR 60001 'Int_Process insert error'
ROLLBACK TRAN
RETURN(1)
END
COMMIT TRANSACTION
END -- C_ProcessCreate
go
------------------------------------------------------------------------------
IF OBJECT_ID('C_ProcessCreate') IS NOT NULL
PRINT '<<< CREATED PROCEDURE C_ProcessCreate >>>'
ELSE
PRINT '<<< FAILED CREATING PROCEDURE C_ProcessCreate >>>'
go

View File

@ -1,21 +0,0 @@
CREATE OR REPLACE PROCEDURE Cleanup
/******************************************************************************
* ** Adempiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
* Open Source Software Provided "AS IS" without warranty or liability
* When you use any parts (changed or unchanged), add "Powered by Adempiere" to
* your product name; See license details http://www.adempiere.org/license.html
******************************************************************************
* Cleanup old temporary data
*/
AS
BEGIN
-- Processes
DELETE FROM AD_PInstance;
-- Search Info
DELETE FROM AD_Find;
-- Errors older than 1 week
DELETE AD_ERROR WHERE Created < SysDate-7;
--
COMMIT;
END Cleanup;
/

View File

@ -1,45 +0,0 @@
CREATE OR REPLACE PROCEDURE DBA_AfterImport
AS
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: DBA_AfterImport.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
* $Source: /cvs/adempiere/db/database/Procedures/DBA_AfterImport.sql,v $
***
* Title: Run after Import
* Description:
* - Set Java Permissions
* - Recompile
* - Compute Statistics
*****************************************************************************/
-- Statistics
CURSOR Cur_Stat IS
SELECT Table_Name, Blocks
FROM USER_TABLES
WHERE DURATION IS NULL -- No temporary tables
AND Table_Name NOT LIKE '%$%'
AND (LAST_ANALYZED IS NULL OR LAST_ANALYZED < SysDate-7);
--
v_Cmd VARCHAR2(256);
v_NoC NUMBER := 0;
--
BEGIN
-- Recompile
DBA_Recompile(NULL);
-- Statistics
FOR s IN Cur_Stat LOOP
v_Cmd := 'ANALYZE TABLE ' || s.Table_Name || ' COMPUTE STATISTICS';
-- DBMS_OUTPUT.PUT_LINE (v_Cmd);
v_NoC := v_NoC + 1;
EXECUTE IMMEDIATE v_Cmd;
END LOOP;
DBMS_OUTPUT.PUT_LINE ('Statistics computed: ' || v_NoC);
--
END DBA_AfterImport;
/

View File

@ -1,117 +0,0 @@
CREATE OR REPLACE PROCEDURE DBA_Cleanup
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: DBA_Cleanup.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Cleanup old temporary data
* Description:
************************************************************************/
AS
BEGIN
DBMS_OUTPUT.PUT_LINE('DBA_Cleanup');
-- Clean up data
/**
-- C_Invoice_CheckPaid();
UPDATE C_Payment_v
SET IsAllocated=CASE WHEN paymentAllocated(C_Payment_ID, C_Currency_ID)=PayAmt THEN 'Y' ELSE 'N' END
WHERE IsAllocated='N';
UPDATE C_Invoice_v1
SET IsPaid = CASE WHEN invoicePaid(C_Invoice_ID,C_Currency_ID,MultiplierAP)=GrandTotal THEN 'Y' ELSE 'N' END
WHERE IsPaid='N';
**/
-- Temporary Tables
DELETE FROM T_Aging;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_Aging=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_DistributionRunDetail;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_DistributionRunDetail=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_InventoryValue;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_InventoryValue=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_Replenish;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_Replenish=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_Report;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_Report=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_ReportStatement;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_ReportStatement=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_TrialBalance;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_TrialBalance=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_Selection;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_Selection=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_Selection2;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_Selection2=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_Spool;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_Spool=' || SQL%ROWCOUNT);
END IF;
-- Search Info
DELETE FROM AD_Find;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' AD_Find=' || SQL%ROWCOUNT);
END IF;
-- Processes older than a week
DELETE FROM AD_PInstance WHERE Created < SysDate-7;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' Old AD_PInstance=' || SQL%ROWCOUNT);
END IF;
/** Old Session (1 Week)
DELETE FROM AD_ChangeLog WHERE Created < SysDate-7;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' Old AD_ChangeLock=' || SQL%ROWCOUNT);
END IF;
DELETE FROM AD_Session WHERE Created < SysDate-7;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' Old AD_Session=' || SQL%ROWCOUNT);
END IF;
/** */
-- Errors older than 1 week
DELETE FROM AD_Error WHERE Created < SysDate-7;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' Old AD_Error=' || SQL%ROWCOUNT);
END IF;
-- Acknowledged Notes older than a day
DELETE FROM AD_Note WHERE Processed='Y' AND Updated < SysDate-1;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' Processed AD_Note=' || SQL%ROWCOUNT);
END IF;
--
COMMIT;
END DBA_Cleanup;
/

View File

@ -1,148 +0,0 @@
CREATE OR REPLACE PROCEDURE DBA_Recompile
(
p_PInstance_ID IN NUMBER -- DEFAULT NULL
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: DBA_Recompile.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Recompile all User_Objects
* Description:
************************************************************************/
AS
-- Logistice
v_Message VARCHAR2(2000) := ' ';
v_Result NUMBER := 1; -- 0=failure
--
v_Buffer VARCHAR2(2000);
v_Line VARCHAR(100);
v_PrintInfo CHAR(1) := 'N'; -- Diagnostic
--
CURSOR Cur_Invalids IS
SELECT object_id, object_name, object_type
FROM user_objects
WHERE status <> 'VALID'
AND object_type IN ('VIEW', 'PACKAGE', 'PACKAGE BODY', 'FUNCTION',
'PROCEDURE', 'TRIGGER', 'JAVA CLASS')
ORDER BY object_type, object_name;
CURSOR Cur_Valids (p_id NUMBER) IS
SELECT 'FOUND'
FROM user_objects
WHERE status = 'VALID'
AND object_id = p_id;
-- failed compile
TYPE invalid_tab IS TABLE OF Cur_Invalids%ROWTYPE INDEX BY BINARY_INTEGER;
invalid_tab_rec invalid_tab;
count_compiled PLS_INTEGER;
valid_text VARCHAR2(5);
exec_cursor PLS_INTEGER := DBMS_SQL.OPEN_CURSOR;
sql_statement VARCHAR2(200);
count_object PLS_INTEGER := 0;
BEGIN
LOOP
count_compiled := 0;
FOR ci IN Cur_Invalids LOOP
-- not unsuccessfuly compiled yet
IF NOT invalid_tab_rec.EXISTS(ci.object_id) THEN
IF (ci.object_type = 'JAVA CLASS') THEN
sql_statement := 'ALTER JAVA CLASS "' || ci.object_name || '" RESOLVE';
ELSIF (ci.object_type = 'PACKAGE BODY') THEN
sql_statement := 'ALTER PACKAGE ' || ci.object_name || ' COMPILE BODY';
ELSE
sql_statement := 'ALTER ' || ci.object_type || ' ' || ci.object_name || ' COMPILE';
END IF;
-- compile
BEGIN
count_object := count_object + 1;
DBMS_SQL.PARSE(exec_cursor, sql_statement, DBMS_SQL.NATIVE);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
--
OPEN Cur_Valids (ci.object_ID);
FETCH Cur_Valids INTO valid_text;
IF Cur_Valids%ROWCOUNT > 0 THEN
IF (v_PrintInfo = 'Y') THEN
DBMS_OUTPUT.PUT_LINE('OK: ' || ci.object_type || ' ' || ci.object_name);
END IF;
count_compiled := count_compiled + 1;
CLOSE Cur_Valids;
EXIT;
ELSE
IF (LENGTH(v_Message) < 1950) THEN
v_Message := v_Message || ci.object_name || ' ';
END IF;
IF (v_PrintInfo = 'Y') THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || ci.object_type || ' ' || ci.object_name);
END IF;
--
invalid_tab_rec(ci.object_id).object_name := ci.object_name;
invalid_tab_rec(ci.object_id).object_type := ci.object_type;
CLOSE Cur_Valids;
END IF;
END IF; -- not unsuccessfuly compiled yet
END LOOP; -- Cur_Invalids
-- any other to be compiled
IF count_compiled = 0 THEN
EXIT;
END IF;
END LOOP; -- outer loop
DBMS_SQL.CLOSE_CURSOR(exec_cursor);
--
-- Print Message
IF (LENGTH(v_Message) = 1) THEN
v_Message := 'All valid';
DBMS_OUTPUT.PUT_LINE(v_Message);
ELSIF (LENGTH(v_Message) > 80) THEN
v_Buffer := v_Message;
DBMS_OUTPUT.PUT_LINE('>');
WHILE (LENGTH(v_Buffer) > 0) LOOP
v_Line := SUBSTR(v_Buffer, 1, 80);
DBMS_OUTPUT.PUT_LINE(v_Line);
v_Buffer := SUBSTR(v_Buffer, 81);
END LOOP;
DBMS_OUTPUT.PUT_LINE('<');
v_Result := 0;
DBMS_OUTPUT.PUT_LINE('ERROR');
ELSE
DBMS_OUTPUT.PUT_LINE('>' || v_Message || '<');
v_Result := 0;
DBMS_OUTPUT.PUT_LINE('ERROR');
END IF;
<<FINISH_PROCESS>>
IF (p_PInstance_ID IS NOT NULL) THEN
-- Update AD_PInstance
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = v_Result, -- 1=success
ErrorMsg = v_Message
WHERE AD_PInstance_ID=p_PInstance_ID;
END IF;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
IF DBMS_SQL.IS_OPEN(exec_cursor) THEN
DBMS_SQL.CLOSE_CURSOR(exec_cursor);
END IF;
IF Cur_Valids%ISOPEN THEN
CLOSE Cur_Valids;
END IF;
END DBA_Recompile;
/

View File

@ -1,116 +0,0 @@
CREATE OR REPLACE PROCEDURE Fact_Acct_Balance_Update
(
p_DeleteFirst IN VARCHAR2 DEFAULT 'N'
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2003 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: Fact_Acct_Balance_Update.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Update ALL Balances
* Description:
* - Recreates all Balances
************************************************************************/
AS
BEGIN
IF (p_DeleteFirst = 'Y') THEN
DELETE Fact_Acct_Balance;
DBMS_OUTPUT.PUT_LINE(' Deletes=' || SQL%ROWCOUNT);
ELSE
/** Update **/
UPDATE Fact_Acct_Balance ab
SET (AmtAcctDr, AmtAcctCr, Qty) =
(SELECT COALESCE(SUM(AmtAcctDr),0), COALESCE(SUM(AmtAcctCr),0), COALESCE(SUM(Qty),0)
FROM Fact_Acct a
WHERE a.AD_Client_ID=ab.AD_Client_ID AND a.AD_Org_ID=ab.AD_Org_ID
AND a.C_AcctSchema_ID=ab.C_AcctSchema_ID AND TRUNC(a.DateAcct)=TRUNC(ab.DateAcct)
AND a.Account_ID=ab.Account_ID AND a.PostingType=ab.PostingType
AND COALESCE(a.M_Product_ID,0)=COALESCE(ab.M_Product_ID,0) AND COALESCE(a.C_BPartner_ID,0)=COALESCE(ab.C_BPartner_ID,0)
AND COALESCE(a.C_Project_ID,0)=COALESCE(ab.C_Project_ID,0) AND COALESCE(a.AD_OrgTrx_ID,0)=COALESCE(ab.AD_OrgTrx_ID,0)
AND COALESCE(a.C_SalesRegion_ID,0)=COALESCE(ab.C_SalesRegion_ID,0) AND COALESCE(a.C_Activity_ID,0)=COALESCE(ab.C_Activity_ID,0)
AND COALESCE(a.C_Campaign_ID,0)=COALESCE(ab.C_Campaign_ID,0) AND COALESCE(a.C_LocTo_ID,0)=COALESCE(ab.C_LocTo_ID,0) AND COALESCE(a.C_LocFrom_ID,0)=COALESCE(ab.C_LocFrom_ID,0)
AND COALESCE(a.User1_ID,0)=COALESCE(ab.User1_ID,0) AND COALESCE(a.User2_ID,0)=COALESCE(ab.User2_ID,0) AND COALESCE(a.GL_Budget_ID,0)=COALESCE(ab.GL_Budget_ID,0)
GROUP BY AD_Client_ID,AD_Org_ID,
C_AcctSchema_ID, TRUNC(DateAcct),
Account_ID, PostingType,
M_Product_ID, C_BPartner_ID,
C_Project_ID, AD_OrgTrx_ID,
C_SalesRegion_ID, C_Activity_ID,
C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID,
User1_ID, User2_ID, GL_Budget_ID)
WHERE EXISTS
(SELECT *
FROM Fact_Acct a
WHERE a.AD_Client_ID=ab.AD_Client_ID AND a.AD_Org_ID=ab.AD_Org_ID
AND a.C_AcctSchema_ID=ab.C_AcctSchema_ID AND TRUNC(a.DateAcct)=TRUNC(ab.DateAcct)
AND a.Account_ID=ab.Account_ID AND a.PostingType=ab.PostingType
AND COALESCE(a.M_Product_ID,0)=COALESCE(ab.M_Product_ID,0) AND COALESCE(a.C_BPartner_ID,0)=COALESCE(ab.C_BPartner_ID,0)
AND COALESCE(a.C_Project_ID,0)=COALESCE(ab.C_Project_ID,0) AND COALESCE(a.AD_OrgTrx_ID,0)=COALESCE(ab.AD_OrgTrx_ID,0)
AND COALESCE(a.C_SalesRegion_ID,0)=COALESCE(ab.C_SalesRegion_ID,0) AND COALESCE(a.C_Activity_ID,0)=COALESCE(ab.C_Activity_ID,0)
AND COALESCE(a.C_Campaign_ID,0)=COALESCE(ab.C_Campaign_ID,0) AND COALESCE(a.C_LocTo_ID,0)=COALESCE(ab.C_LocTo_ID,0) AND COALESCE(a.C_LocFrom_ID,0)=COALESCE(ab.C_LocFrom_ID,0)
AND COALESCE(a.User1_ID,0)=COALESCE(ab.User1_ID,0) AND COALESCE(a.User2_ID,0)=COALESCE(ab.User2_ID,0) AND COALESCE(a.GL_Budget_ID,0)=COALESCE(ab.GL_Budget_ID,0)
GROUP BY AD_Client_ID,AD_Org_ID,
C_AcctSchema_ID, TRUNC(DateAcct),
Account_ID, PostingType,
M_Product_ID, C_BPartner_ID,
C_Project_ID, AD_OrgTrx_ID,
C_SalesRegion_ID, C_Activity_ID,
C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID,
User1_ID, User2_ID, GL_Budget_ID);
DBMS_OUTPUT.PUT_LINE(' Updates=' || SQL%ROWCOUNT);
END IF;
/** Insert **/
INSERT INTO Fact_Acct_Balance ab
(AD_Client_ID, AD_Org_ID,
C_AcctSchema_ID, DateAcct,
Account_ID, PostingType,
M_Product_ID, C_BPartner_ID,
C_Project_ID, AD_OrgTrx_ID,
C_SalesRegion_ID,C_Activity_ID,
C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID,
User1_ID, User2_ID, GL_Budget_ID,
AmtAcctDr, AmtAcctCr, Qty)
--
SELECT AD_Client_ID, AD_Org_ID,
C_AcctSchema_ID, TRUNC(DateAcct),
Account_ID, PostingType,
M_Product_ID, C_BPartner_ID,
C_Project_ID, AD_OrgTrx_ID,
C_SalesRegion_ID,C_Activity_ID,
C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID,
User1_ID, User2_ID, GL_Budget_ID,
COALESCE(SUM(AmtAcctDr),0), COALESCE(SUM(AmtAcctCr),0), COALESCE(SUM(Qty),0)
FROM Fact_Acct a
WHERE NOT EXISTS
(SELECT *
FROM Fact_Acct_Balance x
WHERE a.AD_Client_ID=x.AD_Client_ID AND a.AD_Org_ID=x.AD_Org_ID
AND a.C_AcctSchema_ID=x.C_AcctSchema_ID AND TRUNC(a.DateAcct)=TRUNC(x.DateAcct)
AND a.Account_ID=x.Account_ID AND a.PostingType=x.PostingType
AND COALESCE(a.M_Product_ID,0)=COALESCE(x.M_Product_ID,0) AND COALESCE(a.C_BPartner_ID,0)=COALESCE(x.C_BPartner_ID,0)
AND COALESCE(a.C_Project_ID,0)=COALESCE(x.C_Project_ID,0) AND COALESCE(a.AD_OrgTrx_ID,0)=COALESCE(x.AD_OrgTrx_ID,0)
AND COALESCE(a.C_SalesRegion_ID,0)=COALESCE(x.C_SalesRegion_ID,0) AND COALESCE(a.C_Activity_ID,0)=COALESCE(x.C_Activity_ID,0)
AND COALESCE(a.C_Campaign_ID,0)=COALESCE(x.C_Campaign_ID,0) AND COALESCE(a.C_LocTo_ID,0)=COALESCE(x.C_LocTo_ID,0) AND COALESCE(a.C_LocFrom_ID,0)=COALESCE(x.C_LocFrom_ID,0)
AND COALESCE(a.User1_ID,0)=COALESCE(x.User1_ID,0) AND COALESCE(a.User2_ID,0)=COALESCE(x.User2_ID,0) AND COALESCE(a.GL_Budget_ID,0)=COALESCE(x.GL_Budget_ID,0) )
GROUP BY AD_Client_ID,AD_Org_ID,
C_AcctSchema_ID, TRUNC(DateAcct),
Account_ID, PostingType,
M_Product_ID, C_BPartner_ID,
C_Project_ID, AD_OrgTrx_ID,
C_SalesRegion_ID, C_Activity_ID,
C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID,
User1_ID, User2_ID, GL_Budget_ID;
DBMS_OUTPUT.PUT_LINE(' Inserts=' || SQL%ROWCOUNT);
-----------------------
COMMIT;
END Fact_Acct_Balance_Update;
/

View File

@ -1,374 +0,0 @@
CREATE OR REPLACE PROCEDURE M_PriceList_Create
(
PInstance_ID IN NUMBER
)
AS
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2003 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: M_PriceList_Create.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Create Pricelist
* Description:
* Create PriceList by copying purchase prices (M_Product_PO)
* and applying product category discounts (M_CategoryDiscount)
************************************************************************/
-- Logistice
ResultStr VARCHAR2(2000);
Message VARCHAR2(2000) := '';
NoRate EXCEPTION;
-- Parameter
CURSOR Cur_Parameter (PInstance NUMBER) IS
SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
FROM AD_PInstance i, AD_PInstance_Para p
WHERE i.AD_PInstance_ID=PInstance
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
ORDER BY p.SeqNo;
-- Parameter Variables
p_PriceList_Version_ID NUMBER;
p_DeleteOld CHAR(1) := 'N';
--
v_Currency_ID NUMBER;
v_Client_ID NUMBER;
v_Org_ID NUMBER;
v_UpdatedBy NUMBER;
v_StdPrecision NUMBER;
v_DiscountSchema_ID NUMBER;
v_PriceList_Version_Base_ID NUMBER;
--
v_NextNo NUMBER := 0;
-- Get PL Parameter
CURSOR Cur_DiscountLine (DiscountSchema_ID NUMBER) IS
SELECT *
FROM M_DiscountSchemaLine
WHERE M_DiscountSchema_ID=DiscountSchema_ID
AND IsActive='Y'
ORDER BY SeqNo;
BEGIN
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing');
ResultStr := 'PInstanceNotFound';
UPDATE AD_PInstance
SET Created = SysDate,
IsProcessing = 'Y'
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
-- Get Parameters
ResultStr := 'ReadingParameters';
FOR p IN Cur_Parameter (PInstance_ID) LOOP
p_PriceList_Version_ID := p.Record_ID;
IF (p.ParameterName = 'DeleteOld') THEN
p_DeleteOld := p.P_String;
DBMS_OUTPUT.PUT_LINE(' DeleteOld=' || p_DeleteOld);
ELSE
DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
END IF;
END LOOP; -- Get Parameter
DBMS_OUTPUT.PUT_LINE(' PriceList_Version_ID=' || p_PriceList_Version_ID);
-- Checking Prerequisites
-- -- PO Prices must exists
ResultStr := 'CorrectingProductPO';
DBMS_OUTPUT.PUT_LINE(ResultStr);
UPDATE M_Product_PO
SET PriceList = 0
WHERE PriceList IS NULL;
UPDATE M_Product_PO
SET PriceLastPO = 0
WHERE PriceLastPO IS NULL;
UPDATE M_Product_PO
SET PricePO = PriceLastPO
WHERE (PricePO IS NULL OR PricePO = 0) AND PriceLastPO <> 0;
UPDATE M_Product_PO
SET PricePO = 0
WHERE PricePO IS NULL;
-- Set default current vendor
UPDATE M_Product_PO p
SET IsCurrentVendor = 'Y'
WHERE IsCurrentVendor = 'N'
AND NOT EXISTS
(SELECT pp.M_Product_ID FROM M_Product_PO pp
WHERE pp.M_Product_ID=p.M_Product_ID
GROUP BY pp.M_Product_ID HAVING COUNT(*) > 1);
COMMIT;
/**
* Make sure that we have only one active product
*/
ResultStr := 'CorrectingDuplicates';
DBMS_OUTPUT.PUT_LINE(ResultStr);
DECLARE
-- All duplicate products
CURSOR Cur_Duplicates IS
SELECT DISTINCT M_Product_ID
FROM M_Product_PO po
WHERE IsCurrentVendor='Y' AND IsActive='Y'
AND EXISTS ( SELECT M_Product_ID FROM M_Product_PO x
WHERE x.M_Product_ID=po.M_Product_ID
GROUP BY M_Product_ID HAVING COUNT(*) > 1 )
ORDER BY 1;
-- All vendors of Product - expensive first
CURSOR Cur_Vendors (Product_ID NUMBER) IS
SELECT M_Product_ID, C_BPartner_ID
FROM M_Product_PO
WHERE IsCurrentVendor='Y' AND IsActive='Y'
AND M_Product_ID=Product_ID
ORDER BY PriceList DESC;
--
Product_ID NUMBER;
BPartner_ID NUMBER;
BEGIN
FOR dupl IN Cur_Duplicates LOOP
OPEN Cur_Vendors (dupl.M_Product_ID);
FETCH Cur_Vendors INTO Product_ID, BPartner_ID; -- Leave First
LOOP
FETCH Cur_Vendors INTO Product_ID, BPartner_ID; -- Get Record ID
EXIT WHEN Cur_Vendors%NOTFOUND;
--
DBMS_OUTPUT.PUT_LINE(' Record: ' || Product_ID || ' / ' || BPartner_ID);
UPDATE M_Product_PO
SET IsCurrentVendor='N'
WHERE M_Product_ID=Product_ID AND C_BPartner_ID=BPartner_ID;
END LOOP;
CLOSE Cur_Vendors;
END LOOP;
COMMIT;
END;
/** Delete Old Data */
ResultStr := 'DeletingOld';
IF (p_DeleteOld = 'Y') THEN
DELETE M_ProductPrice
WHERE M_PriceList_Version_ID = p_PriceList_Version_ID;
Message := '@Deleted@=' || SQL%ROWCOUNT || ' - ';
DBMS_OUTPUT.PUT_LINE(Message);
END IF;
-- Get PriceList Info
ResultStr := 'GetPLInfo';
DBMS_OUTPUT.PUT_LINE(ResultStr);
SELECT p.C_Currency_ID, c.StdPrecision,
v.AD_Client_ID, v.AD_Org_ID, v.UpdatedBy,
v.M_DiscountSchema_ID, M_PriceList_Version_Base_ID
INTO v_Currency_ID, v_StdPrecision,
v_Client_ID, v_Org_ID, v_UpdatedBy,
v_DiscountSchema_ID, v_PriceList_Version_Base_ID
FROM M_PriceList p, M_PriceList_Version v, C_Currency c
WHERE p.M_PriceList_ID=v.M_PriceList_ID
AND p.C_Currency_ID=c.C_Currency_ID
AND v.M_PriceList_Version_ID=p_PriceList_Version_ID;
/**
* For All Discount Lines in Sequence
*/
FOR dl IN Cur_DiscountLine (v_DiscountSchema_ID) LOOP
ResultStr := 'Parameter Seq=' || dl.SeqNo;
-- DBMS_OUTPUT.PUT_LINE(ResultStr);
-- Clear Temporary Table
DELETE FROM T_Selection;
-- -----------------------------------
-- Create Selection in temporary table
-- -----------------------------------
IF (v_PriceList_Version_Base_ID IS NULL) THEN
-- Create Selection from M_Product_PO
INSERT INTO T_Selection (T_Selection_ID)
SELECT DISTINCT po.M_Product_ID
FROM M_Product p, M_Product_PO po
WHERE p.M_Product_ID=po.M_Product_ID
AND (p.AD_Client_ID=v_Client_ID OR p.AD_Client_ID=0)
AND p.IsActive='Y' AND po.IsActive='Y' AND po.IsCurrentVendor='Y'
-- Optional Restrictions
AND (dl.M_Product_Category_ID IS NULL OR p.M_Product_Category_ID=dl.M_Product_Category_ID)
AND (dl.C_BPartner_ID IS NULL OR po.C_BPartner_ID=dl.C_BPartner_ID)
AND (dl.M_Product_ID IS NULL OR p.M_Product_ID=dl.M_Product_ID);
ELSE
-- Create Selection from existing PriceList
INSERT INTO T_Selection (T_Selection_ID)
SELECT DISTINCT p.M_Product_ID
FROM M_Product p, M_ProductPrice pp
WHERE p.M_Product_ID=pp.M_Product_ID
AND pp.M_PriceList_Version_ID=v_PriceList_Version_Base_ID
AND p.IsActive='Y' AND pp.IsActive='Y'
-- Optional Restrictions
AND (dl.M_Product_Category_ID IS NULL OR p.M_Product_Category_ID=dl.M_Product_Category_ID)
AND (dl.C_BPartner_ID IS NULL OR EXISTS
(SELECT * FROM M_Product_PO po WHERE po.M_Product_ID=p.M_Product_ID AND po.C_BPartner_ID=dl.C_BPartner_ID))
AND (dl.M_Product_ID IS NULL OR p.M_Product_ID=dl.M_Product_ID);
END IF;
Message := Message || '@Selected@=' || SQL%ROWCOUNT;
-- DBMS_OUTPUT.PUT_LINE(Message);
-- Delete Prices in Selection, so that we can insert
IF (v_PriceList_Version_Base_ID IS NULL
OR v_PriceList_Version_Base_ID <> p_PriceList_Version_ID) THEN
ResultStr := ResultStr || ', Delete';
DELETE M_ProductPrice pp
WHERE pp.M_PriceList_Version_ID = p_PriceList_Version_ID
AND EXISTS (SELECT * FROM T_Selection s WHERE pp.M_Product_ID=s.T_Selection_ID);
Message := ', @Deleted@=' || SQL%ROWCOUNT;
END IF;
-- --------------------
-- Copy (Insert) Prices
-- --------------------
IF (v_PriceList_Version_Base_ID = p_PriceList_Version_ID) THEN
-- We have Prices already
NULL;
ELSIF (v_PriceList_Version_Base_ID IS NULL) THEN
-- Copy and Convert from Product_PO
ResultStr := ResultStr || ',Copy_PO';
INSERT INTO M_ProductPrice
(M_PriceList_Version_ID, M_Product_ID,
AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
PriceList, PriceStd, PriceLimit)
SELECT
p_PriceList_Version_ID, po.M_Product_ID,
v_Client_ID, v_Org_ID, 'Y', SysDate, v_UpdatedBy, SysDate, v_UpdatedBy,
-- Price List
COALESCE(currencyConvert(po.PriceList,
po.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0),
-- Price Std
COALESCE(currencyConvert(po.PriceList,
po.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0),
-- Price Limit
COALESCE(currencyConvert(po.PricePO,
po.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0)
FROM M_Product_PO po
WHERE EXISTS (SELECT * FROM T_Selection s WHERE po.M_Product_ID=s.T_Selection_ID)
AND po.IsCurrentVendor='Y' AND po.IsActive='Y';
ELSE
-- Copy and Convert from other PriceList_Version
ResultStr := ResultStr || ',Copy_PL';
INSERT INTO M_ProductPrice
(M_PriceList_Version_ID, M_Product_ID,
AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
PriceList, PriceStd, PriceLimit)
SELECT
p_PriceList_Version_ID, pp.M_Product_ID,
v_Client_ID, v_Org_ID, 'Y', SysDate, v_UpdatedBy, SysDate, v_UpdatedBy,
-- Price List
COALESCE(currencyConvert(pp.PriceList,
pl.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0),
-- Price Std
COALESCE(currencyConvert(pp.PriceStd,
pl.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0),
-- Price Limit
COALESCE(currencyConvert(pp.PriceLimit,
pl.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0)
FROM M_ProductPrice pp
INNER JOIN M_PriceList_Version plv ON (pp.M_PriceList_Version_ID=plv.M_PriceList_Version_ID)
INNER JOIN M_PriceList pl ON (plv.M_PriceList_ID=pl.M_PriceList_ID)
WHERE pp.M_PriceList_Version_ID=v_PriceList_Version_Base_ID
AND EXISTS (SELECT * FROM T_Selection s WHERE pp.M_Product_ID=s.T_Selection_ID)
AND pp.IsActive='Y';
END IF;
Message := Message || ', @Inserted@=' || SQL%ROWCOUNT;
-- -----------
-- Calculation
-- -----------
ResultStr := ResultStr || ',Calc';
UPDATE M_ProductPrice p
SET PriceList = (DECODE(dl.List_Base, 'S', PriceStd, 'X', PriceLimit, PriceList)
+ dl.List_AddAmt) * (1 - dl.List_Discount/100),
PriceStd = (DECODE(dl.Std_Base, 'L', PriceList, 'X', PriceLimit, PriceStd)
+ dl.Std_AddAmt) * (1 - dl.Std_Discount/100),
PriceLimit = (DECODE(dl.Limit_Base, 'L', PriceList, 'S', PriceStd, PriceLimit)
+ dl.Limit_AddAmt) * (1 - dl.Limit_Discount/100)
WHERE M_PriceList_Version_ID=p_PriceList_Version_ID
AND EXISTS (SELECT * FROM T_Selection s
WHERE s.T_Selection_ID=p.M_Product_ID);
-- --------
-- Rounding (AD_Reference_ID=155)
-- --------
ResultStr := ResultStr || ',Round';
UPDATE M_ProductPrice p
SET PriceList = DECODE(dl.List_Rounding,
'N', PriceList,
'0', ROUND(PriceList, 0), -- Even .00
'D', ROUND(PriceList, 1), -- Dime .10
'T', ROUND(PriceList, -1), -- Ten 10.00
'5', ROUND(PriceList*20,0)/20, -- Nickle .05
'Q', ROUND(PriceList*4,0)/4, -- Quarter .25
ROUND(PriceList, v_StdPrecision)),-- Currency
PriceStd = DECODE(dl.Std_Rounding,
'N', PriceStd,
'0', ROUND(PriceStd, 0), -- Even .00
'D', ROUND(PriceStd, 1), -- Dime .10
'T', ROUND(PriceStd, -1), -- Ten 10.00
'5', ROUND(PriceStd*20,0)/20, -- Nickle .05
'Q', ROUND(PriceStd*4,0)/4, -- Quarter .25
ROUND(PriceStd, v_StdPrecision)), -- Currency
PriceLimit = DECODE(dl.Limit_Rounding,
'N', PriceLimit,
'0', ROUND(PriceLimit, 0), -- Even .00
'D', ROUND(PriceLimit, 1), -- Dime .10
'T', ROUND(PriceLimit, -1), -- Ten 10.00
'5', ROUND(PriceLimit*20,0)/20, -- Nickle .05
'Q', ROUND(PriceLimit*4,0)/4, -- Quarter .25
ROUND(PriceLimit, v_StdPrecision))-- Currency
WHERE M_PriceList_Version_ID=p_PriceList_Version_ID
AND EXISTS (SELECT * FROM T_Selection s
WHERE s.T_Selection_ID=p.M_Product_ID);
Message := Message || ', @Updated@=' || SQL%ROWCOUNT;
-- Fixed Price overwrite
ResultStr := ResultStr || ',Fix';
UPDATE M_ProductPrice p
SET PriceList = DECODE(dl.List_Base, 'F', dl.List_Fixed, PriceList),
PriceStd = DECODE(dl.Std_Base, 'F', dl.Std_Fixed, PriceStd),
PriceLimit = DECODE(dl.Limit_Base, 'F', dl.Limit_Fixed, PriceLimit)
WHERE M_PriceList_Version_ID=p_PriceList_Version_ID
AND EXISTS (SELECT * FROM T_Selection s
WHERE s.T_Selection_ID=p.M_Product_ID);
-- Log Info
INSERT INTO AD_PInstance_Log (AD_PInstance_ID, Log_ID, P_ID, P_NUMBER, P_MSG)
VALUES (PInstance_ID, v_NextNo, null, dl.SeqNo, Message);
--
v_NextNo := v_NextNo + 1;
Message := '';
END LOOP; -- For all DiscountLines
-- Delete Temporary Selection
DELETE FROM T_Selection;
<<FINISH_PROCESS>>
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE(Message);
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished');
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 1, -- success
ErrorMsg = Message
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
ResultStr := ResultStr || ':' || SQLERRM || ' ' || Message;
DBMS_OUTPUT.PUT_LINE(ResultStr);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 0, -- failure
ErrorMsg = ResultStr
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
RETURN;
END M_PriceList_Create;
/

View File

@ -1,147 +0,0 @@
CREATE OR REPLACE PROCEDURE M_Product_BOM_Check
(
PInstance_ID IN NUMBER
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: M_Product_BOM_Check.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Check BOM Structure (free of cycles)
* Description:
* Tree cannot contain BOMs which are already referenced
************************************************************************/
AS
-- Logistice
ResultStr VARCHAR2(2000);
Message VARCHAR2(2000);
Record_ID NUMBER;
-- Parameter
CURSOR Cur_Parameter (PInstance NUMBER) IS
SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
FROM AD_PInstance i, AD_PInstance_Para p
WHERE i.AD_PInstance_ID=PInstance
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
ORDER BY p.SeqNo;
-- Variables
Verified CHAR(1) := 'Y';
IsBOM CHAR(1);
CountNo NUMBER;
BEGIN
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || PInstance_ID);
ResultStr := 'PInstanceNotFound';
UPDATE AD_PInstance
SET Created = SysDate,
IsProcessing = 'Y'
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
-- Get Parameters
ResultStr := 'ReadingParameters';
FOR p IN Cur_Parameter (PInstance_ID) LOOP
Record_ID := p.Record_ID;
END LOOP; -- Get Parameter
DBMS_OUTPUT.PUT_LINE(' Record_ID=' || Record_ID);
-- Record ID is M_Product_ID of product to be tested
SELECT IsBOM
INTO IsBOM
FROM M_Product
WHERE M_Product_ID=Record_ID;
-- No BOM - should not happen, but no problem
IF (IsBOM = 'N') THEN
GOTO FINISH_PROCESS;
-- Did not find product
ELSIF (IsBOM <> 'Y') THEN
RETURN;
END IF;
-- Checking BOM Structure
ResultStr := 'InsertingRoot';
-- Table to put all BOMs - duplicate will cause exception
DELETE FROM T_Selection2 WHERE Query_ID = 0;
INSERT INTO T_Selection2 (Query_ID, T_Selection_ID) VALUES (0, Record_ID);
-- Table of root modes
DELETE FROM T_Selection;
INSERT INTO T_Selection (T_Selection_ID) VALUES (Record_ID);
LOOP
-- How many do we have?
SELECT COUNT(*)
INTO CountNo
FROM T_Selection;
-- Nothing to do
EXIT WHEN (CountNo = 0);
-- Insert BOM Nodes into "All" table
INSERT INTO T_Selection2 (Query_ID, T_Selection_ID)
SELECT 0, p.M_Product_ID
FROM M_Product p
WHERE IsBOM='Y'
AND EXISTS (SELECT * FROM M_Product_BOM b WHERE p.M_Product_ID=b.M_ProductBOM_ID
AND b.M_Product_ID IN (SELECT T_Selection_ID FROM T_Selection));
-- Insert BOM Nodes into temporary table
DELETE FROM T_Selection2 WHERE Query_ID = 1;
INSERT INTO T_Selection2 (Query_ID, T_Selection_ID)
SELECT 1, p.M_Product_ID
FROM M_Product p
WHERE IsBOM='Y'
AND EXISTS (SELECT * FROM M_Product_BOM b WHERE p.M_Product_ID=b.M_ProductBOM_ID
AND b.M_Product_ID IN (SELECT T_Selection_ID FROM T_Selection));
-- Copy into root table
DELETE FROM T_Selection;
INSERT INTO T_Selection (T_Selection_ID)
SELECT T_Selection_ID
FROM T_Selection2
WHERE Query_ID = 1;
END LOOP;
<<FINISH_PROCESS>>
-- OK
Message := 'OK';
UPDATE M_Product
SET IsVerified = 'Y'
WHERE M_Product_ID=Record_ID;
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || Message);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 1, -- success
ErrorMsg = Message
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
ResultStr := ResultStr || ': ' || SQLERRM || ' - ' || Message;
DBMS_OUTPUT.PUT_LINE(ResultStr);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 0, -- failure
ErrorMsg = ResultStr
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
--
UPDATE M_Product
SET IsVerified = 'N'
WHERE M_Product_ID=Record_ID;
COMMIT;
--
RETURN;
END M_Product_BOM_Check;
/

View File

@ -1,37 +0,0 @@
CREATE OR REPLACE PROCEDURE M_Product_Delete
(
whereClause IN VARCHAR2 DEFAULT NULL
)
AS
/******************************************************************************
* ** Adempiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
* Open Source Software Provided "AS IS" without warranty or liability
* When you use any parts (changed or unchanged), add "Powered by Adempiere" to
* your product name; See license details http://www.adempiere.org/license.html
******************************************************************************
* Delete Products
*/
CURSOR CUR_DEL IS
SELECT M_Product_ID, Value, Name
FROM M_Product
WHERE IsActive='N';
--
SQL_Base VARCHAR2(255) := 'SELECT M_Product_ID FROM M_Product WHERE ';
-- SQL_Where VARCHAR2(255) := 'ValueX IN (SELECT ValueX FROM M_Product GROUP BY ValueX HAVING Count(*) <> 1) AND INSTR(Value,''@'') <> 0';
SQL_Statement VARCHAR2(255);
BEGIN
-- Delete inactive
IF (whereClause IS NULL OR LENGTH(whereClause) = 0) THEN
For d IN CUR_DEL LOOP
BEGIN
DBMS_OUTPUT.PUT('Deleting ' || d.Name || ' - ');
DELETE M_Product
WHERE M_Product_ID=d.M_Product_ID;
DBMS_OUTPUT.PUT_LINE('OK');
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error ' || SQLERRM);
END;
END LOOP;
END IF;
END M_Product_Delete;
/

View File

@ -1,298 +0,0 @@
CREATE OR REPLACE PROCEDURE M_Production_Run
(
PInstance_ID IN NUMBER
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: M_Production_Run.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Production of BOMs
* Description:
* 1) Creating ProductionLines when IsCreated = 'N'
* 2) Posting the Lines (optionally only when fully stocked)
************************************************************************/
AS
-- Logistice
ResultStr VARCHAR2(2000);
Message VARCHAR2(2000);
Record_ID NUMBER;
-- Parameter
CURSOR Cur_Parameter (PInstance NUMBER) IS
SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
FROM AD_PInstance i, AD_PInstance_Para p
WHERE i.AD_PInstance_ID=PInstance
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
ORDER BY p.SeqNo;
-- Parameter Variables
MustBeStocked CHAR(1);
IsCreated CHAR(1);
Processed CHAR(1);
Client_ID NUMBER;
Org_ID NUMBER;
--
Line NUMBER;
NextNo NUMBER;
CountNo NUMBER;
-- ProductionPlan
CURSOR CUR_PP IS
SELECT *
FROM M_ProductionPlan
WHERE M_Production_ID=Record_ID
ORDER BY Line, M_Product_ID;
-- BOM Lines
CURSOR CUR_BOM (Product_ID NUMBER) IS
SELECT *
FROM M_Product_BOM
WHERE M_Product_ID=Product_ID
ORDER BY Line;
-- ProductionLines which are non-stocked BOMs (need to be resolved)
CURSOR CUR_PLineBOM (ProductionPlan_ID NUMBER) IS
SELECT pl.M_ProductionLine_ID, pl.Line, pl.M_Product_ID, pl.MovementQty
FROM M_ProductionLine pl, M_Product p
WHERE pl.M_ProductionPlan_ID=ProductionPlan_ID
AND pl.M_Product_ID=p.M_Product_ID
AND pl.Line<>100 -- Origin Line
AND p.IsBOM='Y' AND p.IsStocked='N';
-- Posting
CURSOR CUR_PL_Post IS
SELECT pl.M_ProductionLine_ID, pl.AD_Client_ID, pl.AD_Org_ID, p.MovementDate,
pl.M_Product_ID, pl.M_AttributeSetInstance_ID, pl.MovementQty, pl.M_Locator_ID
FROM M_Production p, M_ProductionLine pl, M_ProductionPlan pp
WHERE p.M_Production_ID=pp.M_Production_ID
AND pp.M_ProductionPlan_ID=pl.M_ProductionPlan_ID
AND pp.M_Production_ID=Record_ID
ORDER BY pp.Line, pl.Line;
BEGIN
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || PInstance_ID);
ResultStr := 'PInstanceNotFound';
UPDATE AD_PInstance
SET Created = SysDate,
IsProcessing = 'Y'
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
-- Get Parameters
ResultStr := 'ReadingParameters';
FOR p IN Cur_Parameter (PInstance_ID) LOOP
Record_ID := p.Record_ID;
IF (p.ParameterName = 'MustBeStocked') THEN
MustBeStocked := p.P_String;
DBMS_OUTPUT.PUT_LINE(' MustBeStocked=' || MustBeStocked);
ELSE
DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
END IF;
END LOOP; -- Get Parameter
DBMS_OUTPUT.PUT_LINE(' Record_ID=' || Record_ID);
-- Processing??? Lock ????
-- TODO
/**
* Get Info + Lock
*/
ResultStr := 'ReadingRecord';
SELECT IsCreated, Processed, AD_Client_ID, AD_Org_ID
INTO IsCreated, Processed, Client_ID, Org_ID
FROM M_Production
WHERE M_Production_ID=Record_ID
FOR UPDATE;
/**
* No Action
*/
IF (Processed <> 'N') THEN
Message := '@AlreadyPosted@';
GOTO FINISH_PROCESS;
END IF;
/**************************************************************************
* Create Lines
*/
IF (IsCreated <> 'Y') THEN
-- For every Production Plan
FOR pp IN CUR_PP LOOP
-- Delete prior lines
DELETE M_ProductionLine
WHERE M_ProductionPlan_ID=pp.M_ProductionPlan_ID;
-- DBMS_OUTPUT.PUT_LINE('ProductionPlan=' || pp.M_ProductionPlan_ID);
-- Create BOM Line
ResultStr := 'CreatingLine BOM';
Line := 100; -- OriginLine
AD_Sequence_Next('M_ProductionLine', pp.AD_Client_ID, NextNo);
INSERT INTO M_ProductionLine
(M_ProductionLine_ID, M_ProductionPlan_ID, Line,
AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,
M_Product_ID, MovementQty, M_Locator_ID, Description)
VALUES
(NextNo, pp.M_ProductionPlan_ID, Line,
pp.AD_Client_ID,pp.AD_Org_ID,'Y',SysDate,0,SysDate,0,
pp.M_Product_ID, pp.ProductionQty, pp.M_Locator_ID, pp.Description);
-- Create First Level
FOR bom IN CUR_BOM (pp.M_Product_ID) LOOP
ResultStr := 'CreatingLine Products';
Line := Line + 100;
AD_Sequence_Next('M_ProductionLine', pp.AD_Client_ID, NextNo);
INSERT INTO M_ProductionLine
(M_ProductionLine_ID, M_ProductionPlan_ID, Line,
AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,
M_Product_ID, MovementQty, M_Locator_ID)
VALUES
(NextNo, pp.M_ProductionPlan_ID, Line,
pp.AD_Client_ID,pp.AD_Org_ID,'Y',SysDate,0,SysDate,0,
bom.M_ProductBOM_ID, -pp.ProductionQty*bom.BOMQty, pp.M_Locator_ID);
END LOOP;
-- While we have BOMs
LOOP
-- Are there non-stored BOMs to list details?
ResultStr := 'CreatingLine CheckBOM';
SELECT COUNT(*) INTO CountNo
FROM M_ProductionLine pl, M_Product p
WHERE pl.M_Product_ID=p.M_Product_ID
AND pl.M_ProductionPlan_ID=pp.M_ProductionPlan_ID
AND pl.Line<>100 -- Origin Line
AND p.IsBOM='Y' AND p.IsStocked='N';
-- Nothing to do
EXIT WHEN (CountNo = 0);
--
-- Resolve BOMs in ProductLine which are not stocked
FOR pl IN CUR_PLineBOM (pp.M_ProductionPlan_ID) LOOP
ResultStr := 'CreatingLineBOM Resolution';
Line := pl.Line;
-- Resolve BOM Line in product line
FOR bom IN CUR_BOM (pl.M_Product_ID) LOOP
ResultStr := 'CreatingLine Products2';
Line := Line + 10;
AD_Sequence_Next('M_ProductionLine', pp.AD_Client_ID, NextNo);
INSERT INTO M_ProductionLine
(M_ProductionLine_ID, M_ProductionPlan_ID, Line,
AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,
M_Product_ID, MovementQty, M_Locator_ID)
VALUES
(NextNo, pp.M_ProductionPlan_ID, Line,
pp.AD_Client_ID,pp.AD_Org_ID,'Y',SysDate,0,SysDate,0,
bom.M_ProductBOM_ID, pl.MovementQty*bom.BOMQty, pp.M_Locator_ID);
END LOOP;
-- Delete BOM line
DELETE M_ProductionLine
WHERE M_ProductionLine_ID=pl.M_ProductionLine_ID;
END LOOP;
END LOOP; -- While we have BOMs
END LOOP; -- For every Production Plan
-- Modifying locator to have sufficient stock
-- Indicate that it is Created
UPDATE M_Production
SET IsCreated='Y'
WHERE M_Production_ID=Record_ID;
/**************************************************************************
* Post Lines
*/
ELSE
-- All Production Lines
FOR pl IN CUR_PL_Post LOOP
-- M_ProductionLine_ID, AD_Client_ID, AD_Org_ID, MovementDate, M_Product_ID, MovementQty, M_Locator_ID
-- DBMS_OUTPUT.PUT_LINE('ProductionLine=' || pl.M_ProductionLine_ID);
-- DBMS_OUTPUT.PUT_LINE(' Qty=' || pl.MovementQty || ', OnHand=' || BOM_Qty_OnHand(pl.M_Product_ID, NULL, pl.M_Locator_ID));
-- Check Stock levels for reductions
IF (pl.MovementQty < 0 AND MustBeStocked <> 'N'
AND bomQtyOnHand(pl.M_Product_ID, NULL, pl.M_Locator_ID)+pl.MovementQty < 0) THEN
ROLLBACK;
SELECT '@NotEnoughStocked@: ' || Name INTO Message
FROM M_Product WHERE M_Product_ID=pl.M_Product_ID;
GOTO FINISH_PROCESS;
END IF;
-- Adjust Quantity at Location
UPDATE M_Storage
SET QtyOnHand = QtyOnHand + pl.MovementQty,
Updated = SysDate
WHERE M_Locator_ID = pl.M_Locator_ID
AND M_AttributeSetInstance_ID = COALESCE(pl.M_AttributeSetInstance_ID,0)
AND M_Product_ID = pl.M_Product_ID;
-- Product not on Stock yet
IF (SQL%ROWCOUNT = 0) THEN
INSERT INTO M_Storage
(M_Product_ID, M_Locator_ID, M_AttributeSetInstance_ID,
AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
QtyOnHand, QtyReserved, QtyOrdered)
VALUES
(pl.M_Product_ID, pl.M_Locator_ID, COALESCE(pl.M_AttributeSetInstance_ID,0),
pl.AD_Client_ID, pl.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,
pl.MovementQty, 0, 0);
END IF;
-- Create Transaction Entry
ResultStr := 'CreateTransaction';
AD_Sequence_Next('M_Transaction', pl.AD_Org_ID, NextNo);
INSERT INTO M_Transaction
(M_Transaction_ID, M_ProductionLine_ID,
AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
MovementType, M_Locator_ID, M_Product_ID, M_AttributeSetInstance_ID,
MovementDate, MovementQty)
VALUES
(NextNo, pl.M_ProductionLine_ID,
pl.AD_Client_ID, pl.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,
'P+', pl.M_Locator_ID, pl.M_Product_ID, COALESCE(pl.M_AttributeSetInstance_ID,0), -- not distinguishing between assemby/disassembly
pl.MovementDate, pl.MovementQty);
--
UPDATE M_ProductionLine
SET Processed='Y'
WHERE M_ProductionLine_ID=pl.M_ProductionLine_ID;
END LOOP;
-- Indicate that we are done
UPDATE M_Production
SET Processed='Y'
WHERE M_Production_ID=Record_ID;
UPDATE M_ProductionPlan
SET Processed='Y'
WHERE M_Production_ID=Record_ID;
END IF;
-- Only commit when entire job successful
COMMIT;
<<FINISH_PROCESS>>
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || Message);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 1, -- success
ErrorMsg = Message
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
ResultStr := ResultStr || ': ' || SQLERRM || ' - ' || Message;
DBMS_OUTPUT.PUT_LINE(ResultStr);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 0, -- failure
ErrorMsg = ResultStr
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
RETURN;
END M_Production_Run;
/

View File

@ -1,198 +0,0 @@
CREATE OR REPLACE PROCEDURE T_InventoryValue_Create
(
p_PInstance_ID IN NUMBER
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: T_InventoryValue_Create.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Inventory Valuation Temporary Table
* Description:
************************************************************************/
AS
-- Logistice
v_ResultStr VARCHAR2(2000);
v_Message VARCHAR2(2000);
v_Result NUMBER := 1; -- 0=failure
v_Record_ID NUMBER;
v_AD_User_ID NUMBER;
-- Parameter
CURSOR Cur_Parameter (pp_PInstance NUMBER) IS
SELECT i.Record_ID, i.AD_User_ID,
p.ParameterName, p.P_String, p.P_Number, p.P_Date
FROM AD_PInstance i, AD_PInstance_Para p
WHERE i.AD_PInstance_ID=pp_PInstance
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
ORDER BY p.SeqNo;
-- Parameter Variables
p_M_PriceList_Version_ID NUMBER(10);
p_DateValue DATE;
p_M_Warehouse_ID NUMBER(10);
p_C_Currency_ID NUMBER(10);
BEGIN
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_PInstance_ID);
v_ResultStr := 'PInstanceNotFound';
UPDATE AD_PInstance
SET Created = SysDate,
IsProcessing = 'Y'
WHERE AD_PInstance_ID=p_PInstance_ID;
COMMIT;
-- Get Parameters
v_ResultStr := 'ReadingParameters';
FOR p IN Cur_Parameter (p_PInstance_ID) LOOP
v_Record_ID := p.Record_ID;
v_AD_User_ID := p.AD_User_ID;
IF (p.ParameterName = 'M_PriceList_Version_ID') THEN
p_M_PriceList_Version_ID := p.P_Number;
DBMS_OUTPUT.PUT_LINE(' M_PriceList_Version_ID=' || p_M_PriceList_Version_ID);
ELSIF (p.ParameterName = 'DateValue') THEN
p_DateValue := p.P_Date;
DBMS_OUTPUT.PUT_LINE(' DateValue=' || p_DateValue);
ELSIF (p.ParameterName = 'M_Warehouse_ID') THEN
p_M_Warehouse_ID := p.P_Number;
DBMS_OUTPUT.PUT_LINE(' M_Warehouse_ID=' || p_M_Warehouse_ID);
ELSIF (p.ParameterName = 'C_Currency_ID') THEN
p_C_Currency_ID := p.P_Number;
DBMS_OUTPUT.PUT_LINE(' C_Currency_ID=' || p_C_Currency_ID);
ELSE
DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
END IF;
END LOOP; -- Get Parameter
DBMS_OUTPUT.PUT_LINE(' Record_ID=' || v_Record_ID);
-- Clear
-- v_ResultStr := 'ClearTable';
-- DELETE T_InventoryValue WHERE M_Warehouse_ID=p_M_Warehouse_ID;
-- COMMIT;
-- Insert Products
v_ResultStr := 'InsertStockedProducts';
INSERT INTO T_InventoryValue
(AD_Client_ID,AD_Org_ID, AD_PInstance_ID, M_Warehouse_ID,M_Product_ID)
SELECT AD_Client_ID,AD_Org_ID, p_PInstance_ID, p_M_Warehouse_ID,M_Product_ID
FROM M_Product
WHERE IsStocked='Y';
--
IF (SQL%ROWCOUNT = 0) THEN
v_Message := '@Created@ = 0';
GOTO FINISH_PROCESS;
END IF;
-- Update Constants
v_ResultStr := 'UpdateConstants';
UPDATE T_InventoryValue
SET DateValue = TRUNC(p_DateValue) + 0.9993,
M_PriceList_Version_ID = p_M_PriceList_Version_ID,
C_Currency_ID = p_C_Currency_ID
WHERE M_Warehouse_ID = p_M_Warehouse_ID;
-- Get current QtyOnHand
v_ResultStr := 'GetQtyOnHand';
UPDATE T_InventoryValue iv
SET QtyOnHand = (SELECT SUM(QtyOnHand) FROM M_Storage s, M_Locator l
WHERE iv.M_Product_ID=s.M_Product_ID
AND l.M_Locator_ID=s.M_Locator_ID
AND l.M_Warehouse_ID=iv.M_Warehouse_ID)
WHERE iv.M_Warehouse_ID = p_M_Warehouse_ID;
-- Adjust for Valuation Date
v_ResultStr := 'AdjustQtyOnHand';
UPDATE T_InventoryValue iv
SET QtyOnHand =
(SELECT iv.QtyOnHand - NVL(SUM(t.MovementQty), 0)
FROM M_Transaction t, M_Locator l
WHERE t.M_Product_ID=iv.M_Product_ID
-- AND t.M_AttributeSetInstance_ID=iv.M_AttributeSetInstance_ID
AND t.MovementDate > iv.DateValue
AND t.M_Locator_ID=l.M_Locator_ID
AND l.M_Warehouse_ID=iv.M_Warehouse_ID)
WHERE iv.M_Warehouse_ID = p_M_Warehouse_ID;
-- Delete Records w/o OnHand Qty
v_ResultStr := 'DeleteZeroQtyOnHand';
DELETE T_InventoryValue
WHERE QtyOnHand=0
OR QtyOnHand IS NULL;
-- Update Prices
v_ResultStr := 'GetPrices';
UPDATE T_InventoryValue iv
SET PricePO =
(SELECT currencyConvert (po.PriceList,po.C_Currency_ID,iv.C_Currency_ID,iv.DateValue, null, iv.AD_Client_ID, iv.AD_Org_ID)
FROM M_Product_PO po WHERE po.M_Product_ID=iv.M_Product_ID
AND po.IsCurrentVendor='Y' AND RowNum=1),
PriceList =
(SELECT currencyConvert(pp.PriceList,pl.C_Currency_ID,iv.C_Currency_ID,iv.DateValue, null, iv.AD_Client_ID, iv.AD_Org_ID)
FROM M_PriceList pl, M_PriceList_Version plv, M_ProductPrice pp
WHERE pp.M_Product_ID=iv.M_Product_ID AND pp.M_PriceList_Version_ID=iv.M_PriceList_Version_ID
AND pp.M_PriceList_Version_ID=plv.M_PriceList_Version_ID
AND plv.M_PriceList_ID=pl.M_PriceList_ID),
PriceStd =
(SELECT currencyConvert(pp.PriceStd,pl.C_Currency_ID,iv.C_Currency_ID,iv.DateValue, null, iv.AD_Client_ID, iv.AD_Org_ID)
FROM M_PriceList pl, M_PriceList_Version plv, M_ProductPrice pp
WHERE pp.M_Product_ID=iv.M_Product_ID AND pp.M_PriceList_Version_ID=iv.M_PriceList_Version_ID
AND pp.M_PriceList_Version_ID=plv.M_PriceList_Version_ID
AND plv.M_PriceList_ID=pl.M_PriceList_ID),
PriceLimit =
(SELECT currencyConvert(pp.PriceLimit,pl.C_Currency_ID,iv.C_Currency_ID,iv.DateValue, null, iv.AD_Client_ID, iv.AD_Org_ID)
FROM M_PriceList pl, M_PriceList_Version plv, M_ProductPrice pp
WHERE pp.M_Product_ID=iv.M_Product_ID AND pp.M_PriceList_Version_ID=iv.M_PriceList_Version_ID
AND pp.M_PriceList_Version_ID=plv.M_PriceList_Version_ID
AND plv.M_PriceList_ID=pl.M_PriceList_ID),
CostStandard =
(SELECT currencyConvert(pc.CurrentCostPrice,acs.C_Currency_ID,iv.C_Currency_ID,iv.DateValue, null, iv.AD_Client_ID, iv.AD_Org_ID)
FROM AD_ClientInfo ci, C_AcctSchema acs, M_Product_Costing pc
WHERE iv.AD_Client_ID=ci.AD_Client_ID AND ci.C_AcctSchema1_ID=acs.C_AcctSchema_ID
AND acs.C_AcctSchema_ID=pc.C_AcctSchema_ID
AND iv.M_Product_ID=pc.M_Product_ID)
WHERE iv.M_Warehouse_ID = p_M_Warehouse_ID;
-- Update Values
v_ResultStr := 'UpdateValue';
UPDATE T_InventoryValue
SET PricePOAmt = QtyOnHand * PricePO,
PriceListAmt = QtyOnHand * PriceList,
PriceStdAmt = QtyOnHand * PriceStd,
PriceLimitAmt = QtyOnHand * PriceLimit,
CostStandardAmt = QtyOnHand * CostStandard
WHERE M_Warehouse_ID = p_M_Warehouse_ID;
v_Message := '@Created@ = ' || SQL%ROWCOUNT;
<<FINISH_PROCESS>>
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = v_Result, -- 1=success
ErrorMsg = v_Message
WHERE AD_PInstance_ID=p_PInstance_ID;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
v_ResultStr := v_ResultStr || ': ' || SQLERRM || ' - ' || v_Message;
DBMS_OUTPUT.PUT_LINE(v_ResultStr);
ROLLBACK;
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 0, -- failure
ErrorMsg = v_ResultStr
WHERE AD_PInstance_ID=p_PInstance_ID;
COMMIT;
RETURN;
END T_InventoryValue_Create;
/

View File

@ -1,55 +0,0 @@
CREATE OR REPLACE PROCEDURE nextID
(
p_AD_Sequence_ID IN NUMBER,
p_System IN CHAR,
o_NextID OUT NUMBER
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2005 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: nextID.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Get Next ID - no Commit
* Description:
* Test via
DECLARE
v_NextID NUMBER;
BEGIN
nextID(2, 'Y', v_NextID);
DBMS_OUTPUT.PUT_LINE(v_NextID);
END;
*
************************************************************************/
AS
BEGIN
IF (p_System = 'Y') THEN
SELECT CurrentNextSys
INTO o_NextID
FROM AD_Sequence
WHERE AD_Sequence_ID=p_AD_Sequence_ID
FOR UPDATE OF CurrentNextSys;
--
UPDATE AD_Sequence
SET CurrentNextSys = CurrentNextSys + IncrementNo
WHERE AD_Sequence_ID=p_AD_Sequence_ID;
ELSE
SELECT CurrentNext
INTO o_NextID
FROM AD_Sequence
WHERE AD_Sequence_ID=p_AD_Sequence_ID
FOR UPDATE OF CurrentNext;
--
UPDATE AD_Sequence
SET CurrentNext = CurrentNext + IncrementNo
WHERE AD_Sequence_ID=p_AD_Sequence_ID;
END IF;
--
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END nextID;
/