2014年1月27日 星期一

groovy:測試1

groovy:測試1
程序
=========
import java.sql.Timestamp
import java.math.BigDecimal
import java.sql.PreparedStatement
import java.sql.ResultSet
import org.compiere.util.DB
import org.compiere.model.MUser
import org.compiere.util.Env
//@script:groovy:getQuotationForOrder
def now = new Timestamp(System.currentTimeMillis());
int client=Env.getContextAsInt(A_Ctx, "AD_Client_ID");
int org=Env.getContextAsInt(A_Ctx, "AD_Org_ID");
int uid=Env.getContextAsInt(A_Ctx, "#AD_User_ID");
// int parent_id=((Integer)A_PO.get_Value("出貨通知_ID")).intValue();

// DB.getSQLValueString(null,"select \"序號\" from \"報價單明細\" where \"報價單明細_id\"= ?", id);
// int getSQLValue (String trxName, String sql)
// getSQLValueString(trxName, sql, new Object[]{int_param1});
String uu1=DB.getSQLValueString(null, "SELECT adempiere.Generate_UUID()  AS uu1  " );
int id1= DB.getSQLValue(null, "SELECT adempiere.NextID('儲位內容', 'N')   AS  id1  " );

result="成功 uu1="+uu1+" ,id1="+id1

groovy:單據日期帶編號Test

groovy:單據日期帶編號Test
程序
====================
import java.sql.Timestamp
import java.math.BigDecimal
import java.sql.PreparedStatement
import java.sql.ResultSet
import org.compiere.util.DB
import org.compiere.util.Env
import org.compiere.model.MUser
//@script:groovy:getQuotationForOrder
// Timestamp  now = new Timestamp(System.currentTimeMillis());
int client=Env.getContextAsInt(A_Ctx, "AD_Client_ID");
int org=Env.getContextAsInt(A_Ctx, "AD_Org_ID");
int uid=Env.getContextAsInt(A_Ctx, "#AD_User_ID");
// Timestamp dt =  (Timestamp ) A_Value;
// s.length() == 7 && s.size() == 7
// assert s.substring(2,5)
Timestamp  now = new Timestamp(System.currentTimeMillis());
def dt = ""+now
def dt1 = dt.substring(0,4)
def dt2 = dt.substring(5,7)
def dt3 = dt.substring(8,10)
dt = dt1+dt2+dt3
result=  "dt="+dt

2014年1月25日 星期六

從未結案工單找出未結案製程

從未結案工單找出未結案製程

未結案訂單 =
SELECT * FROM 訂單 WHERE Status='未結案'

未結案工單 =
SELECT * FROM 工單 WHERE 訂單 IN (未結案訂單)
AND Status='未結案'

未結案製程 =
SELECT * FROM 製程 WHERE 工單 IN (未結案工單)
AND Status='未結案'

[未結案製程] = 已經給原料未產出完工

選出未結案 [製程 +廠商]
填入本次產出數量
填入本次產出日期

2014年1月24日 星期五

groovy:入庫測試

import java.sql.Timestamp
import java.math.BigDecimal
import java.sql.PreparedStatement
import java.sql.ResultSet
import org.compiere.util.DB
import org.compiere.model.MUser
import org.compiere.util.Env
//@script:groovy:getQuotationForOrder
def now = new Timestamp(System.currentTimeMillis());
int client=Env.getContextAsInt(A_Ctx, "AD_Client_ID");
int org=Env.getContextAsInt(A_Ctx, "AD_Org_ID");
int uid=Env.getContextAsInt(A_Ctx, "#AD_User_ID");
// int parent_id=((Integer)A_PO.get_Value("出貨通知_ID")).intValue();

