Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

怎样写vba代码能够实现在该《商品库存及配送管理系统》中根据库存和需求自动调配商品?

清风徐来  发表于:2016-03-07 16:26:44  
复制

我做的《商品库存及配送管理系统》中的“商品配送”窗体包含“需求”主窗体和“库存”、“配送”2个子窗体,“需求”主窗体的每条记录显示某一分场对某种商品的需求数量,“库存”子窗体显示来自多个供货商的该种商品的库存数量,“配送”子窗体用于根据“库存”子窗体中显示的库存数量为该分场配送其所需数量的该种商品,并在确认配送的同时更新库存和需求数据。目前是人工操作,即在“需求”主窗体中新录入一条记录后,将“库存”子窗体中第一条记录的 “库存ID”、“供货商”字段值分别录入“配送”子窗体的“库存ID”、“供货商”字段中,然后视以下情形进行不同的操作:

一、若该条记录的“库存数量”字段值大于或等于“需求”主窗体的“需求数量”字段值,则在“配送”子窗体的“配送数量”字段中录入“需求”主窗体的“需求数量”字段值,点击“确认配送”按钮,更新“库存”子窗体中该条记录的“库存数量”字段值、“需求”主窗体中的“需求数量”字段值;

二、若该条记录的“库存数量”字段值小于“需求”主窗体的“需求数量”字段值,则在“配送”子窗体的“配送数量”字段中录入该条记录的“库存数量”字段值后,点击“确认配送”按钮进行库存和需求数据更新,然后将“库存”子窗体中的下一条记录的“库存ID”、“供货商”字段值分别录入“配送”子窗体下一条记录(下一行)的“库存ID”、“供货商”字段中,若该条记录的“库存数量”字段值仍小于“需求”主窗体的“需求数量”字段值,则重复进行上述操作,直至更新后的“库存数量”字段值大于或等于“需求”主窗体的“需求数量”字段值的记录,则重复上述第一种情形下的操作。

          求教:怎样写vba代码实现在“需求”主窗体中录入一条记录后,点击“配送”按钮就能自动完成上述操作(即实现商品的自动调配)?另请帮我看看程序是否还有其他需改进之处。谢谢!点击下载此附件

 

Top
杜超 发表于:2016-03-07 21:15:18


库存计算方法剖析



http://www.accessoft.com/article-show.asp?id=4863



利用联合查询实现库存计算



http://www.accessoft.com/article-show.asp?id=280



一库存统计例子[Access软件网]



http://www.accessoft.com/article-show.asp?id=8465





清风徐来 发表于:2016-03-08 08:28:04
谢谢杜超大师!不过貌似您没有仔细看我的帖,所以给的几个链接是答非所问,我需要解决的不是库存计算问题,而是如何根据需求和库存自动调配商品,我自己做的程序需要人工录入的操作较多,我希望能够实现一键自动完成。麻烦您再看看我的帖,谢谢!

清风徐来 发表于:2016-03-09 09:56:11
相信我的问题对于精通vba的大神们不过小菜一碟,为何除了杜超老师就没人出招了呢?跪求各位大神不吝赐教,也算行善积德哦!千恩万谢先!

朱先生 发表于:2016-03-13 23:51:05

DoCmd.RunSQL "updatE 库存表 SET 库存数量=nz(库存数量)-'" & Me.需求数量 & "' WHERE VAL(库存ID) =VAL('" & Me.[库存子窗体]![库存ID] & "' )"

Me.库存子窗体.Requery
DoCmd.RunSQL "updatE 需求表 SET 需求数量=nz(需求数量)-'" & Me.[配送子窗体]![配送数量] & "' WHERE VAL(需求ID) =VAL('" & Me.[需求ID] & "' )"

Me.配送子窗体.Requery

添加一个下一条的按钮

库存表的库存数量准则>=0去掉,不去掉年会产生0值冲突的错误提示

库存量小于需求量的要做二次配送,也就是配送子窗体中每次只能有一行记录

主窗体需求数量、库存子窗体的库存数量都要>0,使等于0的数据不显示出来,便于操作,不怕麻烦也可以不采用此方法

代码有了,就看你引用吧,祝你好运!

你是采用全部绑定还是保持全部绑定,结构没作改变

供应商8个,商品4个,库存表中最多只有32条记录,你的库存表已大于32条记录,说明入库时没有进行库存的更新



清风徐来 发表于:2016-03-14 15:51:58

