เดี๋ยวขออธิบายเนื้องานคร่าวๆ ก่อนนะครับ ตอนนี้ผมทำตัว ฺ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.



