自动递增给特定号码的信

问题描述 投票:3回答:2

我需要帮助自动递增一封信。

表1中的描述字段具有如下值:B39

这个Table1记录,在表2中有相关记录:

B39_a
B39_b
B39_c
B39_d

我想要做的就是Table2中的描述自动获取table1中的记录并添加特定的字母。它总是以“a”开头,永远不会达到完整的字母表。

我已经尝试过这个网站的一些代码:http://www.freevbcode.com/ShowCode.asp?ID=5440

  Function IncrementString(ByVal strString As String) As String
  '
  ' Increments a string counter
  ' e.g.  "a" -> "b"
  '             "az" -> "ba"
  '       "zzz" -> "aaaa"
  '
  ' strString is the string to increment, assumed to be lower-case alphabetic
  ' Return value is the incremented string
  '

Dim lngLenString As Long
Dim strChar As String
Dim lngI As Long

lngLenString = Len(strString)

' Start at far right
For lngI = lngLenString To 0 Step -1

' If we reach the far left then add an A and exit
If lngI = 0 Then
   strString = "a" & strString
   Exit For
End If

' Consider next character
strChar = Mid(strString, lngI, 1)
If strChar = "z" Then
  ' If we find Z then increment this to A
  ' and increment the character after this (in next loop iteration)
  strString = Left$(strString, lngI - 1) & "a" & Mid(strString, lngI + 1, lngLenString)
Else
  ' Increment this non-Z and exit
  strString = Left$(strString, lngI - 1) & Chr(Asc(strChar) + 1) & Mid(strString, lngI + 1, lngLenString)
  Exit For
End If

 Next lngI

 IncrementString = strString
 Exit Function

 End Function

显然它不像它应该的那样工作。它增加了字母,但两次! (i,i,j,j等)

说明文本框(对于Table2记录)具有默认值:

 =IncrementString(DLast("[SeqNo]","[table2]"))

但就像我说的那样,通过加倍来增加数量。我还必须通过输入“a”手动启动该过程。

ms-access access-vba
2个回答
1
投票

函数和调用代码目前都不允许使用“A ## _”前缀。如果你真的必须将这个前缀保存到Table2,则必须调整代码来处理它。建议不要将“A ##”组标识符保存为Table2中的前缀。使用连接PK / FK字段上的表的查询来检索要导出的相关数据。

DLast()搜索必须考虑“A ##”组标识符,因为对每个组重复该序列。

不幸的是,尝试使用依赖于主窗体ID的动态参数设置DefaultValue属性是不切实际的。首先,子表单在主表单之前加载,因此无法构建默认值,因为主表单数据和控件不可用。此外,当主窗体移动到新记录时,再次没有要构建的默认值的数据。结果是新记录行上的控件显示错误。

使用PK / FK字段进行搜索。

子窗体中的代码调用递增函数的当前事件:

If Me.NewRecord And Not IsNull(Me.Parent.ReferenzNR) Then
    Me!SerienBezeichnung = IncrementString(Nz(DLast("SerienBezeichnung", "tbl_GrundminenSerie", "ID_FK=" & Me.Parent.ReferenzID), ""))
End If

请注意,即使现​​在正在工作,DLast()也可能最终失败,因为记录没有固有的顺序。替代方案可能涉及记录集或嵌套域聚合。在VBA立即窗口中测试的示例: ?DMax("SerienBezeichnung","tbl_GrundminenSerie","ID_FK=5 AND Len([SerienBezeichnung])=" & DMax("Len([SerienBezeichnung])","tbl_GrundminenSerie","ID_FK=5"))

或者,如果你觉得自动编号PK可以依赖于总是增加(这一直是我的观察,虽然不能保证自动编号): ?DLookup("SerienBezeichnung","tbl_GrundminenSerie","ID_FK=5 AND SerienID=" & DMax("SerienID","tbl_GrundminenSerie","ID_FK=5"))


1
投票

考虑以下VBA功能:

Function IncAlpha(ByVal strA As String, ByVal lngI As Long) As String
    If lngI <= 0 Then
        IncAlpha = strA
    ElseIf strA = vbNullString Then
        IncAlpha = IncAlpha("a", lngI - 1)
    Else
        lngI = lngI + Asc(Right(strA, 1)) - 97
        IncAlpha = IncAlpha(Left(strA, Len(strA) - 1), lngI \ 26) & Chr(97 + lngI Mod 26)
    End If
End Function

提供小写字母字符串,这个递归函数将通过提供的长整数参数递增字符串,z递增到aaaz递增到ba,依此类推。

提供空字符串(""),上面的函数将返回a

?IncAlpha("", 1)
a
?IncAlpha("", 26)
z
?IncAlpha("", 27)
aa
?IncAlpha("", 42)
ap
?IncAlpha("", 314159)
qvsa

使用此功能,可以使用以下方法计算后缀:

<prefix> & IncAlpha("", DCount("[SeqNo]","[table2]") + 1)

或者考虑多个前缀:

<prefix> & IncAlpha("", DCount("SeqNo","table2","SeqNo like '" & <prefix> & "*'") + 1)
© www.soinside.com 2019 - 2024. All rights reserved.