朱先生,您好!非常感谢您的热忱帮助!但我还得再请教您:按照您的指点,我把库存表的库存数量、需求表的需求数量字段的有效性规则>=0都删除了,用选择查询实现了库存子窗体只显示库存数量>0的记录,但需求主窗体仍保留需求数量为0的记录(因为我需要据此知道哪些需求已完成配送,而窗体打开时,焦点默认在新记录上,不会给操作带来不便),然后把窗体中原来那个“确认配送”按钮改名为“配送商品”,在它的单击事件中引用您给的代码,执行后弹出提示说1条记录未更新,原因是类型转换失败,问是否继续更新,我选择了“否”,此时库存子窗体的记录已经更新了,说明更新库存的第一条语句已被执行且无问题,但“需求”主窗体中的记录没有更新,点击“调试”按钮进入vba代码编辑界面,显示问题出在更新需求的第二条语句中,提示1条记录未更新,实际就是未执行第二条语句,需求记录未更新。另外,第一条语句执行后,在配送子窗体中没有写入任何数据,不能反映配送情况,是否需要另写一条语句将此次配送记录写入配送子窗体?麻烦您再帮我看看如何解决。谢谢!

关于您提到的库存表中的记录数问题,我想是这样的:不是8个供应商对4种商品各供货一次,因此在供货商和商品种类数不变的情况下,库存表里的记录也会因供货次数增加而增加,库存记录数是动态增大的,如果入库时没有更新库存,即入库表里的新纪录没有追加到库存表,那么库存表里的记录只会更少而不会更多,不知对否?



朱先生 发表于:2016-03-14 18:21:26

入库表是不断增大,但库存表是不增大的

查了你的库存发现重复记录

光明:豆奶2条、曲奇2条、柠檬2条。新世纪:豆奶2条、曲奇2条。口福多:豆奶2条、曲奇2条、柠檬2条

这都是不正常的。要解决这个问题,就要写入库的代码,入库时更新库存数量

你的表设计中数据类型中数字太多,只要将后续需要参与运算的字段设为数字,其他应设为文本比较合适

我这里没出现你所说的异常

第一条语句是减少库存数量,第二条语句是减少需求量

如要在配送子窗体反应配送情况,需要在配送表加一个字段,确实还要写一段代码

再上传你的附件,必须是2003的格式,accdb格式我打不开,上次也是在别人的电脑上才看到你数据库中的内容



清风徐来 发表于:2016-03-15 13:11:54

朱先生好!衷心感谢您的热心帮助!

关于库存记录数增大和存在重复记录的问题,我想我需要解释一下:我的库存表需要将每个供应商每次、每种商品的入库数量分别记录,而不是把同一个供应商的同一种商品的入库数量累加起来,因此对于同一个供应商和同一种商品来说必然有重复记录,换言之,我的库存表和入库表的记录是一一对应的,和入库表一样会不断增大。之所以如此,是因为我需要在配送记录里查询每一次配送的每一种商品来自哪一个供应商的哪一次供货,这是我的库存表与一般库存表不同之处。

我的程序是用access2010版做的,我试过转存为2003格式未成功,提示说“不能用旧版本的格式保存此数据库,因为此数据库使用的某些功能需要使用当前的文件格式”。

现将修改过的附件上传,麻烦您再帮我看看。谢谢!点击下载此附件



朱先生 发表于:2016-03-15 18:56:40

2010可以转成2003的方法较多,只不过你没掌握技巧

你再把这个问题发到论坛求解



朱先生 发表于:2016-03-17 09:05:44

  再加一句插入到配送表的代码即可

但是发生了每次都 插入两行,原因是配送子窗体中隐藏字段自动产生了一行记录,还没有排除掉

插入的代码:

DIM TEMp AS STRING                                

 TEMP = "INSERT INTO 配送表 (供货商ID,配送数量,分场ID)"
        TEMP = TEMP & "VALUEs ('" & Me.[配送子窗体]![供货商ID] & "','" & Me.[配送子窗体]![配送数量] & "','" & Me.[配送子窗体]![分场ID] & "')"
        DoCmd.RunSQL TEMP    

试一下吧                                                                              



朱先生 发表于:2016-03-17 20:20:15
窗体设计错误,应该把配送子窗体去掉

朱先生 发表于:2016-03-17 22:50:39

商品配送示例

用你的附件中的表和窗体没办法做,到处是ID,商品有名称不用而用ID,分场、供应商也要如此,很少用到名称

做了个示例,基本与你的相同,依着改吧

在示例中运行,观察数据是否有不对的地方。



