2014-01-29 83 views
1

我正在MS Access数据库的一个表中工作。我想使用一个iif语句来确定字段A的值是否符合有效格式(在这种情况下,一个或两个数字后跟一个字母)。如果是这样,我想只取A字段的数字部分(例如,如果字段A的一个条目是“15B”,我想只考虑“15”部分)并将其插入到当前空的字段中B,我已经创建。从一个字段中插入一部分值到另一个字段

如何编写仅考虑字段A的数字部分并将其插入字段B的MS Access查询?

+0

你试过了什么代码? – Matt

回答

1

对于你所说,你可以用like建立一个更新查询,这样的格局:

UPDATE tbl1 SET tbl1.ValB = 
    Switch([ValA] Like "#[a-z]",Left([valA],1), 
    [valA] Like "##[a-z]",Left([valA],2),True,NULL); 

或使用Val函数,该函数将尝试尽可能地从字符串转换转换为数字:

UPDATE tbl1 SET tbl1.ValB = 
iif(valA like "#[a-z]" or valA like "##[a-z]",val(ValA),NULL) 
+0

你提供的第一个陈述就像一个魅力。我之前没有使用switch语句或左/右函数。谢谢您的帮助! – user3250548

1

你需要id字段以及

Private Sub bntStart_Click() 
    On Error GoTo err_trap 

     Dim con As ADODB.Connection 
     Dim rsLocal, rsLocal_Upd As ADODB.Recordset 

     Dim sql_string As String 
     Dim counter, numeric_value As Integer 

     Set counter = 1 

     sql_string = "SELECT * FROM TblTest" 

     Set con = CurrentProject.Connection 
     Set rsLocal = con.Execute(sql_string) 

     If Not (rsLocal.BOF And rsLocal.EOF) Then 
      rsLocal.MoveFirst 
      While Not rsLocal.EOF 
       If Len(ExtractNumber(rsLocal.Fields("FieldA")) > 0) Then 
        numeric_value = ExtractNumber(rsLocal.Fields("FieldA")) 
        sql_string = "UPDATE TblTerms SET FieldB = " & numeric_value & " WHERE id = " & counter 
        Set con = CurrentProject.Connection 
        Set rsLocal_Upd = con.Execute(sql_string) 
       End If 
       rsLocal.MoveNext 
       counter = counter + 1 
      Wend 
     End If 

     Set con = Nothing 
     Exit Sub 

    err_trap: 
     MsgBox (Err.Description) 
     Set con = Nothing 

    End Sub 

    Function ExtractNumber(str As Srting) 
     Dim iCount As Integer, i As Integer 
     Dim sText As String 
     Dim lNum As String 


     'Written by OzGrid Business Applications 
     '[url]www.ozgrid.com[/url] 

     'Extracts a number from a cell containing text And numbers. 

     sText = str 

     For iCount = Len(sText) To 1 Step -1 
      If IsNumeric(Mid(sText, iCount, 1)) Then 
       i = i + 1 
       lNum = Mid(sText, iCount, 1) & lNum 
      End If 

      If i = 1 Then lNum = CInt(Mid(lNum, 1, 1)) 
     Next iCount 

     ExtractNumber = CLng(lNum) 
    End Function 

请注意,我把ExtractNumber从这里http://www.ozgrid.com/forum/showthread.php?t=18185

1

对于您的问题的验证部分,您可以使用Like模式匹配。以下是立即窗口的示例。

? "15A" Like "#[A-Z]" Or "15A" Like "##[A-Z]" 
True 

? "4B" Like "#[A-Z]" Or "4B" Like "##[A-Z]" 
True 

? "123A" Like "##[A-Z]" Or "123A" Like "##[A-Z]" 
False 

? "15AB" Like "#[A-Z]" Or "15AB" Like "##[A-Z]" 
False 

? "15!" Like "#[A-Z]" Or "15!" Like "##[A-Z]" 
False 

如果这些测试正确表达你的意图,你可以使用它作为验证规则Field A

Like "#[A-Z]" Or Like "##[A-Z]" 

至于Field B,你可以做,在一个字段表达式查询。

SELECT 
    [Field A], 
    Val([Field A]) AS [Field B] 
FROM YourTable; 

在任何需要查看的地方使用该查询[Field B]。采用这种方法,如果表中不存在[Field B],那么只要[Field A]值发生更改,您就不必关心更新[Field B]存储的值。

相关问题