if (A_Value != null ){
int id =  ((Integer) A_Value).intValue();
if (id==1000000 &&  (Integer)A_Tab.getValue("入庫單_ID")!=null ) { // 拉到 [確認] 才做
    int ordid=((Integer)A_Tab.getValue("入庫單_ID")).intValue();
    String sql1 ="SELECT a.\"品號_id\", a.\"入庫數量\", a.\"庫別_id\", a.\"儲位_id\", a.\"入庫單明細_id\"  FROM \"入庫單明細\" a  WHERE a.\"入庫單_id\"=?  ";
    PreparedStatement pstmt1 = DB.prepareStatement(sql1, null);
    pstmt1.setInt(1, ordid);
    ResultSet rs1 = pstmt1.executeQuery();
    while (rs1.next()) {
        int  lineid = rs1. getInt ("入庫單明細_id");
        int  pdid = rs1.getInt ("品號_id");
        int  whid = rs1.getInt("庫別_id");
        int  locid = rs1.getInt("儲位_id");
        BigDecimal qty1 = rs1. getBigDecimal ("入庫數量");
   
       //-----2------
       String sql2 ="SELECT a.\"數量\", \"儲位內容_id\"  FROM \"儲位內容\" a  INNER JOIN \"儲位\" b  ON (a.\"儲位_id\"=b.\"儲位_id\") INNER JOIN \"庫別\" c  ON (b.\"庫別_id\"=c.\"庫別_id\")  WHERE a.\"品號_id\"=?  AND c.\"庫別_id\"=? ";
       PreparedStatement pstmt2 = DB.prepareStatement(sql2, null);
       pstmt2.setInt(1,  pdid );
       pstmt2.setInt(2,  whid);
       ResultSet rs2 = pstmt2.executeQuery();
       int locqtyid= 0;
       BigDecimal qty2 = null;
       if (rs2.next()) {
            locqtyid= rs2. getInt ("儲位內容_id");
            qty2 = rs2. getBigDecimal ("數量");
       }
       rs2.close();
       pstmt2.close();
       //----2---- End

       if (qty2==null) {
           qty2 = new BigDecimal(0);
           if (whid > 0 && locid > 0){
               // DB.getSQLValueString(null,"select \"序號\" from \"報價單明細\" where \"報價單明細_id\"= ?", id);
                String uu1=DB.getSQLValueString(null, "SELECT adempiere.Generate_UUID()  AS uu1  " );
                int id1= DB.getSQLValue(null, "SELECT adempiere.NextID('儲位內容', 'N')   AS  id1  " );

               String ins="INSERT INTO \"儲位內容\" (\"數量\",  \"儲位內容_id\", \"儲位內容_uu\", \"儲位_id\", AD_Client_ID, AD_Org_ID, CreatedBy, UpdatedBy, Created, Updated, IsActive) VALUES ("+qty2+","+id1+", '"+uu1+"',"+locid+","+client+","+org+","+uid+","+uid+",'"+now+"','"+now+"','Y' )"
                 DB.executeUpdate (ins );
//  VALUES( ?,?,?,?,?,?,?,?,?,?,? )";
                // DB.executeUpdate(sql, new Object[] { shipper_id, inout_id }, false, null);
                // DB.executeUpdate (ins,  Object[] { qty2,  id1,  uu1,  locid, client,  org,  uid,  uid, now, now, "Y" },  false, null);
             
               BigDecimal qty3 = qty2.add(qty1);
               sqlx = "UPDATE  \"入庫單明細\" SET  \"原庫存數量\"='"+ qty2 +"',\"更新後庫存數量\"='"+qty3 +"' WHERE \"入庫單明細_id\"="+lineid +" ";
               DB.executeUpdate (sqlx );
           }
       }else{
         BigDecimal qty3 = qty2.add(qty1);
         sqlx = "UPDATE  \"入庫單明細\" SET  \"原庫存數量\"='"+ qty2 +"',\"更新後庫存數量\"='"+qty3 +"' WHERE \"入庫單明細_id\"="+lineid +" ";
         DB.executeUpdate (sqlx );
         sqly = "UPDATE  \"儲位內容\" SET  \"數量\"='"+ qty3 +"' WHERE \"儲位內容_id\"="+locid +" ";
         DB.executeUpdate (sqly );
      } // if (qty2==null)
  } // while (rs1.next()) {
  rs1.close();
  pstmt1.close();
} // if (id==1000000
} // if (A_Value != null ){
result=""

2014年1月6日 星期一

idempiere trigger for summary





set SEARCH_PATH=adempiere



--
-- Main tables - time dimension and sales fact.
--
CREATE TABLE ly_time_dimension (
    time_key                    integer NOT NULL,
    day_of_week                 integer NOT NULL,
    day_of_month                integer NOT NULL,
    month                       integer NOT NULL,
    quarter                     integer NOT NULL,
    year                        integer NOT NULL
);
CREATE UNIQUE INDEX ly_time_dimension_key ON ly_time_dimension(time_key);

CREATE TABLE ly_sales_fact (
    time_key                    integer NOT NULL,
    product_key                 integer NOT NULL,
    store_key                   integer NOT NULL,
    amount_sold                 numeric(12,2) NOT NULL,
    units_sold                  integer NOT NULL,
    amount_cost                 numeric(12,2) NOT NULL
);
CREATE INDEX ly_sales_fact_time ON ly_sales_fact(time_key);

--
-- Summary table - sales by time.
--
CREATE TABLE ly_sales_summary_bytime (
    time_key                    integer NOT NULL,
    amount_sold                 numeric(15,2) NOT NULL,
    units_sold                  numeric(12) NOT NULL,
    amount_cost                 numeric(15,2) NOT NULL
);
CREATE UNIQUE INDEX ly_sales_summary_bytime_key ON ly_sales_summary_bytime(time_key);

