เดี๋ยวขออธิบายเนื้องานคร่าวๆ ก่อนนะครับ ตอนนี้ผมทำตัว ฺBOTDMS DataSet สำหรับ Export ARS ไปส่งให้ทีมบัญชี เพื่อส่งไปให้ Bank ชาติอีกทีนึครับ แล้วที่นี้มันมีข้อกำหนดที่ว่า เราไม่รู้ว่า ตัว FX แต่ละ Type ยังไม่รู้ว่าต้องส่ง หรือ ไม่ส่ง แต่ FX แต่ละสัญญาต้อง Map เป็นค่า BOT Code อะไรด้วย
จาก Requirement ที่ไม่แน่นอนแบบนี้
- FX แต่ละ Type ยังไม่รู้ว่าต้องส่ง หรือ ไม่ส่ง
- FX แต่ละสัญญาต้อง Map เป็นค่า BOT Code
ตาม Requirement ข้างต้น ผม ทำ Table Mapping ไว้ โดยมีโครงสร้างคร่าวๆ ดังนี้ //บาง Column ผลละไว้มันเยอะ
NO | Column Name | Description | Note |
---|---|---|---|
1 | ID | ลำดับของ Config | |
2 | ISENABLE | บอกว่าเปิดใช้งาน Config นี้ไหม | ค่าที่ได้จะเป็น Y หรือ N เอาไป WHERE เพื่อตัดออก |
3 | DSTYPE | รายงานแบงค์ชาติ ในที่นี้จะเป็น ARS | DATA SET TYPE |
4 | FXTYPECODE | ชนิดของ FX | |
5 | FXFWDTYPECODE | ชนิดของ FX FORWARD | FXFORWARDTYPECODE |
6 | FXSWAPTYPECODE | ชนิดของ FX SWAP | |
7 | BOTCODE | ค่า BOT Code | ARRANGEMENTTYPECODE |
สำหรับตัวอย่างข้อมูลประมาณนี้ครับ
ID | ISENABLE | DSTTYPE | FXTYPECODE | FXFWDTYPECODE | FXSWAPTYPECODE | BOTCODE |
---|---|---|---|---|---|---|
1 | N | ARS | TODAY | |||
2 | Y | ARS | TOMORROW | 018082 | ||
3 | Y | ARS | SPOT | 018082 | ||
4 | Y | ARS | FORWARD | Outright | 018082 | |
5 | Y | ARS | FORWARD | Prorata | 018082 | |
6 | Y | ARS | FORWARD | Time Option | 018082 | |
7 | Y | ARS | FORWARD | Par Forword | 018082 | |
8 | Y | ARS | SWAP | SWAP-SPOT | 018082 | |
9 | Y | ARS | SWAP | SWAP-FORWARD | 018082 | |
10 | N | ARS | BE | 018089 |
จากข้อมูลที่ mock ข้างต้นจะเห็นว่า เราได้ table config แล้วครับ โดยสามารถเลือกประเภทของรายการที่ต้องส่งตามที่แบงค์ชาติกำหนดได้ อย่างเคส Data Set ARS ให้
- รายงานเฉพาะ สัญญา FX ประเภท TOMORROW / SPOT / FORWARD / SWAP
- ส่วนสัญญา FX ที่เป็น TODAY อันนี้ไม่ต้องรายงานใน ARS เนื่องจากส่งข้อมูลไปใน FTU / FXA เป็นต้น
- สำหรับ FX BE เหมือนเป็นการลงทุนของธนาคารเอง ไม่ต้องรายงานไป
สุดท้ายจะได้ Query ประมาณนี้ครับ
SELECT DACC.PORTFOLIOID , P.PORTFOLIOCODE , P.PURPOSE AS PORTFOLIOTYPEID , PORTFOLIOTYPE.NAME AS PORTFOLIOTYPECODE , BASE_CUR.PRICESCALE AS PORT_BASE_PRICESCALE , DACC.SECURITYID , SEC.SECURITYCODE AS STOCKACRONYM , FX_TX.INVESTTXID , FX_TX.INVESTTXTYPEID , TXTYPE.INVESTTXTYPECODE , DACC.INTERNALCODE , ST.INVESTMENTID , INV.INVESTMENTCODE --COUNTER PARTY(BANK CODE) , FX_TX.COUNTERPARTYID , CTP.COUNTERPARTYCODE , CTP.REFERENCEID AS COMPANYID, , COM.COMPANYCODE , INVOLVEDPARTYTYPE.CODE AS INVOLVEDPARTYTYPECODE --COUNTER PARTY(BANK CODE) , FX_TX.FXTXTYPEID AS FXTXTYPEID , FXTXTYPE.CODE AS FXTXTYPECODE , EXTRA_TX.FWDTYPEID AS FORWARDTYPEID , FXFORWARDTYPE.CODE AS FORWARDTYPECODE , DACC.CURRENCYPAIRID , DACC.CURRENCYPAIRCODE , FX_TX.CURRENCYID AS COMMODITYCCYID , FX_TX.QUOTEDCCYID AS QUOTEDCCYID , DACC.COMMAMOUNT AS COMMODITYAMT , FX_TX.FXBOOKRATE AS FXCONTRACTRATE , DACC.QUOTEDAMOUNT AS QUOTEDAMT , DACC.BASECURRENCY , DACC.EXCHANGERATE , DACC.ACCRUEDINT , DACC.SOLDAMORTIZE , DACC.ADVANCEDINTEREST , MTMFX.COMMZDF , MTMFX.QUOTEDZDF , MTMFX.ADJCOMMNPV , MTMFX.ADJQUOTEDNPV , FX_TX.TRADEDATE , FX_TX.SPOTDATE , FX_TX.SETTLEDATE , SEC.MATURITYDATE , CASE WHEN FX_TX.INVESTTXID < FX_TX.REFINVESTTXID AND FX_TX.FXTXTYPEID = 5 THEN 'SWAP-SPOT' WHEN FX_TX.INVESTTXID > FX_TX.REFINVESTTXID AND FX_TX.FXTXTYPEID = 5 THEN 'SWAP-FORWARD' ELSE 'OTHER TYPE' END AS FX_SWAP_TYPE , ARRTYPE_FX.ARRANGEMENTTYPECODE , COM.DSET_INVOLVEDPARTYTYPEID AS INVOLVEDPARTYTYPEID FROM DAILYACCPOSITION DACC INNER JOIN INVESTTX FX_TX ON DACC.INVESTTXID = FX_TX.INVESTTXID INNER JOIN EXTRAINVESTTX EXTRA_TX ON EXTRA_TX.INVESTTXID = FX_TX.INVESTTXID AND EXTRA_TX.ACTIVEFLAG = 'A' AND EXTRA_TX.REFERENCETXSTATUSID = 0 LEFT OUTER JOIN MTMFXCONTRACT MTMFX ON DACC.INVESTTXID = MTMFX.INVESTTXID AND DACC.VALUEDATE = MTMFX.MTMDATE AND MTMFX.ACTIVEFLAG = 'A' LEFT OUTER JOIN INVESTTXTYPE TXTYPE ON FX_TX.INVESTTXTYPEID = TXTYPE.INVESTTXTYPEID LEFT OUTER JOIN SECURITY SEC ON DACC.SECURITYID = SEC.SECURITYID AND SEC.ACTIVEFLAG = 'A' LEFT OUTER JOIN SECURITYTYPE ST ON ST.SECURITYTYPEID = SEC.SECURITYTYPEID AND ST.ACTIVEFLAG = 'A' LEFT OUTER JOIN INVESTMENT INV ON ST.INVESTMENTID = INV.INVESTMENTID AND INV.ACTIVEFLAG = 'A' LEFT OUTER JOIN COUNTERPARTY CTP ON CTP.COUNTERPARTYID = FX_TX.COUNTERPARTYID AND CTP.ACTIVEFLAG = 'A' LEFT OUTER JOIN COMPANY COM ON CTP.REFERENCEID = COM.COMPANYID AND COM.ACTIVEFLAG = 'A' LEFT OUTER JOIN PORTFOLIO P ON DACC.PORTFOLIOID = P.PORTFOLIOID AND P.ACTIVEFLAG = 'A' LEFT OUTER JOIN SYSTEMLOOKUP PORTFOLIOTYPE ON P.PURPOSE = PORTFOLIOTYPE.ID AND PORTFOLIOTYPE.LOOKUPCATEGORYID = 10010017 AND PORTFOLIOTYPE.ACTIVEFLAG = 'A' LEFT OUTER JOIN CURRENCY BASE_CUR ON P.LOCALCURRENCYID = BASE_CUR.CURRENCYID AND BASE_CUR.ACTIVEFLAG = 'A' -- 10012001 FXTXTYPE LEFT OUTER JOIN SYSTEMLOOKUP FXTXTYPE ON FX_TX.FXTXTYPEID = FXTXTYPE.ID AND FXTXTYPE.LOOKUPCATEGORYID = 10012001 AND FXTXTYPE.ACTIVEFLAG = 'A' -- 10012001 FXTXTYPE -- 10012002 FXFORWARDTYPE LEFT OUTER JOIN SYSTEMLOOKUP FXFORWARDTYPE ON EXTRA_TX.FWDTYPEID = FXFORWARDTYPE.ID AND FXFORWARDTYPE.LOOKUPCATEGORYID = 10012002 AND FXFORWARDTYPE.ACTIVEFLAG = 'A' -- 10012002 FXFORWARDTYPE -- 10010002 INVOLVED PARTY TYPE LEFT OUTER JOIN SYSTEMLOOKUP INVOLVEDPARTYTYPE ON INVOLVEDPARTYTYPE.LOOKUPCATEGORYID = 10026095 AND COM.DSET_INVOLVEDPARTYTYPEID = INVOLVEDPARTYTYPE.ID AND INVOLVEDPARTYTYPE.ACTIVEFLAG = 'A' -- 10010002 INVOLVED PARTY TYPE --JOIN FOR FIND ARRANGEMENT TYPE FOR FX LEFT OUTER JOIN DSET_MAPPARAM_ARRANGEMENTTYPE_FX ARRTYPE_FX ON FX_TX.FXTXTYPEID = ARRTYPE_FX.FXTYPEID AND ARRTYPE_FX.ISENABLE = 'Y' AND ARRTYPE_FX.DATASETTYPE = 'ARS' --@DATASETTYPE AND ( ( ARRTYPE_FX.FXFORWARDTYPEID IS NULL AND ARRTYPE_FX.FXTYPEID <> 5 ) OR ( EXTRA_TX.FWDTYPEID = ARRTYPE_FX.FXFORWARDTYPEID AND ARRTYPE_FX.FXFORWARDTYPEID IS NOT NULL ) OR ( ARRTYPE_FX.FXSWAPTYPEID = ( FX_TX.INVESTTXID - FX_TX.REFINVESTTXID ) AND ARRTYPE_FX.FXSWAPTYPEID IS NOT NULL ) -- (EXTRA_TX.FWDTYPEID = ARRTYPE_FX.FXFORWARDTYPEID AND ARRTYPE_FX.FXFORWARDTYPEID IS NOT NULL) --OR (ARRTYPE_FX.FXFORWARDTYPEID IS NULL OR ARRTYPE_FX.FXFORWARDTYPEID = 0) ) --JOIN FOR FIND ARRANGEMENT TYPE FOR FX WHERE DACC.PORTFOLIOID IN ( 125, 126, 127 ) --@PORTFOLIOID AND DACC.VALUEDATE = '2017-06-22' --@VALUEDATE AND DACC.INTERNALCODE = 'FX' --@INTERNALCODE AND FX_TX.FXTXTYPEID IN (SELECT FXTYPEID FROM DSET_MAPPARAM_ARRANGEMENTTYPE_FX TARR_FX WHERE TARR_FX.ISENABLE = 'Y' AND ARRTYPE_FX.DATASETTYPE = 'ARS' --@DATASETTYPE AND ( ( FX_TX.FXTXTYPEID = TARR_FX.FXTYPEID --FILTER FX-SWAP OUT AND ( ( FX_TX.INVESTTXID - FX_TX.REFINVESTTXID ) > 1 OR ( FX_TX.INVESTTXID - FX_TX.REFINVESTTXID ) < -1 ) --FILTER FX-SWAP OUT --FILTER FORWARD OUT AND ( EXTRA_TX.FWDTYPEID IS NULL OR EXTRA_TX.FWDTYPEID IN ( 0, 1 ) ) --FILTER FORWARD OUT ) OR ( --CONDITION FOR FORWARD FX_TX.FXTXTYPEID = TARR_FX.FXTYPEID AND EXTRA_TX.FWDTYPEID = TARR_FX.FXFORWARDTYPEID AND TARR_FX.FXTYPEID IS NOT NULL --CONDITION FOR FORWARD ) OR ( --CONDITION FOR FX SWAP FX_TX.FXTXTYPEID = TARR_FX.FXTYPEID AND TARR_FX.FXSWAPTYPEID = ( FX_TX.INVESTTXID - FX_TX.REFINVESTTXID ) AND TARR_FX.FXSWAPTYPEID IS NOT NULL --CONDITION FOR FX SWAP ) ));
โดยการเขียน Query ให้สามารถรองรับ Config ได้ ตัว Config จะอยู่ที่ SQL ตั้งแต่ Line 126-168 ครับ โดยจะจับเปิดใช้ไม่ใช้ จาก Field ISENABLE ที่เหลือจะ match ตาม FX Type แต่ละแบบครับ
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.