[SQL] การเขียน Query ให้สามารถรองรับ Config ได้

เดี๋ยวขออธิบายเนื้องานคร่าวๆ ก่อนนะครับ ตอนนี้ผมทำตัว ฺBOTDMS DataSet สำหรับ Export ARS ไปส่งให้ทีมบัญชี เพื่อส่งไปให้ Bank ชาติอีกทีนึครับ แล้วที่นี้มันมีข้อกำหนดที่ว่า เราไม่รู้ว่า ตัว FX แต่ละ Type ยังไม่รู้ว่าต้องส่ง หรือ ไม่ส่ง แต่ FX แต่ละสัญญาต้อง Map เป็นค่า BOT Code อะไรด้วย

จาก Requirement ที่ไม่แน่นอนแบบนี้

  • FX แต่ละ Type ยังไม่รู้ว่าต้องส่ง หรือ ไม่ส่ง
  • FX แต่ละสัญญาต้อง Map เป็นค่า BOT Code

ตาม Requirement ข้างต้น ผม ทำ Table Mapping ไว้ โดยมีโครงสร้างคร่าวๆ ดังนี้ //บาง Column ผลละไว้มันเยอะ

NOColumn NameDescriptionNote
1IDลำดับของ Config
2ISENABLEบอกว่าเปิดใช้งาน Config นี้ไหมค่าที่ได้จะเป็น Y หรือ N เอาไป WHERE เพื่อตัดออก
3DSTYPEรายงานแบงค์ชาติ ในที่นี้จะเป็น ARSDATA SET TYPE
4FXTYPECODEชนิดของ FX
5FXFWDTYPECODEชนิดของ FX FORWARDFXFORWARDTYPECODE
6FXSWAPTYPECODEชนิดของ FX SWAP

7

BOTCODEค่า BOT CodeARRANGEMENTTYPECODE

สำหรับตัวอย่างข้อมูลประมาณนี้ครับ

IDISENABLEDSTTYPEFXTYPECODEFXFWDTYPECODEFXSWAPTYPECODEBOTCODE
1NARSTODAY
2YARSTOMORROW018082
3YARSSPOT018082
4YARSFORWARDOutright018082
5YARSFORWARDProrata018082
6YARSFORWARDTime Option018082
7YARSFORWARDPar Forword018082
8YARSSWAPSWAP-SPOT018082
9YARSSWAPSWAP-FORWARD018082
10NARSBE018089

จากข้อมูลที่ 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.