--
-- Function and trigger to amend summarized column(s) on UPDATE, INSERT, DELETE.
--
CREATE OR REPLACE FUNCTION ly_maint_sales_summary_bytime() RETURNS TRIGGER
AS $maint_sales_summary_bytime$
    DECLARE
        delta_time_key          integer;
        delta_amount_sold       numeric(15,2);
        delta_units_sold        numeric(12);
        delta_amount_cost       numeric(15,2);
    BEGIN

        -- Work out the increment/decrement amount(s).
        IF (TG_OP = 'DELETE') THEN

            delta_time_key    = OLD.time_key;
            delta_amount_sold = -1 * OLD.amount_sold;
            delta_units_sold  = -1 * OLD.units_sold;
            delta_amount_cost = -1 * OLD.amount_cost;

        ELSIF (TG_OP = 'UPDATE') THEN

            -- forbid updates that change the time_key -
            -- (probably not too onerous, as DELETE + INSERT is how most
            -- changes will be made).
            IF ( OLD.time_key != NEW.time_key) THEN
                RAISE EXCEPTION 'Update of time_key : % -> % not allowed',
                                                      OLD.time_key, NEW.time_key;
            END IF;

            delta_time_key    = OLD.time_key;
            delta_amount_sold = NEW.amount_sold - OLD.amount_sold;
            delta_units_sold  = NEW.units_sold - OLD.units_sold;
            delta_amount_cost = NEW.amount_cost - OLD.amount_cost;

        ELSIF (TG_OP = 'INSERT') THEN

            delta_time_key    = NEW.time_key;
            delta_amount_sold = NEW.amount_sold;
            delta_units_sold  = NEW.units_sold;
            delta_amount_cost = NEW.amount_cost;

        END IF;


        -- Insert or update the summary row with the new values.
        <<insert_update>>
        LOOP
            UPDATE ly_sales_summary_bytime
                SET amount_sold = amount_sold + delta_amount_sold,
                    units_sold  = units_sold  + delta_units_sold,
                    amount_cost = amount_cost + delta_amount_cost
              WHERE time_key    = delta_time_key;

            EXIT insert_update WHEN found;

            BEGIN
                INSERT INTO ly_sales_summary_bytime (
                            time_key,
                            amount_sold,
                            units_sold,
                            amount_cost)
                    VALUES (
                            delta_time_key,
                            delta_amount_sold,
                            delta_units_sold,
                            delta_amount_cost
                           );

                EXIT insert_update;

            EXCEPTION
                WHEN UNIQUE_VIOLATION THEN
                    -- do nothing
            END;
        END LOOP insert_update;

        RETURN NULL;

    END;
$maint_sales_summary_bytime$ LANGUAGE plpgsql;

CREATE TRIGGER ly_maint_sales_summary_bytime
AFTER INSERT OR UPDATE OR DELETE ON ly_sales_fact
    FOR EACH ROW EXECUTE PROCEDURE ly_maint_sales_summary_bytime();

select * from ly_sales_summary_bytime
1;10.00;3;15.00
--
1;30.00;8;50.00
--
1;30.00;8;50.00
2;40.00;15;135.00
--
1;30.00;8;50.00
2;50.00;16;148.00
--
INSERT INTO ly_sales_fact VALUES(1,1,1,10,3,15);
INSERT INTO ly_sales_fact VALUES(1,2,1,20,5,35);
INSERT INTO ly_sales_fact VALUES(2,2,1,40,15,135);
INSERT INTO ly_sales_fact VALUES(2,3,1,10,1,13);
--
SELECT * FROM ly_sales_summary_bytime;
DELETE   FROM ly_sales_fact WHERE product_key = 1;
SELECT * FROM ly_sales_summary_bytime;
UPDATE ly_sales_fact SET units_sold = units_sold * 2;
SELECT * FROM sales_summary_bytime;


