我也一样、本来就不机灵再加记忆力。。。没办法自己重新找几本有营养的数看,本来我的习惯是只用数据库单纯的“增”、“删”、“改”、“查”,甚至于链表查询都能不用就不用。但是受到项目经理吴哥的启发,他说如果你让数据库替你处理一些简单的逻辑那你前台页面就剩下显示了。
昨天查询需要自己编写了第一个可编程数据库函数,在吴哥指导下顺利完成、虽然比较简单,但是凡事都是由浅入深的吗、
SQL Server脚本源码:
USE [JinZhiSuLiao]
GO
/****** Object: UserDefinedFunction [dbo].[udf_GetSalesTable] Script Date: 11/29/2014 10:48:49 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[udf_GetSalesTable](@aPlanTranDate DATETIME,@aType int)
RETURNS
@S_Tabel TABLE(
CustomerId VARCHAR(50), -- 客户Id
CustomerName VARCHAR(50), -- 客户名称
ProductId VARCHAR(50), -- 产品Id
ProductName VARCHAR(50), -- 产品名称
UnitPrice decimal(9,3) DEFAULT 0.00, -- 单价
SingleWeight decimal(9,3) DEFAULT 0.00, -- 单个重量
TransportId VARCHAR(50), -- 运输派车单详细Id
AllNumber decimal(9,3) DEFAULT 0.00, -- 总数量
Allprice decimal(9,3) DEFAULT 0.00, -- 总金额
AllWeight decimal(9,3) DEFAULT 0.00, -- 总重量
EndNumber decimal(9,3) DEFAULT 0.00 -- 客户结款的数量
)
AS
BEGIN
declare @dtMainTable table
(
cCTSC_ID varchar(50)
)
DECLARE @nMainCount INT -- 运输派车单主表个数
IF(@aType = 0)
BEGIN
insert into @dtMainTable
SELECT CTSC_ID from CRM_TransportSendCar WHERE CONVERT(DATETIME,CTSC_Date,120) = CONVERT(DATETIME,@aPlanTranDate,120)
END
ELSE IF(@aType = 1)
BEGIN
insert into @dtMainTable
SELECT CTSC_ID from CRM_TransportSendCar WHERE Datepart(YEAR,CTSC_Date) = Datepart(YEAR,@aPlanTranDate) AND Datepart(month,CTSC_Date) = Datepart(month,@aPlanTranDate)
END
-- 定义一个游标
DECLARE @CTSC_ID VARCHAR(50)
DECLARE curMainId CURSOR FOR
SELECT cCTSC_ID FROM @dtMainTable
OPEN curMainId
FETCH NEXT FROM curMainId INTO @CTSC_ID
WHILE @@FETCH_STATUS = 0
BEGIN
-- 创建临时变量
DECLARE @CustomerId VARCHAR(50) -- 客户Id
DECLARE @CustomerName VARCHAR(50) -- 客户名称
DECLARE @ProductId VARCHAR(50) -- 产品Id
DECLARE @ProductName VARCHAR(50) -- 产品名称
DECLARE @UnitPrice decimal(9,3) -- 单价
DECLARE @SingleWeight decimal(9,3) -- 单个重量
DECLARE @TransportId VARCHAR(50) -- 运输派车单详细Id
DECLARE @AllNumber decimal(9,3) -- 总数量
DECLARE @Allprice decimal(9,3) -- 总金额
DECLARE @AllWeight decimal(9,3) -- 总重量
DECLARE @EndNumber decimal(9,3) -- 客户结款的数量
-- 运输派车单子表查询、一个主表对应一种产品
SELECT DISTINCT @CustomerId=CTSCD_CustomerID,@ProductId=CTSCD_ProductID,@UnitPrice=@UnitPrice FROM CRM_TransportSendCarDetails WHERE CTSCD_OrderID = @CTSC_ID
SELECT @CustomerName=CMC_Name FROM CRM_Customers WHERE CMC_ID = @CustomerId
SELECT @ProductName=BP_Name,@SingleWeight=BP_weight FROM BOM_Products WHERE BP_ID = @ProductId
SET @TransportId = @CTSC_ID
SELECT @AllNumber=SUM(CTSCD_OutNumbers) FROM CRM_TransportSendCarDetails WHERE CTSCD_OrderID = @CTSC_ID
SET @Allprice = @AllNumber * @UnitPrice
SET @AllWeight = @AllNumber * @SingleWeight
-- 客户结余数量未填写、2014-11-28当前未涉及到财务所以无法赋值——By:CaiYong
INSERT INTO @S_Tabel(CustomerId,CustomerName,ProductId,ProductName,UnitPrice,SingleWeight,TransportId,AllNumber,Allprice,AllWeight,EndNumber)
VALUES(@CustomerId,@CustomerName,@ProductId,@ProductName,@UnitPrice,@SingleWeight,@TransportId,@AllNumber,@Allprice,@AllWeight,@EndNumber)
FETCH NEXT FROM curMainId INTO @CTSC_ID
END
CLOSE curMainId;
DEALLOCATE curMainId;
RETURN
END