清风徐来 发表于:2016-03-20 16:55:15
朱先生好!真是让您费心了!非常感谢!您给的示例我一时弄不明白,需要慢慢学习、消化。先请教2个问题:1、点击示例窗体里的“配送商品”按钮后,并无任何数据在窗体中部的配送记录那几个未绑定字段中显示出来,那么把这些字段放在这里起什么作用呢?2、配送情况是否必须打开配送表查看呢?按我原来的设计意图是要在配送窗体中随每一条需求记录显示对应的配送记录,这个能否做到呢?

朱先生 发表于:2016-03-20 21:06:33
清风徐来 发表于:2016-03-21 11:21:14
朱先生好!原来示例窗体中间的配送数据是需要人工输入的,这不是和我之前做的的窗体功能一样了吗?我之前的窗体也是需要输入配送数据,然后点“确认配送”按钮执行更新查询就可更新库存和需求数据,那是没写代码就做到了的。我希望实现的是不用输入配送数据,点一下“商品配送”按钮就能自动根据需求和库存数量配送商品,且自动将配送数据输入配送表,而在“配送子窗体”中只显示当前这一条需求记录对应的配送记录。我想这只有借助vba代码才有可能做到,由于本人的vba编程水平仅为菜鸟级,所以来论坛向高人求助。可能是我对自己的需求表述不够清楚,或者是该需求超出了vba可解决问题的范围,劳烦您煞费苦心、鼎力相助后仍未能助我达成目标。实在不好意思再麻烦您了,我想将此问题暂且搁置,留待今后有条件时再解决。问题虽未解决,仍从您的指教中受益不少,在此向您表示诚挚的谢意,并祝您健康快乐!

朱先生 发表于:2016-03-22 19:52:39

有改娈的示例

原来是我没理解你的要求,走了不少弯路,也给了我锻炼的机会,我和你差不多也是菜鸟级的

具体用法见窗体中,如适用,窗体布置你做吧



清风徐来 发表于:2016-04-01 09:36:58

朱先生好!时隔多日再来论坛,才知道您又给了我新的示例,对您的锲而不舍深表敬意!看了这个示例,感到它向我的目标迈进了一大步,但我还有一些疑惑:1、中间那两个过渡字段起什么作用?能不能不要或者不放在窗体中?因为其中“已配送数量”字段显示的是最后一次的配送数量,而不是当前需求已配送数量的累计,与当前需求实际的已配送数量不符,在“商品配送”窗体中查看每一项需求对应的配送情况时,除最后一项外,其他都没有对应关系。2、让配送子窗体只显示当前需求对应的配送情况(我已经通过添加“需求ID”为链接字段改成这样了),就可以实现在“商品配送”窗体中看到每一项需求对应的配送情况(10版还可自动对组合配送汇总),是否因此就可以取消或者隐藏那两个过渡字段?3、新示例需要先在库存子窗体中双击“库存ID”,选择一条库存记录,然后再单击“配送商品”按钮,这样的操作会进行一次或N次才能完成一项需求的商品配送,我的终极目标—— 一键(单击“配送商品”按钮)实现商品自动调配有没有可能实现?换言之,能不能把全部操作放在“配送商品”按钮的单击事件过程中完成呢?如果朱先生仍然乐意,就请您再费心帮我攻关。再拜叩首!另外,朱先生说您和我差不多,也是菜鸟级别,这是您过谦了!如果您是菜鸟,那我只能是……死鸟啦,哈哈



朱先生 发表于:2016-04-01 11:05:33

中间两个过渡字段随便放于窗体任意位置,将其属性可见改为否

两个不同的事件我认为不可能放在一起,也许有人能帮你

就如增加记录与保存记录放不到一起一样,要做两个动作

点击两下完成一个单位的配送,已经方便得很了,比输入配送数字后再按配送按钮要快



清风徐来 发表于:2016-04-06 11:09:56

点击下载此附件