PostgreSQL /* DROP TRIGGER ly_movement_trigger ON adempiere.ly_movement CREATE TRIGGER ly_movement_trigger AFTER INSERT OR UPDATE OR DELETE ON adempiere.ly_movement FOR EACH ROW EXECUTE PROCEDURE adempiere.ly_movement_f(); */ CREATE OR REPLACE FUNCTION adempiere.ly_movement_f() RETURNS TRIGGER AS $$ DECLARE v_LY_Storage_ID NUMERIC(10,0) := 0; pinstance NUMERIC(10,0) := 0; pinstance_id NUMERIC(10,0) := 0; v_message VARCHAR(200) := NULL; ResultStr VARCHAR(200) := NULL; v_ID NUMERIC(10,0) := 0; v_UU VARCHAR(36) := NULL; v_Detail_ID NUMERIC(10,0) := 0; v_Detail_UU VARCHAR(36) := NULL; v_MovementQty NUMERIC(10,0) := 0; v_BeforeQty NUMERIC(10,0) := 0; v_StorageQty NUMERIC(10,0) := 0; BEGIN IF pinstance is null THEN pinstance_id:=1000000; ELSE pinstance_id:=pinstance; END IF; v_message :='程式開始..'; IF pinstance_id > 0 THEN BEGIN ResultStr := 'PInstanceNotFound'; UPDATE adempiere.ad_pinstance SET updated = NOW(), isprocessing = 'Y', result = 0, errormsg = ResultStr WHERE ad_pinstance_id = pinstance_id; EXCEPTION WHEN OTHERS THEN NULL; END; END IF; IF (TG_OP = 'DELETE' OR TG_OP = 'UPDATE') THEN ------ v_LY_Storage_ID:=0; SELECT LY_Storage_ID INTO v_LY_Storage_ID FROM LY_Storage WHERE M_Product_ID = OLD.M_Product_ID AND C_BPartner_ID = OLD.C_BPartner_ID; ------ IF COALESCE(v_LY_Storage_ID,0) > 0 THEN UPDATE LY_Storage SET StorageQty = StorageQty - OLD.MovementQ WHERE LY_Storage_ID = v_LY_Storage_ID; -- IF NOT FOUND THEN RETURN NULL; END IF; END IF; v_LY_Storage_ID:=0; SELECT LY_Storage_ID, StorageQty INTO v_ID , v_StorageQty FROM LY_Storage WHERE M_Product_ID = OLD.M_Product_ID AND C_BPartner_ID = OLD.C_BPartnerTo_ID FOR UPDATE; ------ IF COALESCE(v_ID,0) > 0 THEN UPDATE LY_Storage SET StorageQty = StorageQty - OLD.MovementQ WHERE LY_Storage_ID = v_ID; v_MovementQty:= NVL(OLD.MovementQty,0); v_BeforeQty := v_StorageQty; v_StorageQty := v_BeforeQty - v_MovementQty; SELECT adempiere.nextid('LY_StorageDetail', 'N') INTO v_Detail_ID; SELECT adempiere.generate_uuid() INTO v_Detail_UU; INSERT INTO adempiere.LY_StorageDetail ( LY_StorageDetail_ID, LY_StorageDetail_UU, LY_Storage_ID, C_BPartner_ID, M_Product_ID, BeforeQty, MovementQty, StorageQty, LY_Movement_ID, AD_Client_ID, AD_Org_ID, Created, Updated, CreatedBy, UpdatedBy )VALUES( v_Detail_ID, v_Detail_UU, v_ID, OLD.C_BPartner_ID, OLD.M_Product_ID, v_BeforeQty, v_MovementQty, v_StorageQty, OLD.LY_Movement_ID, OLD.AD_Client_ID, OLD.AD_Org_ID, NOW(), NOW(), OLD.UpdatedBy, OLD.UpdatedBy); ELSE SELECT adempiere.nextid('LY_Storage', 'N') INTO v_ID; SELECT adempiere.generate_uuid() INTO v_UU; INSERT INTO adempiere.LY_Storage ( LY_Storage_ID, LY_Storage_UU, C_BPartner_ID, M_Product_ID, StorageQty, AD_Client_ID, AD_Org_ID, Created, Updated, CreatedBy, UpdatedBy )VALUES( v_ID, v_UU, OLD.C_BPartner_ID, OLD.M_Product_ID, NVL(OLD.MovementQty,0) * -1, OLD.AD_Client_ID, OLD.AD_Org_ID, NOW(), NOW(), OLD.UpdatedBy, OLD.UpdatedBy); v_MovementQty:= NVL(OLD.MovementQty,0); v_BeforeQty := 0; v_StorageQty := v_BeforeQty - v_MovementQty; SELECT adempiere.nextid('LY_StorageDetail', 'N') INTO v_Detail_ID; SELECT adempiere.generate_uuid() INTO v_Detail_UU; INSERT INTO adempiere.LY_StorageDetail ( LY_StorageDetail_ID, LY_StorageDetail_UU, LY_Storage_ID,C_BPartner_ID, M_Product_ID, BeforeQty, MovementQty, StorageQty, LY_Movement_ID, AD_Client_ID, AD_Org_ID, Created, Updated, CreatedBy, UpdatedBy )VALUES( v_Detail_ID, v_Detail_UU, v_ID, OLD.C_BPartner_ID, OLD.M_Product_ID, v_BeforeQty, v_MovementQty, v_StorageQty, OLD.LY_Movement_ID, OLD.AD_Client_ID, OLD.AD_Org_ID, NOW(), NOW(), OLD.UpdatedBy, OLD.UpdatedBy); END IF; ------ ELSIF (TG_OP = 'UPDATE' OR TG_OP = 'INSERT') THEN SELECT LY_Storage_ID, StorageQty INTO v_ID, v_StorageQty FROM LY_Storage WHERE M_Product_ID = OLD.M_Product_ID AND C_BPartner_ID = OLD.C_BPartner_ID; ------ IF COALESCE(v_ID,0) > 0 THEN UPDATE LY_Storage SET StorageQty = StorageQty + NEW.MovementQ WHERE LY_Storage_ID = v_ID; v_MovementQty:= NVL(NEW.MovementQty,0); v_BeforeQty := v_StorageQty; v_StorageQty := v_BeforeQty + v_MovementQty; SELECT adempiere.nextid('LY_StorageDetail', 'N') INTO v_Detail_ID; SELECT adempiere.generate_uuid() INTO v_Detail_UU; INSERT INTO adempiere.LY_StorageDetail ( LY_StorageDetail_ID, LY_StorageDetail_UU, v_ID, C_BPartner_ID, M_Product_ID, BeforeQty, MovementQty, StorageQty, LY_Movement_ID, AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy )VALUES( v_Detail_ID, v_Detail_UU, NEW.C_BPartner_ID,NEW.M_Product_ID, v_BeforeQty, v_MovementQty, v_StorageQty, NEW.LY_Movement_ID, NEW.AD_Client_ID, NEW.AD_Org_ID, NOW(), NOW(), NEW.UpdatedBy, NEW.UpdatedBy); ELSE -- SELECT ad_sequence_id FROM adempiere.ad_sequence WHERE name='LY_Storage'; -- SELECT * FROM adempiere.LY_Storage SELECT adempiere.nextid('LY_Storage', 'N') INTO v_ID; SELECT adempiere.generate_uuid() INTO v_UU; INSERT INTO adempiere.LY_Storage ( LY_Storage_ID, LY_Storage_UU, C_BPartner_ID, M_Product_ID, StorageQty, AD_Client_ID, AD_Org_ID, Created, Updated, CreatedBy, UpdatedBy )VALUES( v_ID, v_UU, NEW.C_BPartner_ID, NEW.M_Product_ID, NEW.MovementQty, NEW.AD_Client_ID, NEW.AD_Org_ID, NOW(), NOW(), NEW.UpdatedBy, NEW.UpdatedBy); v_MovementQty:= NVL(NEW.MovementQty,0); v_BeforeQty := v_StorageQty; v_StorageQty := v_BeforeQty + v_MovementQty; SELECT adempiere.nextid('LY_StorageDetail', 'N') INTO v_Detail_ID; SELECT adempiere.generate_uuid() INTO v_Detail_UU; INSERT INTO adempiere.LY_StorageDetail ( LY_StorageDetail_ID, LY_StorageDetail_UU, v_ID, C_BPartner_ID, M_Product_ID, BeforeQty, MovementQty, StorageQty, LY_Movement_ID, AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy )VALUES( v_Detail_ID, v_Detail_UU, NEW.C_BPartner_ID, NEW.M_Product_ID, v_BeforeQty, v_MovementQty, v_StorageQty, NEW.LY_Movement_ID, NEW.AD_Client_ID, NEW.AD_Org_ID, NOW(), NOW(), NEW.UpdatedBy, NEW.UpdatedBy); END IF; END IF; --- v_message :='程式完成::'; IF pinstance_id > 0 THEN BEGIN UPDATE adempiere.ad_pinstance SET updated = NOW(), isprocessing = 'N', result = 1, errormsg = v_message WHERE ad_pinstance_id = pinstance_id; EXCEPTION WHEN OTHERS THEN NULL; END; END IF; RETURN NULL; EXCEPTION WHEN OTHERS THEN v_message :='程式失敗::'||SQLERRM||' ,SQLSTATE='||SQLSTATE||' ,v_message='||v_message; IF pinstance_id > 0 THEN BEGIN ResultStr := v_message; UPDATE adempiere.ad_pinstance SET updated = NOW(), isprocessing = 'N', result = 0, errormsg = ResultStr WHERE ad_pinstance_id = pinstance_id; EXCEPTION WHEN OTHERS THEN NULL; END; END IF; END; $$ LANGUAGE plpgsql;





