Office中国论坛/Access中国论坛

标题: 如何把下面的VBA函数改写成SQL函数? [打印本页]

作者: yodong    时间: 2005-10-8 01:20
标题: 如何把下面的VBA函数改写成SQL函数?
本帖最后由 yodong 于 2012-3-3 16:18 编辑
把下面的VBA函数改写成SQL函数,如何写?

'各层的材料取出来加入到临时表中

Function NodeAdd1(parentID As String) '叠代函数

On Error GoTo aa

    Dim strSQL As String

    Dim sql1 As String

    Dim kk As String

    Dim rst As New ADODB.Recordset

    Dim cn As ADODB.Connection

    Set cn = CurrentProject.Connection

     strSQL = "select BOMID, 产品编号, 产品名称" & _

             " FROM dbo.CL_tblbom表 " & _

             " WHERE 父项 ='" & parentID & "'" & _

             " ORDER BY 产品名称"

     rst.Open strSQL, cn, adOpenDynamic, adLockReadOnly

    If rst.RecordCount = 0 Then Exit Function

    rst.MoveFirst

    On Error Resume Next

    Do While Not rst.EOF()

        '==============加入各层的材料

                 kk = rst("BOMID")

                 sql1 = "SELECT 物品编码,物品名称,单位,标准用量,层次,BOMID FROM  dbo.CL_tblbomsub WHERE BOMID ='" & kk & "'"

                 cn.Execute ("INSERT INTO dbo.展开临时表 (物品编号, 物品名称, 单位, 标准用量, 层次,BOMID) " & sql1)

        '=============='加入各层的材料

        NodeAdd1 (kk)

    rst.MoveNext

    Loop

    rst.Close

bb:

  Exit Function

aa:

MsgBox Err.Description, , sysstr

Resume bb

End Function

各位朋友,我想把上面这个函数改写成sql函数.

如下面:

ALTER FUNCTION dbo.bomjk

(

@bomid varchar(50)

)

RETURNS @bom table (

id int identity primary key,

BOMID varchar(50),

产品名称 varchar(150),

物品编号 varchar(150),

物品名称 varchar(150),

标准用量 int,

单位 varchar(50),

层次 int

)

AS

BEGIN

declare @bom1 varchar(50)--声明一个接受变量的值

INSERT INTO @bom (物品编号, 物品名称, 单位, 标准用量, 层次,BOMID) SELECT 物品编码,物品名称,单位,标准用量,层次,BOMID FROM  dbo.CL_tblbomsub WHERE BOMID = @bomid

declare mybom_cu cursor fast_forward for  --声明游标

select  BOMID FROM dbo.CL_tblbom表  WHERE 父项 =@bomid

         open mybom_cu  

     fetch next from mybom_cu into @bom1

         while @@fetch_status=0

  BEGIN

            INSERT INTO @bom (物品编号, 物品名称, 单位, 标准用量, 层次,BOMID)

                  SELECT 物品编码,物品名称,单位,标准用量,层次,BOMID FROM  dbo.CL_tblbomsub WHERE BOMID = @bom1

              --Execute BOMJK @BOM1

                 fetch next from mybom_cu into @bom1

             END

       RETURN

END



qwer(124242234) 17:19:41

是不是SQL函数不能执行它本身.

Execute BOMJK @BOM1


作者: yodong    时间: 2005-10-8 02:04
看来后台比较难,只能在前台完成了.
作者: ADAM    时间: 2005-10-8 18:09
你的BOM表體系是怎麼設計的呢.交流一下.

我的是這樣的.三個表BOM1(主表),BOM2(子表),ITEMMASTER(材料表,放置成品,半成品,原材料等)

BOM1結構(父編號,建檔日期,修改日期)

BOM2結構(父編號,行號,子編號,單位用量,損耗率,備注)

ITMEMASTE結構(編號,品名,規格,單位,庫存類別,單價,備注...)

做一個叫做材料BOM的查詢.結構為(父編號,最底層子編號,最底層單位用量,第1層子編號,第1層單位用量,...第4層單位用量)這里的子編號是展開至最底層的材料.

展開時,直接套用展開的父編號產量*BOM查詢,就可以知道最底層需要哪些材了.

1.我覺得對材料定義層次有點行不通,因為在我的BOM表中,每個半成品或材料都可能在每一個層次.

