/* SELECT * FROM TUser DROP TABLE #Diff SELECT * INTO #Diff FROM ( SELECT G.FNo,G.FName,C.FNo AS CompNo, A.FGoodsId,A.FCompId,A.FStoreId,A.FQuantity,B.FHistQuantity FROM ( SELECT A.FGoodsId,A.FCompId,A.FStoreId,SUM(A.FQuantity) AS FQuantity FROM ZhengZhou_LiShuangShuang..TInventory AS A GROUP BY A.FGoodsId,A.FCompId,A.FStoreId ) AS A , ( SELECT A.FGoodsId,A.FCompId,A.FStoreId, SUM(A.FInStdQuantity) - SUM(A.FOutStdQuantity) AS FHistQuantity FROM ZhengZhou_LiShuangShuang..TInventoryHist AS A GROUP BY A.FGoodsId,A.FCompId,A.FStoreId ) AS B, TGoods AS G,TCompany AS C WHERE G.FId = A.FGoodsId AND G.FId = B.FGoodsId AND A.FGoodsId = B.FGoodsId AND A.FStoreId = B.FStoreId AND A.FCompId = B.FCompId AND A.FCompId = C.FId ) AS A WHERE A.FQuantity !=A.FHistQuantity DELETE #Diff WHERE FNo != '110018' select * from #Diff WHERE FNo = '160006' SELECT * FROM #Diff */ /* SELECT * FROM TStockInDetail WHERE FId NOT IN(SELECT FTransDetailId FROM TInventoryHist) AND FBillId IN (SELECT FBillId FROM TStockInBill WHERE FState = 1) SELECT * FROM TInventoryHist WHERE FTransDetailId NOT IN (SELECT FId FROM TStockOutDetail) AND FBIllType = 'CK' */ DECLARE @GoodsId BIGINT DECLARE @GoodsNo VARCHAR(30) DECLARE @CompNo VARCHAR(30) DECLARE @CompId BIGINT DECLARE @StoreId BIGINT DECLARE Cur Cursor FOR select FGoodsId,FNo,FCompId,CompNo,FStoreId from #Diff -- WHERE CompNo = '011' OPEN Cur FETCH Cur INTO @GoodsId,@GoodsNo,@CompId,@CompNo,@StoreId WHILE @@FETCH_STATUS = 0 BEGIN DECLARE @BillId BIGINT DECLARE @BillNo VARCHAR(30) DECLARE @BillTime DATETIME DECLARE @UnitId BIGINT DECLARE @ConvDir INT DECLARE @ConvRate DECIMAL(18,12) DECLARE @PhyQty DECIMAL(18,12) DECLARE @StdPhyQty DECIMAL(18,12) DECLARE @StdDiffQty DECIMAL(18,12) DECLARE @DiffQty DECIMAL(18,12) DECLARE @BillDetailId BIGINT DECLARE @StockInBillId BIGINT DECLARE @StockOutBillId BIGINT DECLARE @StdUnitId BIGINT SELECT TOP 1 @BillId = A.FBillId,@BillNo = A.FBillNo,@BillTime = FBillTime, @UnitId = FUnitId, @PhyQty = FPhyInventory, @BillDetailId = C.FId, @StockInBillId = FStockInBillId, @StockOutBillId = FStockOutBillId FROM TTakeStockBill AS A,TTakeStockDetail AS B,TTakeStockDetailBatch AS C WHERE A.FBillID = B.FBillId AND B.FGoodsId = @GoodsId AND A.FCompId = @CompId AND C.FDetailId = B.FId AND A.FStoreId = @StoreId AND A.FState = 1 ORDER BY FBillTime DESC SELECT @StdUnitId = FUnitId FROM TGoods WHERE FId = @GoodsId PRINT @GoodsNo PRINT @CompNo PRINT @BillNo PRINT @CompId PRINT @GoodsId PRINT @StoreId PRINT @BillTime --计算这个时间点以前的库存 --更新标准出库数量 --获取换算比率 SELECT @ConvDir = 0, @ConvRate = 1 FROM TGoods AS A WITH(NOLOCK) WHERE A.FUnitId = @UnitId AND A.FId = @GoodsId IF @ConvDir IS NULL BEGIN SELECT @ConvDir = B.FConvDir, @ConvRate = B.FConvRate FROM TGoodsMultiUnit AS B WHERE @UnitId = B.FUnitId AND @GoodsId = B.FGoodsId END UPDATE A SET A.FInStdQuantity = CASE WHEN B.FConvDir = 2 THEN FInQuantity * B.FConvRate ELSE FInQuantity / FConvRate END, A.FOutStdQuantity = CASE WHEN B.FConvDir = 2 THEN FOutQuantity * B.FConvRate ELSE FOutQuantity / FConvRate END FROM TInventoryHist AS A,TGoodsMultiUnit AS B WHERE A.FGoodsId = B.FGoodsId AND A.FUnitId = B.FUnitId AND A.FGoodsId = @GoodsId AND A.FCompId = @CompId EXEC PRecalcInventoryHistBalance @CompId,@GoodsId,@StoreId,NULL DECLARE @Quantity DECIMAL(18,12) SELECT @Quantity = ISNULL(SUM(FInStdQuantity) - SUM(FOutStdQuantity),0) FROM TInventoryHist WHERE FCompId = @CompId AND FGoodsId = @GoodsId AND FStoreId = @StoreId AND FTime < @BillTime /* SELECT SUM(FInStdQuantity) - SUM(FOutStdQuantity) FROM TInventoryHist WHERE FCompId = 3472610663749124096 AND FGoodsId = 7952782927033131997 AND FStoreId = 5351328954985378166 AND FTime < '12 15 2015 3:16PM' */ --换算当前单位的差异数 -- SELECT @DiffQty = CASE WHEN @ConvDir = 2 THEN @StdDiffQty / @ConvRate ELSE @StdDiffQty * @ConvRate END --计算标准单位的实际数量 SELECT @StdPhyQty = CASE WHEN @ConvDir = 2 THEN @PhyQty * @ConvRate ELSE @PhyQty / @ConvRate END --计算标准差异数量 SELECT @StdDiffQty = @StdPhyQty - @Quantity --换算当前单位的差异数 SELECT @DiffQty = CASE WHEN @ConvDir = 2 THEN @StdDiffQty / @ConvRate ELSE @StdDiffQty * @ConvRate END print @Quantity print @StdPhyQty print @StdDiffQty print @DiffQty UPDATE A SET A.FBookInventory = @Quantity, A.FPhyStdInventory = @StdPhyQty FROM TTakeStockDetailBatch AS A WHERE FId = @BillDetailId IF @StdDiffQty > 0 OR @StdDiffQty = 0 BEGIN UPDATE A SET A.FQuantity = @StdDiffQty, A.FStdQuantity = @StdDiffQty FROM TStockInDetail AS A,TStockInBill AS T WHERE T.FBillId = A.FBillId AND A.FGoodsId = @GoodsId AND A.FBillId = @StockInBillId IF @@ROWCOUNT = 0 BEGIN DECLARE @InDetailId BIGINT DECLARE @Price DECIMAL(18,6) SELECT @InDetailId = dbo.FNNewId() SELECT @Price = FPurCostPrice FROM TGoods WHERE FId = @GoodsId INSERT TStockInDetail(FId,FBillId,FSequence,FGoodsId,FUnitId,FPrice,FAmount,FQuantity,FFromQuantity, FAssistUnitId,FAssistQuantity,FSupplierId,FStoreId,FBatchNo,FPeriodDate,FStdQuantity,FIsAutoGen) SELECT @InDetailId,@StockInBillId,(SELECT MAX(FSequence) + 1 FROM TStockInDetail WHERE FBillId = @StockInBillId ), @GoodsId,@StdUnitId,@Price,@Price * @StdDiffQty,@StdDiffQty,@StdDiffQty, 0,0,0,@StoreId,'',NULL,0,1 END UPDATE A SET A.FInQuantity = B.FQuantity, A.FInStdQuantity = B.FStdQuantity FROM TInventoryHist AS A,TStockInDetail AS B WHERE FTransId = @StockInBillId AND A.FGoodsId = B.FGoodsId AND A.FTransId = B.FBillId AND A.FGoodsId = @GoodsId IF @@ROWCOUNT = 0 BEGIN UPDATE A SET A.FBillType = 'RK', A.FBizType = 'Profit', A.FOutQuantity = 0, A.FOutStdQuantity = 0, A.FInQuantity = @StdDiffQty, A.FInStdQuantity = @StdDiffQty, A.FTransId = @StockInBillId, A.FTransDetailId = @InDetailId FROM TInventoryHist AS A WHERE FTransId = @StockOutBillId AND A.FGoodsId = @GoodsId END END IF @StdDiffQty < 0 OR @StdDiffQty = 0 BEGIN UPDATE A SET A.FQuantity = -@StdDiffQty, A.FStdQuantity = -@StdDiffQty FROM TStockOutDetailBatch AS A,TStockOutBill AS T,TStockOutDetail AS B WHERE T.FBillId = A.FBillId AND B.FGoodsId = @GoodsId AND A.FBillId = @StockOutBillId AND B.FId = A.FDetailId IF @@ROWCOUNT = 0 BEGIN print 'count -------------------------' --明细 DECLARE @OutDetailId BIGINT SELECT @OutDetailId = dbo.FNNewId() INSERT TStockOutDetail(FId,FBillId,FSequence,FGoodsId,FUnitId) SELECT @OutDetailId,@StockOutBillId,(SELECT MAX(FSequence) + 1 FROM TStockOutDetail WHERE FBillId = @StockOutBillId ),@GoodsId,@StdUnitId INSERT TStockOutDetailBatch(FId,FBillId,FDetailId,FBatchNo,FQuantity,FStdQuantity) SELECT dbo.FNNewId(),@StockOutBillId,@OutDetailId,'',-@DiffQty,-@DiffQty END DELETE TStockInDetail WHERE FBillId = @StockInBillId AND FGoodsId = @GoodsId UPDATE A SET A.FOutQuantity = C.FQuantity, A.FOutStdQuantity = C.FStdQuantity FROM TInventoryHist AS A,TStockOutDetail AS B,TStockOutDetailBatch AS C WHERE FTransId = @StockOutBillId AND A.FGoodsId = B.FGoodsId AND A.FTransId = B.FBillId AND B.FId = C.FDetailId AND A.FGoodsId = @GoodsId IF @@ROWCOUNT = 0 BEGIN UPDATE A SET A.FBillType = 'CK', A.FBizType = 'Iosses', A.FInQuantity = 0, A.FInStdQuantity = 0, A.FOutQuantity = -@StdDiffQty, A.FOutStdQuantity = -@StdDiffQty, A.FTransId = @StockOutBillId, A.FTransDetailId = @OutDetailId FROM TInventoryHist AS A WHERE FTransId = @StockInBillId AND A.FGoodsId = @GoodsId END END EXEC PRecalcInventoryHistBalance @CompId,@GoodsId,@StoreId,NULL SELECT @Quantity = ISNULL(SUM(FInStdQuantity) - SUM(FOutStdQuantity),0) FROM TInventoryHist WHERE FCompId = @CompId AND FGoodsId = @GoodsId AND FStoreId = @StoreId UPDATE TInventory SET FQuantity = @Quantity WHERE FCompId = @CompID AND FGoodsId = @GoodsId AND FStoreId = @StoreId --break FETCH Cur INTO @GoodsId,@GoodsNo,@CompId,@CompNo,@StoreId END CLOSE Cur deallocate Cur go -- /* SELECT ISNULL(SUM(FInStdQuantity) - SUM(FOutStdQuantity),0) FROM TInventoryHist WHERE FCompId = 3472330288284041216 AND FGoodsId = 4837181226551091980 AND FTime < @BillTime SELECT * FROM TInventoryHist WHERE FGoodsId = 4837181226551091980 AND FCompId = 3472330288284041216 SELECT * FROM TTakeStockDetailBatch SELECT FStoreId,SUM(FQuantity) FROM TInventory GROUP BY FStoreId SELECT * FROM TTakeStockBill WHERE FStoreId = 5460289448040568312 SELECT * FROM TUser */