/*
DROP TRIGGER ly_movement_trigger ON adempiere.ly_movement


CREATE TRIGGER ly_movement_trigger
  AFTER INSERT OR UPDATE OR DELETE
  ON adempiere.ly_movement
  FOR EACH ROW
  EXECUTE PROCEDURE adempiere.ly_movement_f();
*/

CREATE OR REPLACE FUNCTION adempiere.ly_movement_f() RETURNS TRIGGER AS $$
DECLARE
   v_LY_Storage_ID NUMERIC(10,0) := 0;
   pinstance       NUMERIC(10,0) := 0;
   pinstance_id    NUMERIC(10,0) := 0;
   v_message       VARCHAR(200)  := NULL;
   ResultStr       VARCHAR(200)  := NULL;
   v_ID            NUMERIC(10,0) := 0;
   v_UU            VARCHAR(36)   := NULL;
   v_Detail_ID     NUMERIC(10,0) := 0;
   v_Detail_UU     VARCHAR(36)   := NULL;
   v_MovementQty   NUMERIC(10,0) := 0;
   v_BeforeQty     NUMERIC(10,0) := 0;
   v_StorageQty    NUMERIC(10,0) := 0;
BEGIN
 
   IF pinstance is null THEN
      pinstance_id:=1000000;
   ELSE
      pinstance_id:=pinstance;
   END IF;
   v_message :='程式開始..';
   IF pinstance_id > 0 THEN
      BEGIN
         ResultStr := 'PInstanceNotFound';
         UPDATE adempiere.ad_pinstance
            SET updated      = NOW(),
                isprocessing = 'Y',
                result       = 0,
                errormsg     = ResultStr
          WHERE ad_pinstance_id = pinstance_id;
      EXCEPTION
           WHEN OTHERS THEN NULL;
      END;
   END IF;

   IF (TG_OP = 'DELETE' OR TG_OP = 'UPDATE') THEN