2.還有,為什麼要將展開的追加至臨時表中呢,會讓速度很慢的啊?

3.追加時不對用量進行換算嗎,如:第三層用量=第1層用量*第2層用量*第三層用量才對啊.

你是怎麼做的呢?????



[此贴子已经被作者于2005-10-8 10:14:50编辑过]


作者: yodong    时间: 2005-10-8 19:42
哈哈,ADAM你好,还记得我以前向你请教过吗?我正是根据你的贴子的方法来做的呀.表的结构跟你的差不多,只不过加多了几个版本呀,建立人什么的字段.你说的做个查询我不会做呀,所以只能每一层的追加到临时表中.慢,不是很慢呀
作者: ADAM    时间: 2005-10-9 00:45
給你看看比較暈的,這是我的查詢,你將其中的表名,字段替換成你的.再試試看.就知查詢怎麼做.這是材料BOM(bom2_base你把它當成bom2得了)SELECT BOM2_Base.父編號, CASE WHEN BOM2_BASE1.子編號 IS NULL

      THEN BOM2_BASE.子編號 WHEN BOM2_BASE2.子編號 IS NULL

      THEN BOM2_BASE1.子編號 WHEN BOM2_Base3.子編號 IS NULL

      THEN BOM2_BASE2.子編號 ELSE BOM2_BASE3.子編號 END AS 子編號0,

      round(CASE WHEN BOM2_BASE1.子編號 IS NULL

      THEN ISNULL(BOM2_Base.單位用量, 1) * (1 + ISNULL(BOM2_Base.損耗率, 0))

      WHEN BOM2_BASE2.子編號 IS NULL THEN ISNULL(BOM2_Base.單位用量, 1)

      * (1 + ISNULL(BOM2_Base.損耗率, 0)) * ISNULL(BOM2_Base1.單位用量, 1)

      * (1 + ISNULL(BOM2_Base1.損耗率, 0)) WHEN BOM2_Base3.子編號 IS NULL

      THEN ISNULL(BOM2_Base.單位用量, 1) * (1 + ISNULL(BOM2_Base.損耗率, 0))

      * ISNULL(BOM2_Base1.單位用量, 1) * (1 + ISNULL(BOM2_Base1.損耗率, 0))

      * ISNULL(BOM2_Base2.單位用量, 1) * (1 + ISNULL(BOM2_Base2.損耗率, 0))

      ELSE ISNULL(BOM2_Base.單位用量, 1) * (1 + ISNULL(BOM2_Base.損耗率, 0))

      * ISNULL(BOM2_Base1.單位用量, 1) * (1 + ISNULL(BOM2_Base1.損耗率, 0))

      * ISNULL(BOM2_Base2.單位用量, 1) * (1 + ISNULL(BOM2_Base2.損耗率, 0))

      * ISNULL(BOM2_Base3.單位用量, 1) * (1 + ISNULL(BOM2_Base3.損耗率, 0)) END, 4)

      AS 單位用量0, BOM2_Base.子編號 AS 子編號1, BOM2_Base.單位用量 AS 單位用量1,

      BOM2_Base.損耗率 AS 損耗率1, BOM2_Base1.子編號 AS 子編號2,

      BOM2_Base1.單位用量 AS 單位用量2, BOM2_Base1.損耗率 AS 損耗率2,

      BOM2_Base2.子編號 AS 子編號3, BOM2_Base2.單位用量 AS 單位用量3,

      BOM2_Base2.損耗率 AS 損耗率3, BOM2_Base3.子編號 AS 子編號4,

      BOM2_Base3.單位用量 AS 單位用量4, BOM2_Base3.損耗率 AS 損耗率4

FROM dbo.BOM2_Base LEFT OUTER JOIN

      dbo.BOM2_Base BOM2_Base1 ON

      dbo.BOM2_Base.子編號 = BOM2_Base1.父編號 LEFT OUTER JOIN

      dbo.BOM2_Base BOM2_Base3 RIGHT OUTER JOIN

      dbo.BOM2_Base BOM2_Base2 ON BOM2_Base3.父編號 = BOM2_Base2.子編號 ON

      BOM2_Base1.子編號 = BOM2_Base2.父編號
作者: yodong    时间: 2005-10-11 00:05
呵呵,真的比较晕
作者: yodong    时间: 2005-10-11 00:10
你有没有加权平均法的算法模块,共享一下.




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3