企业级存储过程分享

利用柜台的历史流水【股票】,使用移动平均算法做会计成本核算,兼容了新会计准则。
USE sims2016Proc
  go
IF EXISTS(SELECT 1 FROM sysobjects WHERE name = 'opCalcPortfolioCheckJrnlES')
  DROP PROC opCalcPortfolioCheckJrnlES
go


CREATE PROC opCalcPortfolioCheckJrnlES
  @i_operatorCode          VARCHAR(255)        ,           --操作员代码
  @i_operatorPassword      VARCHAR(255)        ,           --操作员密码
  @i_operateStationText    VARCHAR(4096)       ,           --留痕信息
  @i_fundAcctCode          VARCHAR(20)         ,           --资金账户
  @i_exchangeCode          VARCHAR(20)         ,           --交易所代码
  @i_secuCode              VARCHAR(20)         ,           --证券代码
  @i_beginDate             VARCHAR(10)  =  ' '             --开始日期  
AS
/***************************************************************************
-- Author : yugy
-- Version : 1.0
--    V1.0 : 支持股票买卖成交、送股派息、转入转出业务
-- Date : 2017-04-06
-- Description : 产品单元组合股票买入卖出成本的核算、送股派息处理、转入传出处理,相应流水生成
-- Function List : opCalcPortfolioCheckJrnlES
-- History : 


****************************************************************************/
SET NOCOUNT ON
 
CREATE TABLE #tt_portfolioRawJrnl(
  serialNO                  NUMERIC(20,0)                            ,          --记录序号
  orderID                   NUMERIC(5, 0)     DEFAULT 0      NOT NULL,          --排序Id
  occurDate                 VARCHAR(10)                      NOT NULL,          --发生日期
  shareRecordDate           VARCHAR(10)       DEFAULT ' '    NULL    ,          --登记日期
  ----------------------------------------------------------------------------------------------------------------------
  fundAcctCode              VARCHAR(20)                      NOT NULL,          --资金账户
  secuAcctCode              VARCHAR(20)       DEFAULT ' '    NOT NULL,
  prodCode                  VARCHAR(20)                      NOT NULL,          --产品代码
  prodCellCode              VARCHAR(20)       DEFAULT ' '    NOT NULL,          --产品单元代码
  investPortfolioCode       VARCHAR(20)       DEFAULT ' '    NOT NULL,          --投资组合代码
  transactionNO             NUMERIC(20, 0)    DEFAULT 1      NOT NULL,          --交易编号
  ----------------------------------------------------------------------------------------------------------------------
  currencyCode              VARCHAR(6)                       NOT NULL,          --货币代码
  marketLevelCode           VARCHAR(1)        DEFAULT '2'    NOT NULL,          --市场来源
  exchangeCode              VARCHAR(6)                       NOT NULL,          --交易所代码
  secuCode                  VARCHAR(6)                       NOT NULL,          --证券代码
  originSecuCode            VARCHAR(15)                      NOT NULL,          --原始证券代码
  secuTradeTypeCode         VARCHAR(5)                       NOT NULL,          --证券类别
  ----------------------------------------------------------------------------------------------------------------------
  secuBizTypeCode           VARCHAR(16)                      NOT NULL,          --业务类型
  bizSubTypeCode            VARCHAR(16)       DEFAULT 'S1'   NOT NULL,          --业务子类
  openCloseFlagCode         VARCHAR(16)                      NOT NULL,          --开平标志
  longShortFlagCode         VARCHAR(16)       DEFAULT '1'    NOT NULL,          --多空标志
  hedgeFlagCode             VARCHAR(16)       DEFAULT ''     NOT NULL,          --投保标志
  buySellFlagCode           VARCHAR(1)        DEFAULT '1'    NOT NULL,          --买卖类别
  ------------------------------------------------------------------------------------------------------------------------
  matchQty                  NUMERIC(10,0)     DEFAULT 0      NOT NULL,          --成交数量
  matchNetPrice             NUMERIC(10,2)     DEFAULT 0      NOT NULL,          --成交价格
  matchSettleAmt            NUMERIC(19,2)     DEFAULT 0      NOT NULL,          --成交结算金额
  matchTradeFeeAmt          NUMERIC(19,2)     DEFAULT 0      NOT NULL,          --手续费
  cashSettleAmt      NUMERIC(19,2)     DEFAULT 0      NOT NULL,          --资金发生数
  ------------------------------------------------------------------------------------------------------------------------
  costChgAmt                NUMERIC(19,2)     DEFAULT 0      NOT NULL,          --移动平均成本变动
  rlzChgProfit              NUMERIC(19,2)     DEFAULT 0      NOT NULL           --实现盈亏变动
 )
 
CREATE TABLE #tt_portfolioCheckJrnlES
(
  serialNO                  NUMERIC(20, 0)                           ,          --记录序号
  createPosiDate            VARCHAR(10)                      NOT NULL,          --建仓日期
  occurDate                 VARCHAR(10)                      NOT NULL,          --发生日期
  shareRecordDate           VARCHAR(10)       DEFAULT ' '        NULL,          --登记日期
  fundAcctCode              VARCHAR(20)                      NOT NULL,          --资金账户
  secuAcctCode              VARCHAR(20)       DEFAULT ' '    NOT NULL,          
  exchangeCode              VARCHAR(6)                       NOT NULL,          --交易所代码
  secuCode                  VARCHAR(6)                       NOT NULL,          --证券代码
  originSecuCode            VARCHAR(15)                      NOT NULL,          --原始证券代码
  secuName                  VARCHAR(15)                      NOT NULL,          --证券名称
  secuTradeTypeCode         VARCHAR(5)                       NOT NULL,          --证券类别
  prodCellCode              VARCHAR(20)       DEFAULT ' '    NOT NULL,          --产品单元代码
  prodCode                  VARCHAR(20)       DEFAULT ' '    NOT NULL,          --产品代码
  investPortfolioCode       VARCHAR(20)       DEFAULT ' '    NOT NULL,          --投资组合代码
  buySellFlagCode           VARCHAR(1)                       NOT NULL,          --买卖类别
  openCloseFlagCode         VARCHAR(1)                       NOT NULL,          --开平标志
  secuBizTypeCode           VARCHAR(16)                      NOT NULL,          --业务类型
  currencyCode              VARCHAR(6)                       NOT NULL,          --货币代码
  marketLevelCode           VARCHAR(1)        DEFAULT '2'    NOT NULL,          --市场来源
  hedgeFlagCode             VARCHAR(16)       DEFAULT ''     NOT NULL,          --投保标志
  matchQty                  NUMERIC(10, 0)    DEFAULT 0      NOT NULL,          --成交数量
  matchNetPrice             NUMERIC(10, 2)    DEFAULT 0      NOT NULL,          --成交价格
  cashSettleAmt      NUMERIC(19,2)     DEFAULT 0      NOT NULL,          --资金发生数
  matchSettleAmt            NUMERIC(19,2)     DEFAULT 0      NOT NULL,          --成交结算金额
  matchTradeFeeAmt          NUMERIC(19,2)     DEFAULT 0      NOT NULL,          --手续费
  costChgAmt                NUMERIC(19,2)     DEFAULT 0      NOT NULL,          --移动平均成本变动
  occupyCostChgAmt          NUMERIC(19,2)     DEFAULT 0      NOT NULL,          --持仓成本变动
  rlzChgProfit              NUMERIC(19,2)     DEFAULT 0      NOT NULL           --实现盈亏变动
)
 
CREATE TABLE #tt_portfolioCreatePosiDate
(
  exchangeCode              VARCHAR(4)                       NOT NULL,          --交易所代码
  secuCode                  VARCHAR(30)                      NOT NULL,          --证券代码
  prodCellCode              VARCHAR(30)                      NOT NULL,          --单元代码
  investPortfolioCode       VARCHAR(20)                      NOT NULL,          --组合代码
  createPosiDate            VARCHAR(10)                      NOT NULL,          --建仓日期
  posiQty                   NUMERIC(19,4)                    NOT NULL,          --持仓数量
  costChgAmt                NUMERIC(19,4)                    NOT NULL,          --成本变动金额
  lastCreatePosiDate        VARCHAR(10)                      NOT NULL           --最后操作日期
)


CREATE TABLE #tt_portfolioCreatePosiDateSum
(
  exchangeCode              VARCHAR(4)                       NOT NULL,          --交易所代码
  secuCode                  VARCHAR(30)                      NOT NULL,          --证券代码
  prodCellCode              VARCHAR(30)                      NOT NULL,          --单元代码
  investPortfolioCode       VARCHAR(20)                      NOT NULL,          --组合代码
  createPosiDate            VARCHAR(10)                      NOT NULL,          --建仓日期
  posiQty                   NUMERIC(19,4)                    NOT NULL,          --持仓数量
  costChgAmt                NUMERIC(19,4)                    NOT NULL,          --成本变动金额
  lastestoperateDate        VARCHAR(10)                      NOT NULL           --最后操作日期
)


CREATE TABLE #tt_portfolioCreatePosiDateAllotment
(
  exchangeCode              VARCHAR(4)                       NOT NULL,          --交易所代码
  secuCode                  VARCHAR(30)                      NOT NULL,          --证券代码
  secuCode0                 VARCHAR(30)                      NOT NULL,          --证券代码
  secuBizTypeCode           VARCHAR(30)                      NOT NULL,          
  prodCellCode              VARCHAR(30)                      NOT NULL,          --单元代码
  investPortfolioCode       VARCHAR(20)     DEFAULT  ''      NOT NULL ,          --组合代码
  createPosiDate            VARCHAR(10)                      NOT NULL,          --建仓日期
  posiQty                   NUMERIC(19,4)                    NOT NULL,          --持仓数量
  costChgAmt                NUMERIC(19,4)                    NOT NULL,          --成本变动金额
  lastestoperateDate        VARCHAR(10)                      NOT NULL           --最后操作日期
)


CREATE TABLE #tt_portfolioCheckJrnl_old
(
  operateDate               VARCHAR(10)                      NOT NULL,          -- 发生日期
  exchangeCode              VARCHAR(4)                       NOT NULL,          -- 交易所代码
  secuCode                  VARCHAR(30)                      NOT NULL,          -- 证券代码
  prodCellCode              VARCHAR(30)                      NOT NULL,          -- 单元代码
  investPortfolioCode       VARCHAR(30)                      NOT NULL,          -- 组合代码
  posiQty                   NUMERIC(19,4)                    NOT NULL           -- 持仓数量
)


CREATE TABLE #tt_portfolioPosiQtyDetial
(
  createPosiDate           VARCHAR(10)                       NOT NULL,          --建仓日期
  prodCellCode             VARCHAR(30)                       NOT NULL,          --单元代码
  investPortfolioCode      VARCHAR(30)                       NOT NULL,          -- 组合代码
  posiQty                  NUMERIC(19,4)                     NOT NULL,          --持仓数量
  matchQty                 NUMERIC(19,4)                     NOT NULL,          --成交数量
  costChgAmt               NUMERIC(19,4)                     NOT NULL           --成本变动金额
)


CREATE TABLE #tt_portfolioPosiQtySum
(
  createPosiDate           VARCHAR(10)                       NOT NULL,          --建仓日期
  prodCellCode             VARCHAR(30)                       NOT NULL,          --单元代码
  investPortfolioCode      VARCHAR(30)                       NOT NULL,          -- 组合代码
  posiQty                  NUMERIC(19,4)                     NOT NULL,          --持仓数量
  matchQty                 NUMERIC(19,4)                     NOT NULL,          --成交数量
  costChgAmt               NUMERIC(19,4)                     NOT NULL,          --成本变动金额
  rlzChgProfit             NUMERIC(19,4)                     NOT NULL           --盈亏变动金额
)


CREATE TABLE #tt_sgwtb
(
  settleDate               VARCHAR(10)                       NOT NULL,
  occurTime                DATETIME                          NOT NULL, 
  exchangeCode             VARCHAR(4)                        NOT NULL,           -- 交易所代码
  secuCode                 VARCHAR(10)                       NOT NULL,           --
  fundAcctCode             VARCHAR(10)                       NOT NULL,           
  prodCellCode             VARCHAR(20)                       NOT NULL,           
  investPortfolioCode      VARCHAR(30)                       NOT NULL,           -- 组合代码
  macthQty                 DECIMAL(19, 2)                    NOT NULL,
)
--
DECLARE 
  @v_createPosiDate                 VARCHAR(10),           --建仓日期
  @v_posiQty                        NUMERIC(19,4),         --持仓数量
  @v_lastSettleDate                 VARCHAR(10),           --最后建仓日期


  @temp_prodCellCode                VARCHAR(20),           --产品单元代码
  @temp_shareRecordDate             VARCHAR(10),           --登记日期(临时变量)
  @temp_mc_matchQty                 NUMERIC(10,0),         --卖出成交数量(临时变量)
  @temp_mc_per_costChgAmt           NUMERIC(19,2),         --卖出移动平均成本变动(临时变量)
  @temp_mc_costChgAmt               NUMERIC(19,2),         --买入移动平均成本变动(临时变量)
  @temp_mc_per_rlzChgProfit         NUMERIC(19,2),         --卖出实现盈亏变动(临时变量)
  @temp_mc_rlzChgProfit             NUMERIC(19,2),         --卖出实现盈亏变动(临时变量)
  @temp_mc_per_cashCurrSettleAmt    NUMERIC(19,2),         --卖出资金发生数(临时变量)
  @temp_mc_cashCurrSettleAmt        NUMERIC(19,2),         --卖出资金发生数(临时变量)
  @temp_mc_per_matchTradeFeeAmt     NUMERIC(19,2),         --卖出交易费用(临时变量)
  @temp_mc_matchTradeFeeAmt         NUMERIC(19,2),         --卖出交易费用(临时变量)
  
  @temp_mr_prodCellCode             VARCHAR(20),           --买入产品单元代码(临时变量)
  @temp_mr_investPortfolioCode      VARCHAR(20),           --买入产品单元代码(临时变量)
  @temp_mr_secuCode                 VARCHAR(20),           --买入证券代码(临时变量)
  @temp_mr_matchQty                 NUMERIC(10,0),         --买入成交数量(临时变量)
  @temp_mr_per_costChgAmt           NUMERIC(19,2),         --买入移动平均成本变动1(临时变量)
  @temp_mr_costChgAmt               NUMERIC(19,2),         --买入移动平均成本变动(临时变量)
  @temp_mr_createPosiDate           VARCHAR(10),           --买入建仓日期(临时变量)


  @v_tempCellCode                   VARCHAR(30),  
  @sgwtzsl                          NUMERIC(10,0),
  @mr_lastestUnit                   INT                     