------
       v_LY_Storage_ID:=0;
       SELECT LY_Storage_ID INTO v_LY_Storage_ID
         FROM LY_Storage
        WHERE M_Product_ID  = OLD.M_Product_ID
          AND C_BPartner_ID = OLD.C_BPartner_ID;
------
      IF COALESCE(v_LY_Storage_ID,0) > 0 THEN
         UPDATE LY_Storage SET StorageQty = StorageQty - OLD.MovementQ WHERE LY_Storage_ID = v_LY_Storage_ID;
            -- IF NOT FOUND THEN RETURN NULL; END IF;
      END IF;

      v_LY_Storage_ID:=0;
      SELECT LY_Storage_ID, StorageQty INTO v_ID , v_StorageQty
        FROM LY_Storage
       WHERE M_Product_ID  = OLD.M_Product_ID
         AND C_BPartner_ID = OLD.C_BPartnerTo_ID
         FOR UPDATE;
------
      IF COALESCE(v_ID,0) > 0 THEN
         UPDATE LY_Storage SET StorageQty = StorageQty - OLD.MovementQ WHERE LY_Storage_ID = v_ID;

         v_MovementQty:= NVL(OLD.MovementQty,0);
         v_BeforeQty  := v_StorageQty;
         v_StorageQty := v_BeforeQty - v_MovementQty;
         SELECT adempiere.nextid('LY_StorageDetail', 'N') INTO v_Detail_ID;
         SELECT adempiere.generate_uuid()                 INTO v_Detail_UU;
         INSERT INTO adempiere.LY_StorageDetail (
                     LY_StorageDetail_ID, LY_StorageDetail_UU, LY_Storage_ID, C_BPartner_ID, M_Product_ID,
                     BeforeQty, MovementQty, StorageQty, LY_Movement_ID,
                     AD_Client_ID, AD_Org_ID, Created, Updated, CreatedBy, UpdatedBy
            )VALUES( v_Detail_ID, v_Detail_UU, v_ID, OLD.C_BPartner_ID, OLD.M_Product_ID,
                     v_BeforeQty, v_MovementQty, v_StorageQty, OLD.LY_Movement_ID,
                     OLD.AD_Client_ID, OLD.AD_Org_ID, NOW(), NOW(), OLD.UpdatedBy, OLD.UpdatedBy);


      ELSE
         SELECT adempiere.nextid('LY_Storage', 'N') INTO v_ID;
         SELECT adempiere.generate_uuid()           INTO v_UU;
         INSERT INTO adempiere.LY_Storage (
                     LY_Storage_ID, LY_Storage_UU, C_BPartner_ID, M_Product_ID, StorageQty,
                     AD_Client_ID, AD_Org_ID, Created, Updated, CreatedBy, UpdatedBy
            )VALUES( v_ID, v_UU, OLD.C_BPartner_ID, OLD.M_Product_ID, NVL(OLD.MovementQty,0) * -1,
                     OLD.AD_Client_ID, OLD.AD_Org_ID, NOW(), NOW(), OLD.UpdatedBy, OLD.UpdatedBy);

         v_MovementQty:= NVL(OLD.MovementQty,0);
         v_BeforeQty  := 0;
         v_StorageQty := v_BeforeQty - v_MovementQty;
         SELECT adempiere.nextid('LY_StorageDetail', 'N') INTO v_Detail_ID;
         SELECT adempiere.generate_uuid()                 INTO v_Detail_UU;
         INSERT INTO adempiere.LY_StorageDetail (
                     LY_StorageDetail_ID, LY_StorageDetail_UU, LY_Storage_ID,C_BPartner_ID, M_Product_ID,
                     BeforeQty, MovementQty, StorageQty, LY_Movement_ID,
                     AD_Client_ID, AD_Org_ID, Created, Updated, CreatedBy, UpdatedBy
            )VALUES( v_Detail_ID, v_Detail_UU, v_ID, OLD.C_BPartner_ID, OLD.M_Product_ID,
                     v_BeforeQty, v_MovementQty, v_StorageQty, OLD.LY_Movement_ID,
                     OLD.AD_Client_ID, OLD.AD_Org_ID, NOW(), NOW(), OLD.UpdatedBy, OLD.UpdatedBy);
      END IF;