朱先生您好!根据您的意见,我已决定从我的终极目标——一键自动调配退而求其次,采用您惠赐的示例的方案,并根据我的需要对该方案作了一些小的修改,做成了此次上传的附件。我的修改包括:1、由于我需要在每一项需求的配送完成后能够在“商品配送”窗体中查看其配送记录,故删除了“需求数量”的筛选条件“>0”;2、由于我只需在“商品配送”窗体中看到当前需求对应的配送记录,让窗体中显示的数据更清晰明了,故通过将“需求ID”添加为链接字段,使“配送表子窗体”只显示当前需求对应的配送记录;3、我原打算把那两个过渡字段的“可见”属性设置为“否”,后来考虑到为了准确把握操作进度,避免操作过程中忘了进行到哪一步了(是否已双击过“库存ID”),故让它们仍然可见,但根据其性质和作用,将名称分别改为了“拟配送数量”和“对应库存ID”;4、在“确认配送”按钮(原“配送商品”按钮,我认为这个名称与“拟配送数量”字段相配更准确)的单击事件代码的两条更新语句后加上了“Forms!商品配送!拟配送数量 = Null”和“Forms!商品配送!对应库存ID = Null”,让这两个字段在每次配送完成后显示空值,目的是避免只显示最后一次拟配送数据,与前面的需求记录没有对应关系的这两个字段的值造成逻辑混乱;5、在“库存表子窗体”的“库存ID”文本框的双击事件过程代码的“If……Else……”语句中间加上了“Elseif……”,设置条件为:库存数量 < Forms!商品配送!需求数量,将“Else……”的操作改为:MsgBox "该项需求的配送已完成",目的是避免重复配送。麻烦您再帮我看看还有没有什么问题。

另外,我曾试图在Access 10版的“保存并发布”那里将Accdb格式的数据库文件转存为mdb格式(“百度”到的几乎都是此法)未果,系统提示“不能用旧版本的格式保存此数据库,因为此数据库使用的某些功能需要使用当前的文件格式”,您说过Accdb转mdb有很多方法,不知通过安装03版,在03版里导入10版里的数据库对象后保存为mdb格式是否可行?我想可能低版本无法导入高版本创建的对象吧。有些什么可行的方法?关于这个问题,也请您不吝赐教。

非常感谢您不厌其烦的热心指点!



朱先生 发表于:2016-04-06 11:43:12

不简单啊,历时一个月,终于可以欣赏我们合作的成果

恭喜你完成任务!

这个设计操作还是比较方便的,只需点击鼠标就行了,键盘都可以不要了。

在03版里导入10版里的数据库对象后保存为mdb格式是否可行?行

我想可能低版本无法导入高版本创建的对象吧。可以

 



清风徐来 发表于:2016-04-07 10:59:05

朱先生好!毫无疑义,我能够完成任务全靠您的鼎力相助,所谓“大恩不言谢”,我就不再道谢了哈!我想这个东东是你的智慧结晶,也是您的工作成果,也许您以后可以将它作为一个范例提供给有类似需求者参考吧。为了进一步完善它,我还有个问题想请您帮忙解决:对于已完成配送(需求数量已为0)的需求项,我已通过修改“if……else……”语句,设置文本框提示,避免了再次双击“库存ID”的误操作造成重复配送,但操作人在为一项需求配送商品时有可能发生两种对“确认配送”按钮的误操作:1、在未双击“库存ID”选择配送商品来源和数量时就单击“确认配送”按钮;2、在已完成配送后再次单击“确认配送”按钮。由于我添加了在一次配送完成后使那两个过渡字段显示空值的代码,这2种情况都会导致使该需求项的“需求数量”字段被清空的错误,第1种情况造成该需求项尚未完成配送时需求数量就丢失了,第2种情况造成该需求项的“需求数量”字段本该显示0却显示为空值。为了避免这两种误操作造成上述错误,我将“确认配送”按钮的单击事件代码改写成下面这样:

Private Sub 确认配送_Click()
    DoCmd.SetWarnings False

    If Forms!商品配送!需求数量 >0 and Forms!商品配送!拟配送数量 <> Null Then

    DoCmd.RunSQL "updatE 库存表 SET 库存数量=库存数量-'" & Me.拟配送数量 & "' WHERE VAL(库存ID) ='" & Me.[对应库存ID] & "' "
    Me.库存表子窗体.Requery
    DoCmd.RunSQL "updatE 需求表 SET 需求数量=nz(需求数量)-'" & Me.[拟配送数量] & "' WHERE VAL(需求ID) =VAL('" & Me.[需求ID] & "' )"
    Forms!商品配送!拟配送数量 = Null
    Forms!商品配送!对应库存ID = Null
    Me.Refresh
    Me.配送表子窗体.Requery
    Else

    MsgBox "该项需求的配送未拟定方案或已完成"

    End If

    DoCmd.SetWarnings True
    End Sub

执行的结果是正确的操作和误操作都被 "该项需求的配送未拟定方案或已完成"的文本框提示阻止了,显然是我改写的代码有问题,代码应该怎么写才能达到目的?再请您指导。 

总记录:38篇  页次:1/2 9 1 2 8 :