--取当前日期
  DECLARE @v_today CHAR(10)
  SELECT @v_today = CONVERT(CHAR(10), GETDATE(), 20)
--计算成本计算开始日期
 --todo
  DECLARE @v_realBeginDate CHAR(10) = '2000-01-01'
 
 --判断资金账户是否上下线
 --todo
  --删除产品单元股票核算流水
  DELETE sims2016TradeHist..portfolioCheckJrnlESHist
         WHERE settleDate >= @v_realBeginDate
               AND (@i_fundAcctCode = '' OR CHARINDEX(fundAcctCode, @i_fundAcctCode) > 0)
               AND (@i_exchangeCode = '' OR CHARINDEX(exchangeCode, @i_exchangeCode) > 0)
               AND (@i_secuCode = '' OR CHARINDEX(secuCode, @i_secuCode) > 0)
 
  --删除非交易类流水
  DELETE sims2016TradeHist..prodCellRawJrnlESHist
         WHERE settleDate >= @v_realBeginDate
               AND (@i_fundAcctCode = '' OR CHARINDEX(fundAcctCode, @i_fundAcctCode) > 0)
               AND (@i_exchangeCode = '' OR CHARINDEX(exchangeCode, @i_exchangeCode) > 0)
               AND (@i_secuCode = '' OR CHARINDEX(secuCode, @i_secuCode) > 0)
               AND  secuBizTypeCode  IN ('183', '187', '188')


  
  --删除非交易类流水
  DELETE sims2016TradeHist..prodCellRawJrnlHist
         WHERE settleDate >= @v_realBeginDate
               AND (@i_fundAcctCode = '' OR CHARINDEX(fundAcctCode, @i_fundAcctCode) > 0)
               AND (@i_exchangeCode = '' OR CHARINDEX(exchangeCode, @i_exchangeCode) > 0)
               AND (@i_secuCode = '' OR CHARINDEX(secuCode, @i_secuCode) > 0)
               AND secuBizTypeCode  IN ('183', '187', '188')
               
  --汇总成交
  INSERT INTO #tt_portfolioRawJrnl(serialNO, orderID, occurDate, fundAcctCode, secuAcctCode, 
                                   prodCode, prodCellCode, investPortfolioCode,
                                   transactionNO, currencyCode, marketLevelCode, 
                                   exchangeCode, secuCode, originSecuCode,
                                   secuTradeTypeCode, secuBizTypeCode, bizSubTypeCode,
                                   openCloseFlagCode, longShortFlagCode, hedgeFlagCode,
                                   buySellFlagCode, matchQty,
                                   matchNetPrice, matchSettleAmt, matchTradeFeeAmt,
                                   cashSettleAmt, costChgAmt, rlzChgProfit)
                            SELECT MAX(serialNO), 0, settleDate, fundAcctCode, secuAcctCode,
                                   MAX(prodCode), prodCellCode, investPortfolioCode,
                                   MAX(transactionNO), MAX(currencyCode), MAX(marketLevelCode),
                                   exchangeCode, secuCode, MAX(originSecuCode),
                                   MAX(secuTradeTypeCode), secuBizTypeCode, MAX(bizSubTypeCode),
                                   openCloseFlagCode, '1', MAX(hedgeFlagCode),
                                   MAX(buySellFlagCode), SUM(ABS(matchQty)),
                                   CASE WHEN SUM(matchQty) = 0 THEN 0
                                        ELSE SUM(matchQty * matchNetPrice) / SUM(matchQty)END,
                                   SUM(matchSettleAmt), SUM(matchTradeFeeAmt),
                                   SUM(cashSettleAmt), SUM(-cashSettleAmt), 0
                              FROM sims2016TradeHist..prodCellRawJrnlESHist a
                             WHERE settleDate >= @v_realBeginDate
                                       AND settleDate >= @i_beginDate
                                       AND settleDate <= @v_today  
                                       AND (@i_fundAcctCode = '' OR CHARINDEX(fundAcctCode, @i_fundAcctCode) > 0)
                                       AND (@i_exchangeCode = '' OR CHARINDEX(exchangeCode, @i_exchangeCode) > 0)
                                       AND (@i_secuCode  = '' OR CHARINDEX(secuCode, @i_secuCode) > 0 OR CHARINDEX(','+a.originSecuCode+',', @i_secuCode) > 0)
                             GROUP BY settleDate, fundAcctCode, secuAcctCode, prodCellCode, exchangeCode, secuCode, openCloseFlagCode, secuBizTypeCode, investPortfolioCode
                             ORDER BY fundAcctCode, settleDate, exchangeCode, a.secuCode, prodCellCode, investPortfolioCode, secuBizTypeCode, openCloseFlagCode
                             
     
     select * from #tt_portfolioRawJrnl
                             
                                                                                                             
  --取产品股票送股派息流水
  INSERT INTO #tt_portfolioRawJrnl(serialNO, orderID, occurDate,--记录序号, 处理排序编号, 业务发生日期                                    
                                   shareRecordDate,fundAcctCode, secuAcctCode, prodCode,--送红派息登记日期, 资金账户代码, 产品代码
                                   prodCellCode, investPortfolioCode, transactionNO,--产品单元代码, 投资组合代码, 交易编号
                                   currencyCode, marketLevelCode, exchangeCode,--货币代码, 市场来源代码, 交易所代码
                                   secuCode, originSecuCode, secuTradeTypeCode,--证券代码, 原始证券代码,证券交易类型代码 
                                   secuBizTypeCode, bizSubTypeCode, openCloseFlagCode,--证券业务类别代码, 业务之类, 开平标志
                                   longShortFlagCode, hedgeFlagCode, buySellFlagCode,--多空标志, 投保标志, 买卖标志
                                   matchQty, matchNetPrice, matchSettleAmt,--成交数量, 成交价格, 成交金额
                                   matchTradeFeeAmt, cashSettleAmt,--成交费用, 资金发生数
                                   costChgAmt, rlzChgProfit--持仓成本金额变动, 持仓实现盈亏变动
                                   )
                            SELECT serialNO, 100, settleDate,
                                   shareRecordDate, fundAcctCode, secuAcctCode, prodCode,
                                   prodCellCode, investPortfolioCode, transactionNO,
                                   currencyCode, marketLevelCode, exchangeCode,
                                   secuCode, originSecuCode, secuTradeTypeCode,
                                   secuBizTypeCode, bizSubTypeCode, openCloseFlagCode,
                                   '1', hedgeFlagCode, buySellFlagCode,
                                   ABS(matchQty), matchNetPrice, matchSettleAmt,
                                   matchTradeFeeAmt, cashSettleAmt,
                                   0, 0
                              FROM sims2016TradeHist..prodRawJrnlESHist a
                             WHERE settleDate >= @v_realBeginDate
                               AND settleDate <= @v_today
                               AND shareRecordDate != ' '
                               AND secuBizTypeCode  IN ('183', '187', '188', '122')
                               AND (@i_fundAcctCode = '' OR CHARINDEX(fundAcctCode, @i_fundAcctCode) > 0)
                               AND (@i_exchangeCode = '' OR CHARINDEX(exchangeCode, @i_exchangeCode) > 0)
                               AND (@i_secuCode  = '' OR CHARINDEX(secuCode, @i_secuCode) > 0 OR CHARINDEX(','+a.originSecuCode+',', @i_secuCode) > 0)
                            ORDER BY fundAcctCode, settleDate
                            
  --SELECT * FROM #tt_portfolioRawJrnl WHERE secuBizTypeCode  IN ('183', '187', '188')
    
  --申购买入,申购卖出,申购中签,新股上市
  INSERT INTO #tt_portfolioRawJrnl(serialNO, orderID, occurDate, fundAcctCode, secuAcctCode, 
                                   prodCode, prodCellCode, investPortfolioCode,
                                   transactionNO, currencyCode, marketLevelCode, 
                                   exchangeCode, secuCode, originSecuCode,
                                   secuTradeTypeCode, secuBizTypeCode, bizSubTypeCode,
                                   openCloseFlagCode, longShortFlagCode, hedgeFlagCode,
                                   buySellFlagCode, matchQty,
                                   matchNetPrice, matchSettleAmt, matchTradeFeeAmt,
                                   cashSettleAmt, costChgAmt, rlzChgProfit)
                            SELECT MAX(serialNO), 0, settleDate, fundAcctCode, secuAcctCode,
                                   MAX(prodCode), prodCellCode, investPortfolioCode,
                                   MAX(transactionNO), MAX(currencyCode), MAX(marketLevelCode),
                                   exchangeCode, secuCode, MAX(originSecuCode),
                                   MAX(secuTradeTypeCode), secuBizTypeCode, MAX(bizSubTypeCode),
                                   openCloseFlagCode, '1', MAX(hedgeFlagCode),
                                   MAX(buySellFlagCode), SUM(ABS(matchQty)),
                                   CASE WHEN SUM(matchQty) = 0 THEN 0
                                        ELSE SUM(matchQty * matchNetPrice) / SUM(matchQty)END,
                                   SUM(matchSettleAmt), SUM(matchTradeFeeAmt),
                                   SUM(cashSettleAmt), SUM(-cashSettleAmt), 0
                              FROM sims2016TradeHist..prodRawJrnlESHist a 
                             WHERE settleDate >= @i_beginDate
                               AND settleDate <= @v_today
                               AND (@i_exchangeCode = '' OR CHARINDEX(a.exchangeCode, @i_exchangeCode) > 0) 
                               AND (@i_secuCode = '' OR CHARINDEX(a.secuCode, @i_secuCode) > 0 OR CHARINDEX(a.secuCode, @i_secuCode) > 0)
                               AND exchangeCode != ''
                               AND secuCode != ''
                               AND secuBizTypeCode IN ('103', '105', '106', '107')
                               AND matchQty != 0
                          GROUP BY settleDate, fundAcctCode, secuAcctCode, prodCellCode, exchangeCode, secuCode, openCloseFlagCode, secuBizTypeCode, investPortfolioCode
                          ORDER BY fundAcctCode, settleDate, exchangeCode, a.secuCode, prodCellCode, investPortfolioCode, secuBizTypeCode, openCloseFlagCode
                                   
  --配股缴款
  INSERT INTO #tt_portfolioRawJrnl(serialNO, orderID, occurDate, fundAcctCode, secuAcctCode, 
                                   prodCode, prodCellCode, investPortfolioCode,
                                   transactionNO, currencyCode, marketLevelCode, 
                                   exchangeCode, secuCode, originSecuCode,
                                   secuTradeTypeCode, secuBizTypeCode, bizSubTypeCode,
                                   openCloseFlagCode, longShortFlagCode, hedgeFlagCode,
                                   buySellFlagCode, matchQty,
                                   matchNetPrice, matchSettleAmt, matchTradeFeeAmt,
                                   cashSettleAmt, costChgAmt, rlzChgProfit)
                            SELECT MAX(serialNO), 0, settleDate, fundAcctCode, secuAcctCode,
                                   MAX(prodCode), prodCellCode, investPortfolioCode,
                                   MAX(transactionNO), MAX(currencyCode), MAX(marketLevelCode),
                                   exchangeCode, secuCode, MAX(originSecuCode),
                                   MAX(secuTradeTypeCode), secuBizTypeCode, MAX(bizSubTypeCode),
                                   openCloseFlagCode, '1', MAX(hedgeFlagCode),
                                   MAX(buySellFlagCode), SUM(ABS(matchQty)),
                                   CASE WHEN SUM(matchQty) = 0 THEN 0
                                        ELSE SUM(matchQty * matchNetPrice) / SUM(matchQty)END,
                                   SUM(matchSettleAmt), SUM(matchTradeFeeAmt),
                                   SUM(cashSettleAmt), SUM(-cashSettleAmt), 0
                              FROM sims2016TradeHist..prodRawJrnlESHist a 
                             WHERE settleDate >= @i_beginDate
                                   AND settleDate <= @v_today
                                   AND (@i_exchangeCode = '' OR CHARINDEX(a.exchangeCode, @i_exchangeCode) > 0) 
                                   AND (@i_secuCode = '' OR CHARINDEX(a.secuCode, @i_secuCode) > 0 OR CHARINDEX(a.secuCode, @i_secuCode) > 0)
                                   AND exchangeCode != ''
                                   AND secuCode != ''
                                   AND secuBizTypeCode IN ('123')
                                   AND matchQty != 0
                                   AND (cashBalanceAmt != 0 OR matchSettleAmt != 0 OR dataSourceFlagCode != '0')
                              GROUP BY settleDate, fundAcctCode, secuAcctCode, prodCellCode, exchangeCode, secuCode, openCloseFlagCode, secuBizTypeCode, investPortfolioCode
                              ORDER BY fundAcctCode, settleDate, exchangeCode, a.secuCode, prodCellCode, investPortfolioCode, secuBizTypeCode, openCloseFlagCode
                                                                                                                                                           
  ---------------------------------- 非交易过户的配股上市
  -- 注意,对于配股上市,当前根据交易流水中的 PGSS记录直接进行处理(后续尚将考虑另外一个异常方案:即柜台无配股上市流水的情况,也应该由系统自动根据权益信息补充原始的配股上市流水)。
  INSERT INTO #tt_portfolioRawJrnl(serialNO, orderID, occurDate, fundAcctCode, secuAcctCode, 
                                   prodCode, prodCellCode, investPortfolioCode,
                                   transactionNO, currencyCode, marketLevelCode, 
                                   exchangeCode, secuCode, originSecuCode,
                                   secuTradeTypeCode, secuBizTypeCode, bizSubTypeCode,
                                   openCloseFlagCode, longShortFlagCode, hedgeFlagCode,
                                   buySellFlagCode, matchQty,
                                   matchNetPrice, matchSettleAmt, matchTradeFeeAmt,
                                   cashSettleAmt, costChgAmt, rlzChgProfit)
                            SELECT serialNO, 100, settleDate, fundAcctCode, secuAcctCode, 
                                   prodCode, prodCellCode, investPortfolioCode,
                                   transactionNO, currencyCode, marketLevelCode, 
                                   exchangeCode, secuCode, originSecuCode,
                                   secuTradeTypeCode, secuBizTypeCode, bizSubTypeCode,
                                   openCloseFlagCode, ' ', hedgeFlagCode,
                                   buySellFlagCode, matchQty,
                                   matchNetPrice, matchSettleAmt, matchTradeFeeAmt,
                                   cashSettleAmt, 0, 0
                              FROM sims2016TradeHist..prodRawJrnlESHist a 
                             WHERE settleDate >= @i_beginDate
                                   AND (@i_exchangeCode = '' OR CHARINDEX(exchangeCode, @i_exchangeCode) > 0) 
                                   AND (@i_secuCode = '' OR CHARINDEX(secuCode, @i_secuCode) > 0 )
                                   AND secuBizTypeCode  IN ('124')
                                   AND matchQty > 0
                             ORDER BY fundAcctCode, settleDate                                                  
                                                                            
  INSERT INTO #tt_portfolioRawJrnl(serialNO, orderID, occurDate, fundAcctCode, secuAcctCode, prodCode,
                                   prodCellCode, investPortfolioCode, transactionNO, currencyCode,
                                   marketLevelCode, exchangeCode, secuCode, originSecuCode,
                                   secuTradeTypeCode, secuBizTypeCode, bizSubTypeCode, openCloseFlagCode,
                                   longShortFlagCode, hedgeFlagCode, buySellFlagCode, matchQty,
                                   matchNetPrice, matchSettleAmt, matchTradeFeeAmt, cashSettleAmt,
                                   costChgAmt, rlzChgProfit)
                            SELECT serialNO, 0, settleDate, fundAcctCode, secuAcctCode, prodCode,
                                   prodCellCode, investPortfolioCode, transactionNO, currencyCode,
                                   marketLevelCode, exchangeCode, secuCode, ' ', 
                                   secuTradeTypeCode, secuBizTypeCode, 'S1', '1',
                                   '1', hedgeFlagCode, '1', ABS(matchQty),
                                   CASE WHEN matchQty = 0 THEN 0
                                        ELSE investCostAmt / matchQty END, 0, 0, 0,
                                   investCostAmt, 0
                              FROM sims2016TradeHist..prodCellInOutESHist a
                             WHERE secuBizTypeCode = '8101'
                                   AND settleDate >= @v_realBeginDate
                                   AND settleDate <= @v_today
                                   AND (@i_fundAcctCode = '' OR CHARINDEX(fundAcctCode, @i_fundAcctCode) > 0)
                                   AND (@i_exchangeCode = '' OR CHARINDEX(exchangeCode, @i_exchangeCode) > 0)
                                   AND (@i_secuCode  = '' OR CHARINDEX(secuCode, @i_secuCode) > 0 OR CHARINDEX(','+a.originSecuCode+',', @i_secuCode) > 0)
                             ORDER BY fundAcctCode, settleDate, exchangeCode, a.secuCode, prodCellCode, secuBizTypeCode      
             
  INSERT INTO #tt_portfolioRawJrnl(serialNO, orderID, occurDate, fundAcctCode, secuAcctCode, prodCode,
                                   prodCellCode, investPortfolioCode, transactionNO, currencyCode,
                                   marketLevelCode, exchangeCode, secuCode, originSecuCode,
                                   secuTradeTypeCode, secuBizTypeCode, bizSubTypeCode, openCloseFlagCode,
                                   longShortFlagCode, hedgeFlagCode, buySellFlagCode, matchQty,
                                   matchNetPrice, matchSettleAmt, matchTradeFeeAmt, cashSettleAmt,
                                   costChgAmt, rlzChgProfit)
                            SELECT serialNO, 0, settleDate, fundAcctCode, secuAcctCode, prodCode,
                                   prodCellCode, investPortfolioCode, transactionNO, currencyCode,
                                   marketLevelCode, exchangeCode, secuCode, ' ',
                                   secuTradeTypeCode, secuBizTypeCode, 'S1', 'A',
                                   '1', hedgeFlagCode, '1', ABS(matchQty),
                                   CASE WHEN matchQty = 0 THEN 0
                                        ELSE investCostAmt / matchQty END, 0, 0, 0,
                                   investCostAmt, 0
                              FROM sims2016TradeHist..prodCellInOutESHist a
                             WHERE secuBizTypeCode = '8103'
                                   AND settleDate >= @v_realBeginDate
                                   AND settleDate <= @v_today
                                   AND (@i_fundAcctCode = '' OR CHARINDEX(fundAcctCode, @i_fundAcctCode) > 0)
                                   AND (@i_exchangeCode = '' OR CHARINDEX(exchangeCode, @i_exchangeCode) > 0)
                                   AND (@i_secuCode  = '' OR CHARINDEX(secuCode, @i_secuCode) > 0 OR CHARINDEX(','+a.originSecuCode+',', @i_secuCode) > 0)
                             ORDER BY fundAcctCode, settleDate, exchangeCode, a.secuCode, prodCellCode, secuBizTypeCode
                             
  insert into #tt_sgwtb(settleDate,occurTime,exchangeCode,secuCode,fundAcctCode,prodCellCode,investPortfolioCode,macthQty) 
				         SELECT tradeDate,tradeTime,exchangeCode,secuCode,fundAcctCode,prodCellCode,investPortfolioCode,orderQty
                   FROM sims2016TradeHist..prodCellOrderESHist a 
                  where secuBizTypeCode = 'SG' 
                   AND (@i_fundAcctCode = '' OR CHARINDEX(fundAcctCode, @i_fundAcctCode) > 0)
                   AND (@i_exchangeCode = '' OR CHARINDEX(exchangeCode, @i_exchangeCode) > 0)
                   AND (@i_secuCode  = '' OR CHARINDEX(secuCode, @i_secuCode) > 0 )
               order by fundAcctCode,tradeDate, exchangeCode, secuCode, prodCellCode, investPortfolioCode    
               
               --select * from   #tt_sgwtb                                                                                 
  --逐条处理
  DECLARE @o_fundAcctCode VARCHAR(20)
  SELECT @o_fundAcctCode = NULL
  --游标变量begin
  DECLARE
    @v_serialNO                 NUMERIC(20,0),                   --记录序号
    @v_orderID                  NUMERIC(5, 0),                   --排序Id
    @v_settleDate               VARCHAR(10),                     --发生日期
    @v_shareRecordDate          VARCHAR(10),                     --登记日期
    @v_fundAcctCode             VARCHAR(20),                     --资金账户
    @v_exchangeCode             VARCHAR(6),                      --交易所代码
    @v_secuCode                 VARCHAR(6),                      --证券代码
    @v_originSecuCode           VARCHAR(15),                     --原始证券代码
    @v_secuName                 VARCHAR(64),                     --证券名称
    @v_secuTradeTypeCode        VARCHAR(5),                      --证券类别
    @v_prodCellCode             VARCHAR(20),                     --产品单元代码
    @v_prodCode                 VARCHAR(20),                     --产品代码
    @v_investPortfolioCode      VARCHAR(20),                     --投资组合代码
    @v_buySellFlagCode          VARCHAR(1),                      --买卖类别
    @v_openCloseFlagCode        VARCHAR(16),                     --开平标志
    @v_marketLevelCode          VARCHAR(1),                      --市场来源
    @v_currencyCode             VARCHAR(6),                      --货币代码
    @v_hedgeFlagCode            VARCHAR(16),                     --投保标志
    @v_secuBizTypeCode          VARCHAR(16),                     --业务类型
    @v_matchQty                 NUMERIC(10,0),                   --成交数量
    @v_matchNetPrice            NUMERIC(10,2),                   --成交价格
    @v_cashCurrentSettleAmt     NUMERIC(19,2),                   --资金发生数
    @v_matchTradeFeeAmt         NUMERIC(19,2),                   --手续费
    @v_matchSettleAmt           NUMERIC(19,2),                   --成交结算金额
    @v_costChgAmt               NUMERIC(19,2),                   --移动平均成本变动
    @v_rlzChgProfit             NUMERIC(19,2),                    --实现盈亏变动
    @v_secuAcctCode             VARCHAR(20)--证券账户代码


  --游标变量end
  DECLARE for_mccjb CURSOR FOR SELECT serialNO, orderID, occurDate, shareRecordDate,
                                      fundAcctCode, secuAcctCode, prodCode, investPortfolioCode,
                                      exchangeCode, secuCode,originSecuCode,
                                      '', secuTradeTypeCode,prodCellCode, 
                                      buySellFlagCode, openCloseFlagCode,secuBizTypeCode,
                                      marketLevelCode, currencyCode, hedgeFlagCode,
                                      matchQty, matchNetPrice, cashSettleAmt, 
                                      matchTradeFeeAmt, matchSettleAmt,costChgAmt,
                                      rlzChgProfit
                                 FROM #tt_portfolioRawJrnl 
                             ORDER BY fundAcctCode, exchangeCode, secuCode, occurDate, orderID, buySellFlagCode DESC, serialNO 
  OPEN for_mccjb
  FETCH for_mccjb INTO @v_serialNO, @v_orderID, @v_settleDate, @v_shareRecordDate, @v_fundAcctCode, @v_secuAcctCode,@v_prodCode, @v_investPortfolioCode, 
                       @v_exchangeCode, @v_secuCode, @v_originSecuCode,@v_secuName, @v_secuTradeTypeCode, 
                       @v_prodCellCode, @v_buySellFlagCode, @v_openCloseFlagCode, @v_secuBizTypeCode, @v_marketLevelCode, @v_currencyCode, @v_hedgeFlagCode, 
                       @v_matchQty, @v_matchNetPrice, @v_cashCurrentSettleAmt, @v_matchTradeFeeAmt, @v_matchSettleAmt, 
                       @v_costChgAmt, @v_rlzChgProfit
                                                                                       
  WHILE 1 = 1
    BEGIN    
      IF @o_fundAcctCode IS NOT NULL AND (@o_fundAcctCode != @v_fundAcctCode OR @@FETCH_STATUS != 0)  
        BEGIN   
          INSERT INTO sims2016TradeHist..portfolioCheckJrnlESHist(createPosiDate, settleDate, prodCode, prodCellCode,
                                                                  fundAcctCode, secuAcctCode, currencyCode, exchangeCode, secuCode,
                                                                  originSecuCode, secuTradeTypeCode, marketLevelCode, transactionNO,
                                                                  investPortfolioCode, buySellFlagCode, bizSubTypeCode,
                                                                  openCloseFlagCode, longShortFlagCode, hedgeFlagCode,
                                                                  secuBizTypeCode, matchQty, matchNetPrice, matchSettleAmt,
                                                                  matchTradeFeeAmt, cashSettleAmt, costChgAmt,
                                                                  occupyCostChgAmt, rlzChgProfit, investCostChgAmt,
                                                                  investOccupyCostChgAmt, investRlzChgProfit)
                                                           SELECT createPosiDate, occurDate, prodCode, prodCellCode,
                                                                  fundAcctCode, secuAcctCode, currencyCode, exchangeCode, secuCode,
                                                                  originSecuCode, secuTradeTypeCode, marketLevelCode, 1,
                                                                  investPortfolioCode, buySellFlagCode, 'S1',
                                                                  openCloseFlagCode, '1', hedgeFlagCode,
                                                                  secuBizTypeCode, matchQty, matchNetPrice, matchSettleAmt,
                                                                  matchTradeFeeAmt, cashSettleAmt, costChgAmt,
                                                                  occupyCostChgAmt, rlzChgProfit, costChgAmt,
                                                                  occupyCostChgAmt, rlzChgProfit
                                                             FROM #tt_portfolioCheckJrnlES;


          INSERT INTO sims2016TradeHist..prodCellRawJrnlHist(settleDate,
                                                             prodCode, prodCellCode, fundAcctCode, secuAcctCode, currencyCode,
                                                             exchangeCode, secuCode, originSecuCode, secuTradeTypeCode,
                                                             marketLevelCode, buySellFlagCode, bizSubTypeCode,
                                                             openCloseFlagCode, hedgeFlagCode, secuBizTypeCode,
                                                             matchQty, matchNetPrice , cashSettleAmt, dataSourceFlagCode)
                                                             --, costChgAmt, occupyCostChgAmt, rlzChgProfit, investCostChgAmt, investOccupyCostChgAmt, investRlzChgProfit
                                                             --注掉的部分字段采用default方式生成)
                                                      SELECT occurDate,
                                                             prodCode, prodCellCode, fundAcctCode, ' ', currencyCode,
                                                             exchangeCode, secuCode, originSecuCode, secuTradeTypeCode,
                                                             '2', buySellFlagCode, ' ',
                                                             openCloseFlagCode, hedgeFlagCode, secuBizTypeCode,
                                                             matchQty, matchNetPrice, cashSettleAmt, '0'
                                                        FROM #tt_portfolioCheckJrnlES
                                                       WHERE secuBizTypeCode  IN ('183', '187', '188'); --送红股派息证券业务类型
          TRUNCATE TABLE  #tt_portfolioCheckJrnlES
        END
    
    IF @@FETCH_STATUS != 0
      break
        
    IF @o_fundAcctCode IS NULL OR (@v_fundAcctCode != @o_fundAcctCode) 
      BEGIN
        SELECT @o_fundAcctCode = @v_fundAcctCode
        TRUNCATE TABLE #tt_portfolioCreatePosiDate
        TRUNCATE TABLE #tt_portfolioCreatePosiDateSum
        --取快照表(TODO)
        --取历史核算流水表
       
        INSERT INTO #tt_portfolioCreatePosiDate(exchangeCode, secuCode, prodCellCode, investPortfolioCode,
                                                createPosiDate, posiQty, costChgAmt, lastCreatePosiDate)
                                         SELECT exchangeCode, secuCode, prodCellCode, investPortfolioCode,
                                                MAX(createPosiDate), SUM(matchQty), SUM(costChgAmt), MAX(settleDate)
                                           FROM sims2016TradeHist..prodCellCheckJrnlESHist
                                          WHERE settleDate < @v_realBeginDate -- AND settleDate > 快照日期 (待后续快照表设计好后加上此条件)
                                            AND fundAcctCode = @v_fundAcctCode
                                            AND (@i_exchangeCode = '' OR CHARINDEX(exchangeCode, @i_exchangeCode) > 0)
                                            AND (@i_secuCode = '' OR CHARINDEX(secuCode, @i_secuCode) > 0 )
                                          GROUP BY exchangeCode, secuCode, prodCellCode, investPortfolioCode
                                          HAVING SUM(matchQty) > 0
    


        INSERT INTO #tt_portfolioCreatePosiDateSum(exchangeCode, secuCode, prodCellCode, investPortfolioCode,
                                                   createPosiDate, posiQty, costChgAmt, lastestoperateDate)
                                            SELECT exchangeCode, secuCode, prodCellCode, investPortfolioCode,
                                                   MAX(createPosiDate), SUM(posiQty), SUM(costChgAmt), MAX(lastCreatePosiDate)
                                              FROM #tt_portfolioCreatePosiDate
                                             GROUP BY exchangeCode, secuCode, prodCellCode, createPosiDate, investPortfolioCode
                                            HAVING SUM(posiQty) > 0
                                                                                                       
                   --配股缴款过程中的持仓(含:配股权证到账,配股缴款权证减少,配股缴款证券增加,配股上市转出,配股摘牌)
        INSERT #tt_portfolioCreatePosiDateAllotment(exchangeCode, secuCode, secuCode0, secuBizTypeCode, prodCellCode, createPosiDate, posiQty, costChgAmt, lastestoperateDate
          )
                                             SELECT exchangeCode, secuCode, prodCellCode, MAX(createPosiDate) AS  createPosiDate, 
                                                    SUM(matchQty) AS  posiQty, SUM(costChgAmt) AS  ydpjcb, MAX(createPosiDate) AS  lastestoperateDate, secuCode, secuBizTypeCode
                                               FROM sims2016TradeHist..portfolioCheckJrnlESHist a
                                              WHERE settleDate < @i_beginDate
                                                    AND fundAcctCode = @v_fundAcctCode
                                                    AND (@i_exchangeCode = '' OR CHARINDEX(a.exchangeCode, @i_exchangeCode) > 0) AND (@i_secuCode = '' OR CHARINDEX(secuCode, @i_secuCode) > 0)
                                                    AND secuBizTypeCode = 'JK'
                                              GROUP BY exchangeCode, secuCode, prodCellCode, secuCode, secuBizTypeCode
                                                                                                      
        TRUNCATE TABLE #tt_portfolioCheckJrnl_old
        --取快照表(TODO)
       
        INSERT INTO #tt_portfolioCheckJrnl_old(operateDate, exchangeCode, secuCode, prodCellCode,investPortfolioCode, posiQty)
                                        SELECT settleDate, exchangeCode, secuCode, prodCellCode, investPortfolioCode, SUM(matchQty)
                                          FROM sims2016TradeHist..prodCellCheckJrnlESHist
                                         WHERE settleDate < @v_realBeginDate -- AND settleDate > 快照日期 (待后续快照表设计好后加上此条件)
                                               AND fundAcctCode = @v_fundAcctCode
                                               AND (@i_exchangeCode = '' OR CHARINDEX(exchangeCode, @i_exchangeCode) > 0)
                                               AND (@i_secuCode = '' OR CHARINDEX(secuCode, @i_secuCode) > 0 )
                                         GROUP BY settleDate, exchangeCode, secuCode, prodCellCode, investPortfolioCode
                                        HAVING SUM(matchQty) != 0;  
        --SELECT * FROM #tt_portfolioCheckJrnl_old
      END
   
    IF @v_exchangeCode = '' AND @v_secuCode = '' 
      BEGIN
        TRUNCATE TABLE tt_portfolioCreatePosiDateSum
      END
    ELSE IF @v_secuBizTypeCode  IN ('122')      --配股业务 
      BEGIN
        TRUNCATE TABLE #tt_portfolioPosiQtyDetial
        TRUNCATE TABLE #tt_portfolioPosiQtySum
        
        INSERT #tt_portfolioPosiQtyDetial (createPosiDate,prodCellCode,investPortfolioCode ,
                                           posiQty,matchQty,costChgAmt)
                                    SELECT @v_settleDate, prodCellCode, investPortfolioCode, SUM(posiQty), 0, 0
                                      FROM #tt_portfolioCheckJrnl_old
                                     WHERE operateDate <= @v_shareRecordDate AND exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode 
                                     GROUP BY prodCellCode, investPortfolioCode                                 
                                    HAVING SUM(posiQty) > 0


        INSERT #tt_portfolioPosiQtyDetial (createPosiDate, prodCellCode,investPortfolioCode , posiQty, matchQty, costChgAmt)
                                   SELECT @v_settleDate, prodCellCode,investPortfolioCode, SUM(matchQty), 0, 0
                                     FROM #tt_portfolioCheckJrnlES
                                    WHERE occurDate <= @v_shareRecordDate AND exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode 
                                 GROUP BY prodCellCode, investPortfolioCode                                 
                               HAVING SUM(matchQty) != 0
                                                              
        INSERT INTO #tt_portfolioPosiQtySum(createPosiDate, prodCellCode, investPortfolioCode, posiQty, matchQty, costChgAmt, rlzChgProfit)
                                    SELECT @v_settleDate, prodCellCode, investPortfolioCode, SUM(posiQty), 0, 0, 0
                                      FROM #tt_portfolioPosiQtyDetial
                                     GROUP BY prodCellCode, investPortfolioCode
                                    HAVING SUM(posiQty) > 0 
                                                                                                                                                    
        IF EXISTS (SELECT * FROM #tt_portfolioPosiQtySum)
          BEGIN   
            SELECT @v_posiQty = SUM(posiQty) FROM #tt_portfolioPosiQtySum
            SELECT @v_matchQty, @v_posiQty    


            UPDATE #tt_portfolioPosiQtySum SET matchQty = FLOOR(ROUND(posiQty * @v_matchQty  / CONVERT(FLOAT, @v_posiQty), 4) )
            
            SELECT @v_matchQty = @v_matchQty - SUM(matchQty) FROM #tt_portfolioPosiQtySum
            
            IF @v_matchQty != 0  OR @v_costChgAmt != 0 OR @v_rlzChgProfit != 0 -- 尾数
              BEGIN
                SET rowcount 1
                SELECT @v_tempCellCode = prodCellCode FROM #tt_portfolioPosiQtySum ORDER BY posiQty DESC
                UPDATE #tt_portfolioPosiQtySum SET matchQty = matchQty + @v_matchQty WHERE prodCellCode = @v_tempCellCode
                SET rowcount 0
              END


            IF NOT EXISTS (SELECT * FROM #tt_portfolioCreatePosiDateSum WHERE exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode AND prodCellCode = @v_fundAcctCode)
              INSERT #tt_portfolioCreatePosiDateSum (exchangeCode, secuCode, prodCellCode, investPortfolioCode, createPosiDate, posiQty, costChgAmt, lastestoperateDate)
                     SELECT @v_exchangeCode, @v_secuCode, @v_fundAcctCode, @v_investPortfolioCode,@v_settleDate, @v_matchQty, 0, @v_settleDate
            ELSE
              BEGIN
                UPDATE #tt_portfolioCreatePosiDateSum SET posiQty = posiQty + @v_matchQty
                       WHERE exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode AND prodCellCode = @v_fundAcctCode
              END
          END
        ELSE-- 未找到正股持仓
          BEGIN
            IF NOT EXISTS (SELECT * FROM #tt_portfolioCreatePosiDateSum WHERE exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode AND prodCellCode = @v_fundAcctCode)
              INSERT #tt_portfolioCreatePosiDateSum (exchangeCode, secuCode, prodCellCode,investPortfolioCode, createPosiDate, posiQty, costChgAmt, lastestoperateDate)
                     SELECT @v_exchangeCode, @v_secuCode, @v_fundAcctCode, @v_investPortfolioCode, @v_settleDate, @v_matchQty, 0, @v_settleDate
            ELSE
              BEGIN
                UPDATE #tt_portfolioCreatePosiDateSum SET posiQty = posiQty + @v_matchQty
                       WHERE exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode AND prodCellCode = @v_fundAcctCode
              END
  
            INSERT #tt_portfolioPosiQtySum (createPosiDate, prodCellCode, investPortfolioCode , posiQty, matchQty, costChgAmt, rlzChgProfit)
                   SELECT @v_settleDate, @v_fundAcctCode,@v_investPortfolioCode, 0, @v_matchQty, 0, 0
          END


        INSERT INTO #tt_portfolioCheckJrnlES(serialNO, createPosiDate, occurDate, fundAcctCode,
                                             secuAcctCode, exchangeCode, secuCode, originSecuCode, secuName,
                                             secuTradeTypeCode, prodCellCode, prodCode, investPortfolioCode,
                                             buySellFlagCode, openCloseFlagCode, secuBizTypeCode,
                                             currencyCode, marketLevelCode, hedgeFlagCode, matchQty,
                                             matchNetPrice, cashSettleAmt, matchSettleAmt,
                                             matchTradeFeeAmt, costChgAmt, occupyCostChgAmt, rlzChgProfit)
                                      SELECT @v_serialNO, @v_createPosiDate, @v_settleDate, @v_fundAcctCode,
                                             @v_secuAcctCode, @v_exchangeCode, @v_secuCode, @v_originSecuCode, ' ',
                                             @v_secuTradeTypeCode, prodCellCode, @v_prodCode, investPortfolioCode,
                                             @v_buySellFlagCode, @v_openCloseFlagCode, @v_secuBizTypeCode,
                                             @v_currencyCode, @v_marketLevelCode, @v_hedgeFlagCode, matchQty,
                                             @v_matchNetPrice, @v_cashCurrentSettleAmt, @v_matchTradeFeeAmt,
                                             @v_matchSettleAmt, @v_costChgAmt, @v_costChgAmt, @v_rlzChgProfit
                                        FROM #tt_portfolioPosiQtySum


        -- 更新或者增加持仓
        UPDATE a SET posiQty = a.posiQty + b.matchQty
                 FROM #tt_portfolioCreatePosiDateAllotment a 
                 INNER JOIN #tt_portfolioPosiQtySum b ON a.exchangeCode = @v_exchangeCode AND a.secuCode = @v_secuCode AND a.secuCode0 = @v_secuCode AND a.prodCellCode = b.prodCellCode          


        insert #tt_portfolioCreatePosiDateAllotment (exchangeCode, secuCode, secuCode0, secuBizTypeCode, prodCellCode, createPosiDate, posiQty, costChgAmt, lastestoperateDate)
                             SELECT exchangeCode, secuCode, secuCode0, secuBizTypeCode, prodCellCode, createPosiDate, matchQty, costChgAmt, lastestoperateDate
                                     FROM (SELECT @v_exchangeCode AS  exchangeCode, @v_secuCode AS  secuCode, @v_secuCode AS  secuCode0, 'JK' AS  secuBizTypeCode, a.prodCellCode, @v_settleDate AS  createPosiDate, a.matchQty, 0 AS  costChgAmt, @v_settleDate AS  lastestoperateDate, b.createPosiDate AS  createPosiDate_y
                                                  FROM #tt_portfolioPosiQtySum a 
                                                  LEFT JOIN #tt_portfolioCreatePosiDateAllotment b ON a.prodCellCode = b.prodCellCode AND b.exchangeCode = @v_exchangeCode AND b.secuCode = @v_secuCode AND b.secuCode0 = @v_secuCode
                                          )x
                                          WHERE x.createPosiDate_y IS NULL
                                  
      END        
    ELSE IF @v_secuBizTypeCode  IN ('123')
      BEGIN
        -- 配股权证持仓减少
        SELECT @v_createPosiDate = NULL
        SELECT @v_createPosiDate = createPosiDate FROM #tt_portfolioCreatePosiDateAllotment WHERE exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode  AND prodCellCode = @v_prodCellCode          


        IF @v_createPosiDate IS NOT NULL
          BEGIN              
            UPDATE #tt_portfolioCreatePosiDateAllotment SET posiQty = posiQty - @v_matchQty
                   WHERE exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode AND prodCellCode = @v_prodCellCode


            INSERT #tt_portfolioCheckJrnlES(serialNO, createPosiDate, occurDate, fundAcctCode,
                                           secuAcctCode, exchangeCode, secuCode, originSecuCode, secuName,
                                           secuTradeTypeCode, prodCellCode, prodCode, investPortfolioCode,
                                           buySellFlagCode, openCloseFlagCode, secuBizTypeCode,
                                           currencyCode, marketLevelCode, hedgeFlagCode, matchQty,
                                           matchNetPrice, cashSettleAmt, matchSettleAmt,
                                           matchTradeFeeAmt, costChgAmt, occupyCostChgAmt, rlzChgProfit)
                                    SELECT @v_serialNO, @v_createPosiDate, @v_settleDate, @v_fundAcctCode,
                                           @v_secuAcctCode ,@v_exchangeCode, @v_secuCode, @v_originSecuCode, ' ', 
                                            '1231', 
                                           @v_prodCellCode, @v_prodCode, @v_investPortfolioCode,
                                           @v_buySellFlagCode, @v_openCloseFlagCode, 'JK', 
                                           @v_currencyCode, @v_marketLevelCode, @v_hedgeFlagCode, -1 *@v_matchQty,
                                           0 ,ROUND(0, 2), ROUND(0, 2),
                                           0, 0, 0, 0
          END


        --配股(正股未上市)持仓增加
        SELECT @v_createPosiDate = NULL
        SELECT @v_createPosiDate = createPosiDate, @v_posiQty = posiQty, @v_lastSettleDate = lastestoperateDate FROM #tt_portfolioCreatePosiDateAllotment
               WHERE exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode AND prodCellCode = @v_prodCellCode
        IF @v_createPosiDate IS NULL
          BEGIN
            INSERT #tt_portfolioCreatePosiDateAllotment (exchangeCode, secuCode, secuCode0, secuBizTypeCode, prodCellCode, investPortfolioCode, createPosiDate, posiQty, costChgAmt, lastestoperateDate)
                                SELECT @v_exchangeCode, @v_secuCode, @v_secuCode, 'JK', @v_prodCellCode,@v_investPortfolioCode, @v_settleDate, @v_matchQty, @v_costChgAmt, @v_settleDate
            SELECT @v_createPosiDate = @v_settleDate
          END
        ELSE
          BEGIN
            UPDATE #tt_portfolioCreatePosiDateAllotment SET createPosiDate = @v_createPosiDate, posiQty = posiQty + @v_matchQty, costChgAmt = costChgAmt + @v_costChgAmt, lastestoperateDate = @v_settleDate
                   WHERE exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode AND prodCellCode = @v_prodCellCode
          END


        INSERT #tt_portfolioCheckJrnlES(serialNO, createPosiDate, occurDate, fundAcctCode,
                                        secuAcctCode, exchangeCode, secuCode, originSecuCode, secuName,
                                        secuTradeTypeCode, prodCellCode, prodCode, investPortfolioCode,
                                        buySellFlagCode, openCloseFlagCode, secuBizTypeCode,
                                        currencyCode, marketLevelCode, hedgeFlagCode, matchQty,
                                        matchNetPrice, cashSettleAmt, matchSettleAmt,
                                        matchTradeFeeAmt, costChgAmt, occupyCostChgAmt, rlzChgProfit) 
                                 SELECT @v_serialNO, @v_createPosiDate, @v_settleDate, @v_fundAcctCode,
                                        @v_secuAcctCode ,@v_exchangeCode, @v_secuCode, @v_originSecuCode, ' ', 
                                        '1232', 
                                        @v_prodCellCode, @v_prodCode, @v_investPortfolioCode,
                                        @v_buySellFlagCode, @v_openCloseFlagCode, 'JK', 
                                        @v_currencyCode, @v_marketLevelCode, @v_hedgeFlagCode, @v_matchQty,
                                        @v_matchNetPrice, @v_cashCurrentSettleAmt, @v_matchSettleAmt,
                                        @v_matchTradeFeeAmt, @v_costChgAmt, 0, @v_rlzChgProfit
      END 
    ELSE IF(@v_secuBizTypeCode = '124')      -- 配股上市。
      BEGIN
          --找到配股缴款的持仓 以及信托单元,然后按缴款持仓进行拆分。            
        WHILE @v_matchQty > 0
          BEGIN
            SELECT @temp_mr_prodCellCode = NULL
            SELECT top 1 
                   @temp_mr_prodCellCode = prodCellCode,
                   @temp_mr_investPortfolioCode = investPortfolioCode ,
                   @temp_mr_secuCode = secuCode,
                   @temp_mr_matchQty = ABS(posiQty),                                
                   @temp_mr_costChgAmt = costChgAmt,
                   @temp_mr_per_costChgAmt = costChgAmt / ABS(posiQty), 
                   @temp_mr_createPosiDate = createPosiDate 
              FROM #tt_portfolioCreatePosiDateAllotment
              WHERE exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode AND secuCode0 = @v_secuCode AND abs(posiQty) > 0
              ORDER BY createPosiDate, prodCellCode, investPortfolioCode


            IF @temp_mr_prodCellCode IS NOT NULL
              begin
                IF @v_matchQty < @temp_mr_matchQty
                  SELECT @temp_mc_matchQty = @v_matchQty
                ELSE
                  SELECT @temp_mc_matchQty = @temp_mr_matchQty


                SELECT @v_matchQty = @v_matchQty - @temp_mc_matchQty


                IF @temp_mc_matchQty < @temp_mr_matchQty
                  BEGIN
                    SELECT @temp_mc_costChgAmt = ROUND(@temp_mc_matchQty * @temp_mr_per_costChgAmt, 2)                                    
                  END
                ELSE
                  BEGIN
                    SELECT @temp_mc_costChgAmt = @temp_mr_costChgAmt             
                  END


                IF @temp_mc_matchQty != @temp_mr_matchQty
                  SELECT @temp_mr_costChgAmt = ROUND(@temp_mr_per_costChgAmt * @temp_mc_matchQty, 2)


                SELECT @temp_mc_rlzChgProfit = -@temp_mc_costChgAmt - @temp_mr_costChgAmt


                SELECT @v_costChgAmt = @v_costChgAmt - @temp_mc_costChgAmt


                SELECT @v_cashCurrentSettleAmt = @v_cashCurrentSettleAmt - @temp_mc_cashCurrSettleAmt


                UPDATE #tt_portfolioCreatePosiDateAllotment SET posiQty = posiQty - @temp_mc_matchQty, 
                                              costChgAmt = costChgAmt - @temp_mr_costChgAmt,
                                              lastestoperateDate = @v_settleDate
                                              WHERE exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode AND prodCellCode = @temp_mr_prodCellCode
                                                                                          


                --配股上市转出记录
                INSERT #tt_portfolioCheckJrnlES(serialNO, createPosiDate, occurDate, fundAcctCode,
                                                secuAcctCode, exchangeCode, secuCode, originSecuCode, secuName,
                                                secuTradeTypeCode, prodCellCode, prodCode, investPortfolioCode,
                                                buySellFlagCode, openCloseFlagCode, secuBizTypeCode,
                                                currencyCode, marketLevelCode, hedgeFlagCode, matchQty,
                                                matchNetPrice, cashSettleAmt, matchSettleAmt,
                                                matchTradeFeeAmt, costChgAmt, occupyCostChgAmt, rlzChgProfit) 
                                         SELECT @v_serialNO, @temp_mr_createPosiDate, @v_settleDate, @v_fundAcctCode,
                                                @v_secuAcctCode ,@v_exchangeCode, @v_secuCode, @v_originSecuCode, ' ', 
                                                '1241', 
                                                @temp_mr_prodCellCode, @v_prodCode, @v_investPortfolioCode,
                                                'S', @v_openCloseFlagCode, 'JK', 
                                                @v_currencyCode, @v_marketLevelCode, @v_hedgeFlagCode, @temp_mc_matchQty * -1,
                                                 0, ISNULL(@v_cashCurrentSettleAmt, 0), @v_matchSettleAmt,
                                                 @v_matchTradeFeeAmt, @temp_mr_costChgAmt, 0, 0
                
                --配股上市转入
                SELECT @v_createPosiDate = NULL
                SELECT @v_createPosiDate = createPosiDate, @v_posiQty = posiQty, @v_lastSettleDate = lastestoperateDate FROM #tt_portfolioCreatePosiDateSum
                       WHERE exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode AND prodCellCode = @v_prodCellCode 


                IF @v_createPosiDate IS NULL
                  BEGIN
                    INSERT #tt_portfolioCreatePosiDateSum (exchangeCode, secuCode, prodCellCode, investPortfolioCode,
                                                           createPosiDate, posiQty, costChgAmt, lastestoperateDate)
                                                    SELECT @v_exchangeCode, @v_secuCode, @v_prodCellCode,@v_investPortfolioCode, @v_settleDate, @temp_mc_matchQty, @temp_mr_costChgAmt, @v_settleDate
                    SELECT @v_createPosiDate = @v_settleDate
                  END                 
                    ELSE
                      BEGIN
                        UPDATE #tt_portfolioCreatePosiDateSum SET createPosiDate = @v_createPosiDate, posiQty = posiQty + @temp_mc_matchQty, costChgAmt = costChgAmt + @temp_mr_costChgAmt, lastestoperateDate = @v_settleDate
                               WHERE exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode AND prodCellCode = @v_prodCellCode 
                      END


                        INSERT #tt_portfolioCheckJrnlES(serialNO, createPosiDate, occurDate, fundAcctCode,
                                                        secuAcctCode, exchangeCode, secuCode, originSecuCode, secuName,
                                                        secuTradeTypeCode, prodCellCode, prodCode, investPortfolioCode,
                                                        buySellFlagCode, openCloseFlagCode, secuBizTypeCode,
                                                        currencyCode, marketLevelCode, hedgeFlagCode, matchQty,
                                                        matchNetPrice, cashSettleAmt, matchSettleAmt,
                                                        matchTradeFeeAmt, costChgAmt, occupyCostChgAmt, rlzChgProfit) 
                                                 SELECT @v_serialNO, @temp_mr_createPosiDate, @v_settleDate, @v_fundAcctCode,
                                                        @v_secuAcctCode ,@v_exchangeCode, @v_secuCode, @v_originSecuCode, ' ', 
                                                        '1242', 
                                                        @temp_mr_prodCellCode, @v_prodCode, @v_investPortfolioCode,
                                                        'B', @v_openCloseFlagCode, 'PT', 
                                                        @v_currencyCode, @v_marketLevelCode, @v_hedgeFlagCode, @temp_mc_matchQty,
                                                        0, ISNULL(@v_cashCurrentSettleAmt, 0), @v_matchSettleAmt,
                                                        @v_matchTradeFeeAmt, @temp_mr_costChgAmt, 0, 0                  
                END
              ELSE -- 找不到对应的配股记录
                BEGIN
                  SELECT @v_createPosiDate = NULL
                  SELECT @v_createPosiDate = createPosiDate, @v_posiQty = posiQty, @v_lastSettleDate = lastestoperateDate FROM #tt_portfolioCreatePosiDateSum
                         WHERE exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode AND prodCellCode = @v_fundAcctCode


                  IF @v_createPosiDate IS NULL
                    BEGIN
                      INSERT #tt_portfolioCreatePosiDateSum (exchangeCode, secuCode, prodCellCode, investPortfolioCode,
                                                             createPosiDate, posiQty, costChgAmt, lastestoperateDate)
                                                      SELECT @v_exchangeCode, @v_secuCode, @v_fundAcctCode AS  prodCellCode, '', @v_settleDate, @v_matchQty, 0, @v_settleDate
                      SELECT @v_createPosiDate = @v_settleDate
                    END                 
                  ELSE
                    BEGIN
                      UPDATE #tt_portfolioCreatePosiDateSum SET createPosiDate = @v_createPosiDate, 
                                                                posiQty = posiQty + @v_matchQty, 
                                                                costChgAmt = costChgAmt + 0, 
                                                                lastestoperateDate = @v_settleDate
                                                          WHERE exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode AND prodCellCode = @v_prodCellCode 
                    END
                                           
                    INSERT #tt_portfolioCheckJrnlES(serialNO, createPosiDate, occurDate, fundAcctCode,
                                                    secuAcctCode, exchangeCode, secuCode, originSecuCode, secuName,
                                                    secuTradeTypeCode, prodCellCode, prodCode, investPortfolioCode,
                                                    buySellFlagCode, openCloseFlagCode, secuBizTypeCode,
                                                    currencyCode, marketLevelCode, hedgeFlagCode, matchQty,
                                                    matchNetPrice, cashSettleAmt, matchSettleAmt,
                                                    matchTradeFeeAmt, costChgAmt, occupyCostChgAmt, rlzChgProfit) 
                                             SELECT @v_serialNO, @temp_mr_createPosiDate, @v_settleDate, @v_fundAcctCode,
                                                    @v_secuAcctCode ,@v_exchangeCode, @v_secuCode, @v_originSecuCode, ' ', 
                                                    '1242', 
                                                    @v_fundAcctCode, @v_prodCode, @v_investPortfolioCode,
                                                    'B', @v_openCloseFlagCode, 'PT', 
                                                    @v_currencyCode, @v_marketLevelCode, @v_hedgeFlagCode, @v_matchQty,
                                                    0, 0, 0,
                                                    0, 0, 0, 0


                    BREAK
                END
            END
          SET rowcount 0
        END
        
    ELSE IF @v_secuBizTypeCode in ('103','106')
      BEGIN
        TRUNCATE TABLE #tt_portfolioPosiQtyDetial
    --  TRUNCATE TABLE #tt_portfolioPosiQtySum


        INSERT #tt_portfolioPosiQtyDetial (createPosiDate, prodCellCode,investPortfolioCode , posiQty, matchQty, costChgAmt)
                                    SELECT @v_settleDate, prodCellCode, investPortfolioCode, sum(macthQty), 0, 0
                                      FROM #tt_sgwtb
                                     WHERE exchangeCode = @v_exchangeCode AND fundAcctCode = @v_fundAcctCode
                                  GROUP BY settleDate, prodCellCode, investPortfolioCode 
                                  
        --select * from  #tt_portfolioPosiQtyDetial                    


        IF EXISTS (SELECT * FROM #tt_portfolioPosiQtyDetial)
          BEGIN
            SELECT @sgwtzsl = sum(posiQty) FROM #tt_portfolioPosiQtyDetial
            SELECT @mr_lastestUnit = CASE WHEN @v_exchangeCode = '0' THEN 500
                                          WHEN @v_exchangeCode = '1' THEN 1000 END


            SELECT @mr_lastestUnit = isnull(@mr_lastestUnit, 1)
            SELECT @sgwtzsl, '申购委托数量'
            UPDATE #tt_portfolioPosiQtyDetial SET matchQty = FLOOR(ROUND((posiQty  * @v_matchQty / CONVERT(money, @sgwtzsl)), 4) / @mr_lastestUnit) * @mr_lastestUnit,
                                      costChgAmt = FLOOR(ROUND((posiQty  * @v_matchQty / CONVERT(money, @sgwtzsl)), 4) / @mr_lastestUnit) * @mr_lastestUnit * ROUND(@v_matchNetPrice, 2)


            --select * from #tt_portfolioPosiQtyDetial 


            SELECT @v_matchQty = @v_matchQty - SUM(matchQty), @v_costChgAmt = @v_costChgAmt - SUM(costChgAmt) FROM #tt_portfolioPosiQtyDetial


            IF @v_matchQty != 0 OR @v_costChgAmt != 0 OR @v_rlzChgProfit != 0 -- 尾数
              BEGIN 
                WHILE(@v_matchQty >= @mr_lastestUnit)
                  BEGIN
                    DECLARE @tempprodCellCode VARCHAR(20)
                    SELECT top 1 @tempprodCellCode = prodCellCode FROM  #tt_sgwtb 
                                 WHERE exchangeCode = @v_exchangeCode  AND  fundAcctCode = @v_fundAcctCode
                                 ORDER BY macthQty DESC, occurTime ASC
                    UPDATE #tt_portfolioPosiQtyDetial SET matchQty = matchQty + @mr_lastestUnit, costChgAmt = matchQty + @mr_lastestUnit * @v_matchNetPrice 
                           WHERE prodCellCode = @tempprodCellCode
                    
                    --delete #tt_sgwtb where prodCellCode = @tempprodCellCode
                      
                    SELECT @v_matchQty = @v_matchQty - @mr_lastestUnit
                  
                  END   


                DELETE #tt_portfolioPosiQtyDetial WHERE matchQty = 0   --删除申购数量或者中签数量为0的流水
              END
          END
        -- 未找到对应委托
        ELSE
          BEGIN
            IF NOT EXISTS (SELECT * FROM #tt_portfolioCreatePosiDateSum WHERE exchangeCode = @v_exchangeCode AND  secuCode = @v_secuCode AND  prodCellCode = @v_fundAcctCode)
              INSERT #tt_portfolioCreatePosiDateSum(exchangeCode, secuCode, prodCellCode, investPortfolioCode, createPosiDate, posiQty, costChgAmt, lastestoperateDate)
                                            SELECT @v_exchangeCode, @v_secuCode, @v_fundAcctCode, ' ', @v_settleDate, @v_matchQty, @v_costChgAmt, @v_settleDate
            ELSE
              BEGIN
                UPDATE #tt_portfolioCreatePosiDateSum SET posiQty = posiQty + @v_matchQty, costChgAmt = costChgAmt + @v_costChgAmt
                       WHERE exchangeCode = @v_exchangeCode AND  secuCode = @v_secuCode AND  prodCellCode = @v_fundAcctCode
              END


            INSERT #tt_portfolioPosiQtyDetial(createPosiDate, prodCellCode,investPortfolioCode , posiQty, matchQty, costChgAmt)
                           SELECT @v_settleDate, @v_fundAcctCode, '', 0, @v_matchQty, ROUND(@v_costChgAmt, 2)
          END
                         
                         
            INSERT #tt_portfolioCheckJrnlES(serialNO, createPosiDate, occurDate, fundAcctCode,
                                            secuAcctCode, exchangeCode, secuCode, originSecuCode, secuName,
                                            secuTradeTypeCode, prodCellCode, prodCode, investPortfolioCode,
                                            buySellFlagCode, openCloseFlagCode, secuBizTypeCode,
                                            currencyCode, marketLevelCode, hedgeFlagCode, matchQty,
                                            matchNetPrice, cashSettleAmt, matchSettleAmt,
                                            matchTradeFeeAmt, costChgAmt, occupyCostChgAmt, rlzChgProfit) 
                            SELECT distinct @v_serialNO, @v_settleDate, @v_settleDate, @v_fundAcctCode,
                                            @v_secuAcctCode ,@v_exchangeCode, @v_secuCode, @v_originSecuCode, ' ', 
                                            @v_secuTradeTypeCode, prodCellCode, @v_prodCode, investPortfolioCode,
                                            @v_buySellFlagCode, @v_openCloseFlagCode, @v_secuBizTypeCode, 
                                            @v_currencyCode, @v_marketLevelCode, @v_hedgeFlagCode, matchQty,
                                            @v_matchNetPrice, 0, 0,
                                            0, 0, 0, 0  
                                       FROM #tt_portfolioPosiQtyDetial                
                         
        -- 更新或者增加持仓
        UPDATE a SET posiQty = a.posiQty + b.matchQty
                     FROM #tt_portfolioCreatePosiDateSum a 
                     JOIN #tt_portfolioPosiQtyDetial b
                     ON a.exchangeCode = @v_exchangeCode AND a.secuCode = @v_secuCode AND a.prodCellCode = b.prodCellCode


        INSERT #tt_portfolioCreatePosiDateSum(exchangeCode, secuCode, prodCellCode, investPortfolioCode, createPosiDate, posiQty, costChgAmt, lastestoperateDate)
                         SELECT exchangeCode, secuCode, prodCellCode, investPortfolioCode ,createPosiDate, posiQty, costChgAmt, lastestoperateDate
                                FROM (SELECT @v_exchangeCode AS exchangeCode, @v_secuCode AS secuCode, a.prodCellCode, a.investPortfolioCode AS investPortfolioCode, @v_settleDate as createPosiDate, a.matchQty as posiQty, a.costChgAmt as costChgAmt, @v_settleDate as lastestoperateDate, b.createPosiDate as createPosiDate_y
                                             FROM #tt_portfolioPosiQtyDetial a 
                                                  LEFT JOIN #tt_portfolioCreatePosiDateSum b ON a.prodCellCode = b.prodCellCode AND  b.exchangeCode = @v_exchangeCode AND  b.secuCode = @v_secuCode)x
                                WHERE x.createPosiDate_y IS NULL
                                                
      END 
      
    --新股申购(SGMC) 申购还款
    ELSE IF @v_secuBizTypeCode IN ('105')
      BEGIN    
        WHILE @v_matchQty > 0
          BEGIN
            SELECT @temp_mr_prodCellCode = NULL
            SELECT top 1 @temp_mr_prodCellCode = prodCellCode,
                         @temp_mr_investPortfolioCode = investPortfolioCode ,
                         @temp_mr_secuCode = secuCode, 
                         @temp_mr_matchQty = ABS(posiQty), 
                         @temp_mr_costChgAmt = costChgAmt,
                         @temp_mr_per_costChgAmt = costChgAmt / ABS(posiQty), 
                         @temp_mr_createPosiDate = createPosiDate
                    FROM #tt_portfolioCreatePosiDateSum
                    WHERE exchangeCode = @v_exchangeCode 
                          AND secuCode = @v_secuCode
                          AND ABS(posiQty) > 0
                    ORDER BY createPosiDate, prodCellCode


            IF @temp_mr_prodCellCode IS NOT NULL
              BEGIN
                IF @v_matchQty < @temp_mr_matchQty
                  SELECT @temp_mc_matchQty = @v_matchQty
                ELSE
                  SELECT @temp_mc_matchQty = @temp_mr_matchQty


                SELECT @v_matchQty = @v_matchQty - @temp_mc_matchQty


                IF @temp_mc_matchQty < @temp_mr_matchQty
                  BEGIN
                    SELECT @temp_mc_costChgAmt = ROUND(@temp_mc_matchQty * @temp_mr_per_costChgAmt, 2)
                  END
                ELSE
                  BEGIN
                    SELECT @temp_mc_costChgAmt = @temp_mr_costChgAmt
                  END


                IF @temp_mc_matchQty != @temp_mr_matchQty
                  SELECT @temp_mr_costChgAmt = ROUND(@temp_mr_per_costChgAmt * @temp_mc_matchQty, 2)


                SELECT @temp_mc_rlzChgProfit = -@temp_mc_costChgAmt - @temp_mr_costChgAmt


                SELECT @v_costChgAmt = @v_costChgAmt - @temp_mc_costChgAmt


                SELECT @v_cashCurrentSettleAmt = @v_cashCurrentSettleAmt - @temp_mc_cashCurrSettleAmt


                UPDATE #tt_portfolioCreatePosiDateSum SET posiQty = posiQty - @temp_mc_matchQty,
                                            costChgAmt = costChgAmt - @temp_mr_costChgAmt,
                                            lastestoperateDate = @v_settleDate
                                      WHERE exchangeCode = @v_exchangeCode AND  secuCode = @v_secuCode AND  prodCellCode = @temp_mr_prodCellCode
                                      
                INSERT #tt_portfolioCheckJrnlES(serialNO, createPosiDate, occurDate, fundAcctCode,
                                                secuAcctCode, exchangeCode, secuCode, originSecuCode, secuName,
                                                secuTradeTypeCode, prodCellCode, prodCode, investPortfolioCode,
                                                buySellFlagCode, openCloseFlagCode, secuBizTypeCode,
                                                currencyCode, marketLevelCode, hedgeFlagCode, matchQty,
                                                matchNetPrice, cashSettleAmt, matchSettleAmt,
                                                matchTradeFeeAmt, costChgAmt, occupyCostChgAmt, rlzChgProfit) 
                                         SELECT @v_serialNO, @temp_mr_createPosiDate, @v_settleDate, @v_fundAcctCode,
                                                @v_secuAcctCode ,@v_exchangeCode, @v_secuCode, @v_originSecuCode, ' ', 
                                                @v_secuTradeTypeCode, 
                                                @temp_mr_prodCellCode, @v_prodCode, @v_investPortfolioCode,
                                                @v_buySellFlagCode, @v_openCloseFlagCode, @v_secuBizTypeCode, 
                                                @v_currencyCode, @v_marketLevelCode, @v_hedgeFlagCode, @temp_mc_matchQty * -1,
                                                0, ISNULL(@v_cashCurrentSettleAmt, 0), @v_matchSettleAmt,
                                                @v_matchTradeFeeAmt, -1 *@temp_mr_costChgAmt, 0, 0


                END
            ELSE -- 找不到对应的记录
              BEGIN
                 SELECT @v_createPosiDate = NULL
                 SELECT @v_createPosiDate = createPosiDate, @v_posiQty = posiQty, @v_lastSettleDate = lastestoperateDate FROM #tt_portfolioCreatePosiDateSum
                        WHERE exchangeCode = @v_exchangeCode AND  secuCode = @v_secuCode AND  prodCellCode = @v_fundAcctCode


                 IF @v_createPosiDate IS NULL
                    BEGIN
                      INSERT #tt_portfolioCreatePosiDateSum (exchangeCode, secuCode, prodCellCode,investPortfolioCode, createPosiDate, posiQty, costChgAmt, lastestoperateDate)
                                        SELECT @v_exchangeCode, @v_secuCode, @v_fundAcctCode AS prodCellCode, ' ', @v_settleDate, @v_matchQty, 0, @v_settleDate


                      SELECT @v_createPosiDate = @v_settleDate
                    END
                  ELSE
                    BEGIN
                      UPDATE #tt_portfolioCreatePosiDateSum SET createPosiDate = @v_createPosiDate, posiQty = posiQty + @v_matchQty, costChgAmt = costChgAmt + 0, lastestoperateDate = @v_settleDate
                             WHERE exchangeCode = @v_exchangeCode AND  secuCode = @v_secuCode AND  prodCellCode = @v_prodCellCode
                    END
                         
                  INSERT #tt_portfolioCheckJrnlES(serialNO, createPosiDate, occurDate, fundAcctCode,
                                                  secuAcctCode, exchangeCode, secuCode, originSecuCode, secuName,
                                                  secuTradeTypeCode, prodCellCode, prodCode, investPortfolioCode,
                                                  buySellFlagCode, openCloseFlagCode, secuBizTypeCode,
                                                  currencyCode, marketLevelCode, hedgeFlagCode, matchQty,
                                                  matchNetPrice, cashSettleAmt, matchSettleAmt,
                                                  matchTradeFeeAmt, costChgAmt, occupyCostChgAmt, rlzChgProfit) 
                                           SELECT @v_serialNO, @v_settleDate, @v_settleDate, @v_fundAcctCode,
                                                  @v_secuAcctCode ,@v_exchangeCode, @v_secuCode, @v_originSecuCode, ' ', 
                                                  @v_secuTradeTypeCode, 
                                                  @v_fundAcctCode AS prodCellCode, @v_prodCode, @v_investPortfolioCode,
                                                  @v_buySellFlagCode, @v_openCloseFlagCode, @v_secuBizTypeCode, 
                                                  @v_currencyCode, @v_marketLevelCode, @v_hedgeFlagCode, @v_matchQty,
                                                  0, ISNULL(@v_cashCurrentSettleAmt, 0), @v_matchSettleAmt,
                                                  @v_matchTradeFeeAmt, @v_costChgAmt, 0, 0


                  break
              END
          END
      END      
      -- 新股上市。
    ELSE IF(@v_secuBizTypeCode = '107')
      BEGIN
        WHILE @v_matchQty > 0
          BEGIN                       
            SELECT @temp_mr_prodCellCode = NULL
            SELECT top 1 @temp_mr_prodCellCode = prodCellCode,
                         @temp_mr_investPortfolioCode = investPortfolioCode ,
                         @temp_mr_secuCode = secuCode,
                         @temp_mr_matchQty = ABS(posiQty),
                         @temp_mr_costChgAmt = costChgAmt,
                         @temp_mr_per_costChgAmt = costChgAmt / ABS(posiQty),
                         @temp_mr_createPosiDate = createPosiDate
                    FROM #tt_portfolioCreatePosiDateSum
                    WHERE exchangeCode = @v_exchangeCode 
                    --AND  dbo.fn_get_secuCode0(exchangeCode, secuCode) = @v_secuCode
                          AND ABS(posiQty) > 0
                    ORDER BY createPosiDate, prodCellCode
                                         
            IF @temp_mr_prodCellCode IS NOT NULL
              BEGIN
                IF @v_matchQty < @temp_mr_matchQty
                  SELECT @temp_mc_matchQty = @v_matchQty
                ELSE
                  SELECT @temp_mc_matchQty = @temp_mr_matchQty


                SELECT @v_matchQty = @v_matchQty - @temp_mc_matchQty


                IF @temp_mc_matchQty < @temp_mr_matchQty
                  BEGIN
                    SELECT @temp_mc_costChgAmt = ROUND(@temp_mc_matchQty * @temp_mr_per_costChgAmt, 2)
                  END
                ELSE
                  BEGIN
                    SELECT @temp_mc_costChgAmt = @temp_mr_costChgAmt
                  END


                IF @temp_mc_matchQty != @temp_mr_matchQty
                  SELECT @temp_mr_costChgAmt = ROUND(@temp_mr_per_costChgAmt * @temp_mc_matchQty, 2)


                SELECT @temp_mc_rlzChgProfit = -@temp_mc_costChgAmt - @temp_mr_costChgAmt


                SELECT @v_costChgAmt = @v_costChgAmt - @temp_mc_costChgAmt


                SELECT @v_cashCurrentSettleAmt = @v_cashCurrentSettleAmt - @temp_mc_cashCurrSettleAmt




                UPDATE #tt_portfolioCreatePosiDateSum SET posiQty = posiQty - @temp_mc_matchQty, costChgAmt = costChgAmt - @temp_mr_costChgAmt,
                                            lastestoperateDate = @v_settleDate
                       where exchangeCode = @v_exchangeCode  AND  prodCellCode = @temp_mr_prodCellCode
                                                   
               INSERT #tt_portfolioCheckJrnlES(serialNO, createPosiDate, occurDate, fundAcctCode,
                                               secuAcctCode, exchangeCode, secuCode, originSecuCode, secuName,
                                               secuTradeTypeCode, prodCellCode, prodCode, investPortfolioCode,
                                               buySellFlagCode, openCloseFlagCode, secuBizTypeCode,
                                               currencyCode, marketLevelCode, hedgeFlagCode, matchQty,
                                               matchNetPrice, cashSettleAmt, matchSettleAmt,
                                               matchTradeFeeAmt, costChgAmt, occupyCostChgAmt, rlzChgProfit) 
                                        SELECT @v_serialNO, @temp_mr_createPosiDate, @v_settleDate, @v_fundAcctCode,
                                               @v_secuAcctCode ,@v_exchangeCode, @temp_mr_secuCode, @v_originSecuCode, ' ', 
                                               ' ', 
                                               @v_fundAcctCode AS prodCellCode, @v_prodCode, ' ',
                                               'S', @v_openCloseFlagCode, '1071', 
                                               @v_currencyCode, @v_marketLevelCode, @v_hedgeFlagCode, @temp_mc_matchQty,
                                               0, ISNULL(@v_cashCurrentSettleAmt, 0), @v_matchSettleAmt,
                                               @v_matchTradeFeeAmt, -1 * @temp_mr_costChgAmt, 0, 0       
                       
                 --新股上市
                 SELECT @v_createPosiDate = NULL


                 SELECT @v_createPosiDate = createPosiDate, @v_posiQty = posiQty, @v_lastSettleDate = lastestoperateDate FROM #tt_portfolioCreatePosiDateSum
                        WHERE exchangeCode = @v_exchangeCode AND  secuCode = @v_secuCode AND  prodCellCode = @v_prodCellCode


                 IF @v_createPosiDate IS NULL
                   BEGIN
                     INSERT #tt_portfolioCreatePosiDateSum (exchangeCode, secuCode, prodCellCode,investPortfolioCode, createPosiDate, posiQty, costChgAmt, lastestoperateDate)
                                                    SELECT @v_exchangeCode, @v_secuCode, @temp_mr_prodCellCode,' ', @v_settleDate, @temp_mc_matchQty, @temp_mr_costChgAmt, @v_settleDate


                      SELECT @v_createPosiDate = @v_settleDate
                    END
                  ELSE
                    BEGIN
                      UPDATE #tt_portfolioCreatePosiDateSum SET createPosiDate = @v_createPosiDate, posiQty = posiQty + @temp_mc_matchQty, costChgAmt = costChgAmt + @temp_mr_costChgAmt, lastestoperateDate = @v_settleDate
                             WHERE exchangeCode = @v_exchangeCode AND  secuCode = @v_secuCode AND  prodCellCode = @temp_mr_prodCellCode
                    END
                    
                   INSERT #tt_portfolioCheckJrnlES(serialNO, createPosiDate, occurDate, fundAcctCode,
                                                   secuAcctCode, exchangeCode, secuCode, originSecuCode, secuName,
                                                   secuTradeTypeCode, prodCellCode, prodCode, investPortfolioCode,
                                                   buySellFlagCode, openCloseFlagCode, secuBizTypeCode,
                                                   currencyCode, marketLevelCode, hedgeFlagCode, matchQty,
                                                   matchNetPrice, cashSettleAmt, matchSettleAmt,
                                                   matchTradeFeeAmt, costChgAmt, occupyCostChgAmt, rlzChgProfit) 
                                            SELECT @v_serialNO, @temp_mr_createPosiDate, @v_settleDate, @v_fundAcctCode,
                                                   @v_secuAcctCode ,@v_exchangeCode, @temp_mr_secuCode, @v_originSecuCode, ' ', 
                                                   '1072', 
                                                   @v_fundAcctCode AS prodCellCode, @v_prodCode, ' ',
                                                   'B', @v_openCloseFlagCode, @v_secuBizTypeCode, 
                                                   @v_currencyCode, @v_marketLevelCode, @v_hedgeFlagCode, @temp_mc_matchQty,
                                                   0, ISNULL(@v_cashCurrentSettleAmt, 0), @v_matchSettleAmt,
                                                   @v_matchTradeFeeAmt, @temp_mr_costChgAmt, 0, 0    


                END
            ELSE -- 找不到对应的记录
              BEGIN
                SELECT @v_createPosiDate = NULL
                SELECT @v_createPosiDate = createPosiDate, @v_posiQty = posiQty, @v_lastSettleDate = lastestoperateDate FROM #tt_portfolioCreatePosiDateSum
                       WHERE exchangeCode = @v_exchangeCode AND  secuCode = @v_secuCode AND  prodCellCode = @v_fundAcctCode
                 IF @v_createPosiDate IS NULL
                   BEGIN
                     INSERT #tt_portfolioCreatePosiDateSum (exchangeCode, secuCode, prodCellCode, createPosiDate, posiQty, costChgAmt, lastestoperateDate)
                                       SELECT @v_exchangeCode, @v_secuCode, @v_fundAcctCode AS prodCellCode, @v_settleDate, @v_matchQty, 0, @v_settleDate


                     SELECT @v_createPosiDate = @v_settleDate
                    END
                  ELSE
                    BEGIN
                      UPDATE #tt_portfolioCreatePosiDateSum SET createPosiDate = @v_createPosiDate, posiQty = posiQty + @v_matchQty, costChgAmt = costChgAmt + 0, lastestoperateDate = @v_settleDate
                             WHERE exchangeCode = @v_exchangeCode AND  secuCode = @v_secuCode AND  prodCellCode = @v_prodCellCode
                    END
                   
                INSERT #tt_portfolioCheckJrnlES(serialNO, createPosiDate, occurDate, fundAcctCode,
                                                secuAcctCode, exchangeCode, secuCode, originSecuCode, secuName,
                                                secuTradeTypeCode, prodCellCode, prodCode, investPortfolioCode,
                                                buySellFlagCode, openCloseFlagCode, secuBizTypeCode,
                                                currencyCode, marketLevelCode, hedgeFlagCode, matchQty,
                                                matchNetPrice, cashSettleAmt, matchSettleAmt,
                                                matchTradeFeeAmt, costChgAmt, occupyCostChgAmt, rlzChgProfit) 
                                         SELECT @v_serialNO, @v_settleDate, @v_settleDate, @v_fundAcctCode,
                                                @v_secuAcctCode ,@v_exchangeCode, @v_secuCode, @v_originSecuCode, ' ', 
                                                @v_secuTradeTypeCode, 
                                                @v_fundAcctCode as prodCellCode, @v_prodCode, @v_fundAcctCode as investPortfolioCode,
                                                @v_buySellFlagCode, @v_openCloseFlagCode, @v_secuBizTypeCode, 
                                                @v_currencyCode, @v_marketLevelCode, @v_hedgeFlagCode, @v_matchQty,
                                                0, 0, @v_matchSettleAmt,
                                                @v_matchTradeFeeAmt, @temp_mr_costChgAmt, 0, 0    
                
                break
              END
          END
        SET rowcount 0
      END 
        
    ELSE IF @v_secuBizTypeCode = '183' OR @v_secuBizTypeCode = '187' OR @v_secuBizTypeCode = '188'
      BEGIN      
        TRUNCATE TABLE #tt_portfolioPosiQtyDetial
        TRUNCATE TABLE #tt_portfolioPosiQtySum
     
        INSERT INTO #tt_portfolioPosiQtyDetial(createPosiDate, prodCellCode, investPortfolioCode, posiQty, matchQty, costChgAmt)
                                         SELECT @v_settleDate, prodCellCode, investPortfolioCode, SUM(posiQty), 0, 0
                                           FROM #tt_portfolioCheckJrnl_old
                                          WHERE operateDate <= @v_shareRecordDate
                                            AND exchangeCode = @v_exchangeCode
                                            AND secuCode = @v_secuCode
                                          GROUP BY prodCellCode, investPortfolioCode
                                         HAVING SUM(posiQty) > 0
        INSERT INTO #tt_portfolioPosiQtyDetial(createPosiDate, prodCellCode, investPortfolioCode, posiQty, matchQty, costChgAmt)
                                         SELECT @v_settleDate, prodCellCode, investPortfolioCode, SUM(matchQty), 0, 0
                                           FROM #tt_portfolioCheckJrnlES
                                          WHERE occurDate <= @v_shareRecordDate
                                            AND exchangeCode = @v_exchangeCode
                                            AND secuCode = @v_secuCode
                                          GROUP BY prodCellCode, investPortfolioCode
                                         HAVING SUM(matchQty) != 0
           
        INSERT INTO #tt_portfolioPosiQtySum(createPosiDate, prodCellCode, investPortfolioCode, posiQty, matchQty, costChgAmt, rlzChgProfit)
                                      SELECT @v_settleDate, prodCellCode, investPortfolioCode, SUM(posiQty), 0, 0, 0
                                        FROM #tt_portfolioPosiQtyDetial
                                       GROUP BY prodCellCode, investPortfolioCode
                                      HAVING SUM(posiQty) > 0  
                                                                     
                                                              
        IF EXISTS(SELECT 1 FROM #tt_portfolioPosiQtySum)
          BEGIN
            SELECT @v_posiQty = SUM(posiQty) FROM #tt_portfolioPosiQtySum


            UPDATE #tt_portfolioPosiQtySum SET matchQty = FLOOR(ROUND(posiQty / @v_posiQty * @v_matchQty, 4)),
                                              costChgAmt = ROUND(ROUND(posiQty / @v_posiQty * @v_costChgAmt, 4), 2),
                                              rlzChgProfit = ROUND(ROUND(posiQty / @v_posiQty * @v_rlzChgProfit, 4), 2)
                                              
                                              
            --SELECT * FROM #tt_portfolioPosiQtySum                                 
            
            SELECT @v_matchQty = @v_matchQty - SUM(matchQty), @v_costChgAmt = @v_costChgAmt - SUM(costChgAmt), @v_rlzChgProfit = @v_rlzChgProfit - SUM(rlzChgProfit) FROM #tt_portfolioPosiQtySum;
       
            
       
            IF @v_matchQty != 0 OR @v_costChgAmt != 0 OR @v_rlzChgProfit != 0
              BEGIN
                SELECT top 1   
                  @v_tempCellCode = prodCellCode
                  FROM #tt_portfolioPosiQtySum
                  ORDER BY matchQty DESC;
              
                UPDATE #tt_portfolioPosiQtySum SET matchQty = matchQty + @v_matchQty,
                                                   costChgAmt = costChgAmt + @v_costChgAmt,
                                                   rlzChgProfit = rlzChgProfit + @v_rlzChgProfit
                                             WHERE prodCellCode = @v_tempCellCode
              END
     
            MERGE INTO #tt_portfolioPosiQtySum a
            USING #tt_portfolioCreatePosiDateSum b ON (a.prodCellCode = b.prodCellCode AND b.exchangeCode = @v_exchangeCode AND b.secuCode = @v_secuCode)
            WHEN MATCHED THEN UPDATE SET a.createPosiDate = b.createPosiDate;
            
            MERGE INTO #tt_portfolioCreatePosiDateSum a
            USING #tt_portfolioPosiQtySum b ON (a.prodCellCode = b.prodCellCode AND a.exchangeCode = @v_exchangeCode AND a.secuCode = @v_secuCode)
            WHEN MATCHED THEN UPDATE SET a.posiQty = a.posiQty + b.matchQty,
                                         a.costChgAmt = a.costChgAmt + b.costChgAmt,
                                         a.createPosiDate = CASE WHEN a.posiQty <= 0 THEN b.createPosiDate ELSE a.createPosiDate END;
                                                                                
        END
      ELSE
        BEGIN
          IF EXISTS(SELECT 1 FROM #tt_portfolioCreatePosiDateSum WHERE exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode AND prodCellCode = @v_prodCode)
             UPDATE #tt_portfolioCreatePosiDateSum SET posiQty = posiQty + @v_matchQty
                    WHERE exchangeCode = @v_exchangeCode AND secuCode = @v_secuCode AND prodCellCode = @v_prodCode
          ELSE
            INSERT INTO #tt_portfolioCreatePosiDateSum(exchangeCode, secuCode, prodCellCode, investPortfolioCode,
                                                       createPosiDate, posiQty, costChgAmt, lastestoperateDate)
                                                VALUES(@v_exchangeCode, @v_secuCode, @v_prodCode, @v_investPortfolioCode,
                                                       @v_settleDate, @v_matchQty, 0, @v_settleDate)
                                             
            INSERT INTO #tt_portfolioPosiQtySum(createPosiDate, prodCellCode, investPortfolioCode, posiQty,
                                                matchQty, costChgAmt, rlzChgProfit)
                                         VALUES(@v_settleDate, @v_prodCode, @v_investPortfolioCode, 0,
                                                @v_matchQty, 0, -@v_costChgAmt + @v_rlzChgProfit)
        END
                  
      INSERT INTO #tt_portfolioCheckJrnlES(serialNO, createPosiDate, occurDate, fundAcctCode,
                                           secuAcctCode, exchangeCode, secuCode, originSecuCode, secuName,
                                           secuTradeTypeCode, prodCellCode, prodCode, investPortfolioCode,
                                           buySellFlagCode, openCloseFlagCode, secuBizTypeCode,
                                           currencyCode, marketLevelCode, hedgeFlagCode, matchQty,
                                           matchNetPrice, cashSettleAmt, matchSettleAmt,
                                           matchTradeFeeAmt, costChgAmt, occupyCostChgAmt, rlzChgProfit)
                                    SELECT @v_serialNO, @v_createPosiDate, @v_settleDate, @v_fundAcctCode,
                                           @v_secuAcctCode, @v_exchangeCode, @v_secuCode, @v_originSecuCode, ' ',
                                           @v_secuTradeTypeCode, prodCellCode, @v_prodCode, @v_investPortfolioCode,
                                           @v_buySellFlagCode, @v_openCloseFlagCode, @v_secuBizTypeCode,
                                           @v_currencyCode, @v_marketLevelCode, @v_hedgeFlagCode, matchQty,
                                           @v_matchNetPrice, @v_cashCurrentSettleAmt, @v_matchSettleAmt,
                                           @v_matchTradeFeeAmt, costChgAmt, - (costChgAmt - rlzChgProfit), rlzChgProfit
                                      FROM #tt_portfolioPosiQtySum
                                         
           --SELECT * FROM #tt_portfolioCheckJrnlES                            
      END           
    ----------------------------------------------------------买入处理-------------------------------------------------------         
    ELSE IF @v_buySellFlagCode = '1' AND @v_openCloseFlagCode = '1'
      BEGIN
        SELECT @v_createPosiDate = NULL
        SELECT @v_posiQty        = NULL
        SELECT @v_lastSettleDate = NULL
               
        SELECT @v_createPosiDate = createPosiDate, @v_posiQty = posiQty, @v_lastSettleDate =  lastCreatePosiDate
               FROM #tt_portfolioCreatePosiDate
              WHERE exchangeCode = @v_exchangeCode
                    AND secuCode = @v_secuCode
                    AND prodCellCode = @v_prodCellCode
                    AND investPortfolioCode = @v_investPortfolioCode
                                        
        IF @v_createPosiDate IS NULL
          BEGIN
            INSERT INTO #tt_portfolioCreatePosiDateSum(exchangeCode, secuCode, prodCellCode, investPortfolioCode,
                                                   createPosiDate, posiQty, costChgAmt, lastestoperateDate)
                                            VALUES(@v_exchangeCode, @v_secuCode, @v_prodCellCode, @v_investPortfolioCode,
                                                   @v_settleDate, @v_matchQty, @v_costChgAmt, @v_settleDate)
            SELECT @v_createPosiDate = @v_settleDate
          END
        ELSE IF @v_posiQty <= 0 AND @v_lastSettleDate != @v_settleDate
          BEGIN
            UPDATE #tt_portfolioCreatePosiDateSum SET createPosiDate = @v_settleDate,
                                                     posiQty = @v_matchQty,
                                                     costChgAmt = @v_costChgAmt,
                                                     lastestoperateDate = @v_settleDate
                                               WHERE exchangeCode = @v_exchangeCode
                                                 AND secuCode = @v_secuCode
                                                 AND prodCellCode = @v_prodCellCode
          END
        ELSE
          BEGIN
            UPDATE #tt_portfolioCreatePosiDateSum SET createPosiDate = @v_createPosiDate,
                                                      posiQty = posiQty + @v_matchQty,
                                                      costChgAmt = costChgAmt + @v_costChgAmt
                                                WHERE exchangeCode = @v_exchangeCode
                                                  AND secuCode = @v_secuCode
                                                  AND prodCellCode = @v_prodCellCode
                                                  AND investPortfolioCode = @v_investPortfolioCode;
          END
           
        INSERT INTO #tt_portfolioCheckJrnlES(serialNO, createPosiDate, occurDate, fundAcctCode,
                                             secuAcctCode, exchangeCode, secuCode, originSecuCode, secuName,
                                             secuTradeTypeCode, prodCellCode, prodCode, investPortfolioCode,
                                             buySellFlagCode, openCloseFlagCode, secuBizTypeCode,
                                             currencyCode, marketLevelCode, hedgeFlagCode, matchQty,
                                             matchNetPrice, cashSettleAmt, matchSettleAmt,
                                             matchTradeFeeAmt, costChgAmt, occupyCostChgAmt, rlzChgProfit)
                                      VALUES(@v_serialNO, @v_createPosiDate, @v_settleDate, @v_fundAcctCode,
                                             @v_secuAcctCode, @v_exchangeCode, @v_secuCode, @v_originSecuCode, ' ',
                                             @v_secuTradeTypeCode, @v_prodCellCode, @v_prodCode, @v_investPortfolioCode,
                                             @v_buySellFlagCode, @v_openCloseFlagCode, @v_secuBizTypeCode,
                                             @v_currencyCode, @v_marketLevelCode, @v_hedgeFlagCode, @v_matchQty,
                                             @v_matchNetPrice, @v_cashCurrentSettleAmt,@v_matchSettleAmt, 
                                             @v_matchTradeFeeAmt, @v_costChgAmt, @v_costChgAmt, @v_rlzChgProfit)
                                             
      END        
    -------------------------------------------------------卖出处理---------------------------------------------------------              
    ELSE IF @v_buySellFlagCode = '1' AND @v_openCloseFlagCode = 'A'
      BEGIN
        SELECT @v_costChgAmt                  = round(@v_costChgAmt, 2)
        SELECT @temp_mc_per_costChgAmt        = @v_costChgAmt / @v_matchQty
        SELECT @temp_mc_per_rlzChgProfit      = @v_rlzChgProfit / @v_matchQty
        SELECT @temp_mc_per_cashCurrSettleAmt = @v_cashCurrentSettleAmt /@v_matchQty
        SELECT @temp_mc_per_matchTradeFeeAmt  = @v_matchTradeFeeAmt / @v_matchQty
                       
        WHILE @v_matchQty > 0
          BEGIN
            SELECT @temp_mr_prodCellCode = NULL
              SELECT top 1
                     @temp_mr_prodCellCode = prodCellCode, 
                     @temp_mr_matchQty = posiQty, 
                     @temp_mr_costChgAmt = costChgAmt , 
                     @temp_mr_per_costChgAmt = costChgAmt / posiQty, 
                     @temp_mr_createPosiDate = createPosiDate
                FROM #tt_portfolioCreatePosiDateSum
               WHERE exchangeCode = @v_exchangeCode
                 AND secuCode = @v_secuCode
                 AND prodCellCode = @v_prodCellCode
                 AND posiQty > 0
               ORDER BY createPosiDate
                                     
       --找到相应的买入处理
            IF @temp_mr_prodCellCode IS NOT NULL 
            BEGIN
              IF @temp_mr_matchQty > @v_matchQty
                 SELECT @temp_mc_matchQty = @v_matchQty
              ELSE
                SELECT @temp_mc_matchQty = @temp_mr_matchQty
            
              SELECT @v_matchQty = @v_matchQty - @temp_mc_matchQty
              IF @v_matchQty != 0 
                BEGIN
                  SELECT @temp_mc_costChgAmt        = round(@temp_mc_matchQty * @temp_mc_per_costChgAmt, 2)
                  SELECT @temp_mc_cashCurrSettleAmt = round(@temp_mc_matchQty * @temp_mc_per_cashCurrSettleAmt, 2)
                  SELECT @temp_mc_matchTradeFeeAmt  = round(@temp_mc_matchQty * @temp_mc_per_matchTradeFeeAmt, 2)
                END
              ELSE
                BEGIN
                  SELECT @temp_mc_costChgAmt        = @v_costChgAmt
                  SELECT @temp_mc_cashCurrSettleAmt = @v_cashCurrentSettleAmt
                  SELECT @temp_mc_matchTradeFeeAmt  = @v_matchTradeFeeAmt
                END           
              IF @temp_mc_matchQty != @temp_mr_matchQty 
                SELECT @temp_mr_costChgAmt = ROUND(@temp_mr_per_costChgAmt * @temp_mc_matchQty, 2)
                
              SELECT @temp_mc_rlzChgProfit   = -@temp_mc_costChgAmt - @temp_mr_costChgAmt;
              SELECT @v_costChgAmt           = @v_costChgAmt - @temp_mc_per_costChgAmt;
              SELECT @v_cashCurrentSettleAmt = @v_cashCurrentSettleAmt - @temp_mc_per_cashCurrSettleAmt;
              SELECT @v_matchTradeFeeAmt     = @v_matchTradeFeeAmt - @temp_mc_per_matchTradeFeeAmt;
              UPDATE #tt_portfolioCreatePosiDateSum SET posiQty = posiQty - @temp_mc_matchQty,
                                                       costChgAmt = costChgAmt - @temp_mr_costChgAmt,
                                                       lastestoperateDate = @v_settleDate
                                                 WHERE exchangeCode = @v_exchangeCode
                                                   AND secuCode = @v_secuCode
                                                   AND prodCellCode = @temp_mr_prodCellCode;
              
                INSERT INTO #tt_portfolioCheckJrnlES(serialNO, createPosiDate, occurDate, fundAcctCode,
                                                   secuAcctCode, exchangeCode, secuCode, originSecuCode,
                                                   secuName, secuTradeTypeCode, prodCellCode, prodCode,
                                                   investPortfolioCode, buySellFlagCode, openCloseFlagCode,
                                                   secuBizTypeCode, currencyCode, marketLevelCode,
                                                   hedgeFlagCode, matchQty, matchNetPrice,
                                                   cashSettleAmt, matchSettleAmt, matchTradeFeeAmt,
                                                   costChgAmt, occupyCostChgAmt, rlzChgProfit)
                                            VALUES(@v_serialNO, @temp_mr_createPosiDate, @v_settleDate, @v_fundAcctCode,
                                                   @v_secuAcctCode, @v_exchangeCode, @v_secuCode, @v_originSecuCode,
                                                   ' ', @v_secuTradeTypeCode, @temp_mr_prodCellCode, @v_prodCode,
                                                   @v_investPortfolioCode, @v_buySellFlagCode, @v_openCloseFlagCode,
                                                   @v_secuBizTypeCode, @v_currencyCode, @v_marketLevelCode,
                                                   @v_hedgeFlagCode, -@temp_mc_matchQty, @v_matchNetPrice,
                                                   @temp_mc_cashCurrSettleAmt, @v_matchSettleAmt, @temp_mc_matchTradeFeeAmt,
                                                   -@temp_mr_costChgAmt, @temp_mc_cashCurrSettleAmt, @temp_mc_rlzChgProfit);
            
            END 
            ELSe
              BEGIN
              DELETE #tt_portfolioCreatePosiDateSum
               WHERE exchangeCode = @v_exchangeCode
                 AND secuCode = @v_secuCode
                 AND prodCellCode = @v_prodCellCode;
              
                INSERT INTO #tt_portfolioCheckJrnlES(serialNO, createPosiDate, occurDate, fundAcctCode,
                                                   secuAcctCode, exchangeCode, secuCode, originSecuCode,
                                                   secuName, secuTradeTypeCode, prodCellCode, prodCode,
                                                   investPortfolioCode, buySellFlagCode, openCloseFlagCode,
                                                   secuBizTypeCode, currencyCode, marketLevelCode,
                                                   hedgeFlagCode, matchQty, matchNetPrice,
                                                   cashSettleAmt, matchSettleAmt, matchTradeFeeAmt,
                                                   costChgAmt, occupyCostChgAmt, rlzChgProfit)
                                            VALUES(@v_serialNO, @v_settleDate, @v_settleDate, @v_fundAcctCode,
                                                   @v_secuAcctCode, @v_exchangeCode, @v_secuCode, @v_originSecuCode,
                                                   ' ', @v_secuTradeTypeCode, @v_prodCellCode, @v_prodCode,
                                                   @v_investPortfolioCode, @v_buySellFlagCode, @v_openCloseFlagCode,
                                                   @v_secuBizTypeCode, @v_currencyCode, @v_marketLevelCode,
                                                   @v_hedgeFlagCode, -@v_matchQty, @v_matchNetPrice,
                                                   @v_cashCurrentSettleAmt, @v_matchSettleAmt, @v_matchTradeFeeAmt,
                                                   0, -@v_cashCurrentSettleAmt, -@v_costChgAmt)
               break
              END
           
          END 
      END
                     
    FETCH for_mccjb INTO @v_serialNO, @v_orderID, @v_settleDate, @v_shareRecordDate, @v_fundAcctCode, @v_secuAcctCode,@v_prodCode, @v_investPortfolioCode, 
                         @v_exchangeCode, @v_secuCode, @v_originSecuCode,@v_secuName, @v_secuTradeTypeCode, 
                         @v_prodCellCode, @v_buySellFlagCode, @v_openCloseFlagCode, @v_secuBizTypeCode, @v_marketLevelCode, @v_currencyCode, @v_hedgeFlagCode, 
                         @v_matchQty, @v_matchNetPrice, @v_cashCurrentSettleAmt, @v_matchTradeFeeAmt, @v_matchSettleAmt, 
                         @v_costChgAmt, @v_rlzChgProfit
 
    END
    
   CLOSE for_mccjb
   DEALLOCATE for_mccjb
 RETURN 0
go
--exec opCalcPortfolioCheckJrnlES '','','','','','', ''

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值