------
   ELSIF (TG_OP = 'UPDATE' OR TG_OP = 'INSERT') THEN
       SELECT LY_Storage_ID, StorageQty INTO v_ID, v_StorageQty
         FROM LY_Storage
        WHERE M_Product_ID = OLD.M_Product_ID
          AND C_BPartner_ID = OLD.C_BPartner_ID;
------    
      IF COALESCE(v_ID,0) > 0 THEN
         UPDATE LY_Storage SET StorageQty = StorageQty + NEW.MovementQ WHERE LY_Storage_ID = v_ID;

         v_MovementQty:= NVL(NEW.MovementQty,0);
         v_BeforeQty  := v_StorageQty;
         v_StorageQty := v_BeforeQty + v_MovementQty;
         SELECT adempiere.nextid('LY_StorageDetail', 'N') INTO v_Detail_ID;
         SELECT adempiere.generate_uuid()                 INTO v_Detail_UU;
         INSERT INTO adempiere.LY_StorageDetail (
                     LY_StorageDetail_ID, LY_StorageDetail_UU, v_ID, C_BPartner_ID, M_Product_ID,
                     BeforeQty, MovementQty, StorageQty, LY_Movement_ID,
                     AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy
            )VALUES( v_Detail_ID, v_Detail_UU, NEW.C_BPartner_ID,NEW.M_Product_ID,
                     v_BeforeQty, v_MovementQty, v_StorageQty, NEW.LY_Movement_ID,
                     NEW.AD_Client_ID, NEW.AD_Org_ID, NOW(), NOW(), NEW.UpdatedBy, NEW.UpdatedBy);
      ELSE
      -- SELECT ad_sequence_id FROM adempiere.ad_sequence WHERE name='LY_Storage';
      -- SELECT * FROM adempiere.LY_Storage
         SELECT adempiere.nextid('LY_Storage', 'N') INTO v_ID;
         SELECT adempiere.generate_uuid()           INTO v_UU;
         INSERT INTO adempiere.LY_Storage (
                     LY_Storage_ID, LY_Storage_UU, C_BPartner_ID, M_Product_ID, StorageQty,
                     AD_Client_ID, AD_Org_ID, Created, Updated, CreatedBy, UpdatedBy
            )VALUES( v_ID, v_UU, NEW.C_BPartner_ID, NEW.M_Product_ID, NEW.MovementQty,
                     NEW.AD_Client_ID, NEW.AD_Org_ID, NOW(), NOW(), NEW.UpdatedBy, NEW.UpdatedBy);

         v_MovementQty:= NVL(NEW.MovementQty,0);
         v_BeforeQty  := v_StorageQty;
         v_StorageQty := v_BeforeQty + v_MovementQty;
         SELECT adempiere.nextid('LY_StorageDetail', 'N') INTO v_Detail_ID;
         SELECT adempiere.generate_uuid()                 INTO v_Detail_UU;
         INSERT INTO adempiere.LY_StorageDetail (
                     LY_StorageDetail_ID, LY_StorageDetail_UU, v_ID, C_BPartner_ID, M_Product_ID,
                     BeforeQty, MovementQty, StorageQty, LY_Movement_ID,
                     AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy
            )VALUES( v_Detail_ID, v_Detail_UU, NEW.C_BPartner_ID, NEW.M_Product_ID,
                     v_BeforeQty, v_MovementQty, v_StorageQty, NEW.LY_Movement_ID,
                     NEW.AD_Client_ID, NEW.AD_Org_ID, NOW(), NOW(), NEW.UpdatedBy, NEW.UpdatedBy);
                   
      END IF;
   END IF;
