设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2725|回复: 6
打印 上一主题 下一主题

如何把下面的VBA函数改写成SQL函数?

[复制链接]
跳转到指定楼层
1#
发表于 2005-10-8 01:20:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2005-10-8 02:04:00 | 只看该作者
看来后台比较难,只能在前台完成了.
3#
发表于 2005-10-8 18:09:00 | 只看该作者
你的BOM表體系是怎麼設計的呢.交流一下.

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

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

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

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

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

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

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

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

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

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



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

4#
 楼主| 发表于 2005-10-8 19:42:00 | 只看该作者
哈哈,ADAM你好,还记得我以前向你请教过吗?我正是根据你的贴子的方法来做的呀.表的结构跟你的差不多,只不过加多了几个版本呀,建立人什么的字段.你说的做个查询我不会做呀,所以只能每一层的追加到临时表中.慢,不是很慢呀
5#
发表于 2005-10-9 00:45:00 | 只看该作者
給你看看比較暈的,這是我的查詢,你將其中的表名,字段替換成你的.再試試看.就知查詢怎麼做.這是材料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.父編號
6#
 楼主| 发表于 2005-10-11 00:05:00 | 只看该作者
呵呵,真的比较晕
7#
 楼主| 发表于 2005-10-11 00:10:00 | 只看该作者
你有没有加权平均法的算法模块,共享一下.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-9-22 15:39 , Processed in 0.093864 second(s), 30 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表