Access交流中心

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

[5分]在窗体模块中使用自定义函数,由于变量设置问题总报错

张建国  发表于:2018-09-05 21:32:41  
复制

各位老师,我想给程序中的编号写个自定义函数,就象开发平台中的自定义编号一样,由于在我的软件中有多个这样的编号,且多次使用。函数中要用到 left 和 dmax函数,这两个参数中都要用到编号这个字段,left函数要的是编号这个字段的值,而Dmax函数用到时表中字段名称,搞不好,一直报错,请帮我看看。

自定义函数代码:

Public Function No_refresh(a As String, b As Integer, c As String, d As Integer) As String '对报告编号、指导书号和原始记录号赋值
    Dim m, k As String
    Dim j As String
'a:更新的字段名称
'b:更新字段去除序号部分的位数
'c:更新字段表名称
'd:更新字段序号部分的位数
  m = Left(a, b)
  j = DMax("[&a&]", c, a Like " & m &  '*'&")
  k = Format(Val(Right(j, d) + 1), "& format(0,d) &")
  No_refresh = m & k
End Function

程序中使用该函数的语句:

Me.报告编号 = No_refresh(报告编号, 9, "MTB", 4)

软件窗体截图见附件。窗体截图,点击继续输入执行自定义函数


 

Top
红尘如烟 发表于:2018-09-05 21:59:52

参考下面的自动编号函数的写法:

'Domain 表名/查询名
'Expr 编号字段名
'Digit 编号位数(数字顺序号部分)
'Prefixal 编号前缀,可以是任意字符
Function AutoNumberStr(Domain As String, Expr As String, Digit As Long, Optional Prefixal As String) As String
    AutoNumberStr = Nz(DMax(Expr, Domain, Expr & " Like '" & Prefixal & "*'"))
    AutoNumberStr = Val(Mid(AutoNumberStr, Len(Prefixal) + 1)) + 1
    AutoNumberStr = Prefixal & Format(AutoNumberStr, String(Digit, "0"))
End Function

 

 



张建国 发表于:2018-09-05 22:59:08

老师,您好,还是出现如下错误:

我的自定义函数代码参考您提供的代码后,修改如下(前缀也是不同的,不能通过函数变量提供,需要从既有参数中取得):

Public Function NO_Auto(Expr As String, m As Integer, domin As String, n As Integer) As String  '对报告编号、指导书号和原始记录号赋一个唯一性的值
    Dim Prefixal As String
    'expr:更新的字段名称
    'm:更新字段去除序号部分的位数
    'domin:更新字段表名称
    'n:更新字段序号部分的位数
  Prefixal = Left(Expr, m)
  NO_Auto = Nz(DMax(Expr, domin, Expr & " Like'" & Prefixal & "*'"))
  NO_Auto = Val(Right(Expr, n)) + 1
  NO_Auto = Prefixal & Format(NO_Auto, String(n, "0"))
End Function
继续输入点击事件中的自定义函数代码:

Me.报告编号 = NO_Auto("报告编号", 9, "MTB", 4)对照截图

红尘如烟 发表于:2018-09-06 12:04:07

你就用我发给你的函数就行的。

关键在于你调用的有问题。你前缀部分如果不是固定的,要从哪里去取?

把这个问题搞清楚就很容易了。

哪怕前面的日期,你也可以作为前缀的一部分来看待。

比如:

‘自动编号函数
'Domain 表名/查询名
'Expr 编号字段名
'Digit 编号位数(数字顺序号部分)
'Prefixal 编号前缀,可以是任意字符
Function AutoNumberStr(Domain As String, Expr As String, Digit As Long, Optional Prefixal As String) As String
    AutoNumberStr = Nz(DMax(Expr, Domain, Expr & " Like '" & Prefixal & "*'"))
    AutoNumberStr = Val(Mid(AutoNumberStr, Len(Prefixal) + 1)) + 1
    AutoNumberStr = Prefixal & Format(AutoNumberStr, String(Digit, "0"))
End Function


'调用代码示例:
Me.报告编号 = AutoNumberStr("表1", "报告编号", 4, Left(Me.委托编号, 7) & "MT")



张建国 发表于:2018-09-06 15:58:57

老师,您好!还是不能通过,自定义函数NO_Auto中的第一个参数expr直接代入的是“报告编号”这四个汉字的字符串,而不是报告编号这个字段名。所以现在点击继续输入后,得到的值是2017042MT0001,这个编号目前已经编到0009号,0001号重复,报错了。

Public Function NO_Auto(Expr As String, domin As String, n As Integer, Optional prefixal As String) As String '对报告编号、指导书号和原始记录号赋一个唯一性的值
    'expr:更新的字段名称
    'm:更新字段去除序号部分的位数
    'domin:更新字段表名称
    'n:更新字段序号部分的位数
  NO_Auto = Nz(DMax(Expr, domin, Expr & " Like'" & prefixal & "*'"))
  NO_Auto = Val(Right(Expr, n)) + 1
  NO_Auto = prefixal & Format(NO_Auto, String(n, "0"))
End Function



红尘如烟 发表于:2018-09-06 16:15:10

我是让你用我发的那个函数就行了,你那个函数你也没改对。

 NO_Auto = Val(Right(Expr, n)) + 1  ‘你写成这样是对字段名进行操作了

 NO_Auto = Val(Right(NO_Auto, n)) + 1 '要对取得的值进行处理才对



张建国 发表于:2018-09-06 21:54:53
解决了,非常感谢红尘如烟老师!


总记录:6篇  页次:1/1 9 1 :