---
   v_message :='程式完成::';
   IF pinstance_id > 0 THEN
      BEGIN
         UPDATE adempiere.ad_pinstance
            SET updated      = NOW(),
                isprocessing = 'N',
                result       = 1,
                errormsg     = v_message
          WHERE ad_pinstance_id = pinstance_id;
      EXCEPTION
            WHEN OTHERS THEN NULL;
      END;
   END IF;

   RETURN NULL;
 
EXCEPTION WHEN OTHERS THEN
   v_message :='程式失敗::'||SQLERRM||' ,SQLSTATE='||SQLSTATE||' ,v_message='||v_message;
   IF pinstance_id > 0 THEN
      BEGIN
         ResultStr := v_message;
         UPDATE adempiere.ad_pinstance
            SET updated      = NOW(),
                isprocessing = 'N',
                result       = 0,
                errormsg     = ResultStr
          WHERE ad_pinstance_id = pinstance_id;
      EXCEPTION
         WHEN OTHERS THEN NULL;
      END;
   END IF;
END;
$$ LANGUAGE plpgsql;

2013年12月13日 星期五

iDempiere ERP v2.0 Groovy Rule Engine

import java.sql.Timestamp
import java.math.BigDecimal
import java.sql.PreparedStatement
import java.sql.ResultSet
import org.compiere.util.DB
import org.compiere.model.MInOut
import org.compiere.model.MInOutLine
import org.compiere.model.MProduct
int v_count = 0

String sql = "SELECT l.ad_client_id, l.ad_org_id, l.jd_ordergenshipmentline_id, l.jd_ordergenshipmentline_uu, l.c_bpartner_id, l.po_reference, l.documentno, l.m_product_id, l.m_product_value, l.m_product_name, l.qtyordered, l.qtydelivered, l.qtyundelivered, l.qtyshipment, l.c_orderline_id, l.c_order_id, o.c_bpartner_location_id, o.m_warehouse_id, o.poreference, o.deliveryrule,o.freightcostrule, o.deliveryviarule, o.priorityrule, o.c_doctype_id, d.m_locator_id, d.c_uom_id, od.c_doctypeshipment_id FROM adempiere.jd_ordergenshipmentline l INNER JOIN adempiere.c_order o ON o.c_order_id=l.c_order_id INNER JOIN adempiere.m_product d ON d.m_product_id=l.m_product_id INNER JOIN adempiere.c_doctype  od ON od.c_doctype_id=o.c_doctype_id "
// 請加上條件
// WHERE l.jd_ordergenshipment_id=? "
// A_Ctx  A_Trx  A_TrxName  A_Record_ID  A_AD_Client_ID  A_AD_User_ID  A_AD_PInstance_ID A_Table_ID
//
MInOut shipment = null;
PreparedStatement pstmt = DB.prepareStatement(sql, A_TrxName);
// pstmt.setInt(1, A_Record_ID);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
   if  (shipment ==null){
       shipment = new  MInOut (A_Ctx, 0, A_TrxName);
       shipment.setAD_Client_ID (rs.getInt("ad_client_id"));
       shipment.setAD_Org_ID (rs.getInt("ad_org_id"));
       shipment.setC_DocType_ID(rs.getInt("c_doctypeshipment_id"));
       shipment.setDescription('jd_wsgenshipment');
       shipment.setC_Order_ID(rs.getInt("c_order_id"));
       shipment.setC_BPartner_ID(rs.getInt("c_bpartner_id"));
       shipment.setC_BPartner_Location_ID(rs.getInt("c_bpartner_location_id"));
       shipment.setM_Warehouse_ID(rs.getInt("m_warehouse_id"));
       shipment.setPOReference(rs.getString("poreference"));
       shipment.setDeliveryRule(rs.getString("deliveryrule"));
       shipment.setFreightCostRule(rs.getString("freightcostrule"));
       shipment.setDeliveryViaRule(rs.getString("deliveryviarule"));
       shipment.setPriorityRule(rs.getString("priorityrule"));
       shipment.save(A_TrxName);
    }
    sline = new  MInOutLine (shipment );
    sline.setDescription("jd_wsgenshipment");
    sline.setC_OrderLine_ID(rs.getInt("c_orderline_id"));
    sline.setM_Locator_ID(rs.getInt("m_locator_id"));
    sline.setM_Product_ID(rs.getInt("m_product_id"));
    sline.setC_UOM_ID(rs.getInt("c_uom_id"));
    sline.setMovementQty(rs.getBigDecimal("qtyshipment"));
    sline.setQtyEntered(rs.getBigDecimal("qtyshipment"));
    sline.save(A_TrxName);
}
rs.close();
pstmt.close();

result=sql