У меня есть случай, когда я пытаюсь извлечь значение состояния из поля описания. Однако мне нужно изменить некоторые столбцы в зависимости от состояния. Итак, вот что у меня есть

Описание Пример: Управление EXECUTIVE CTJACKSONVILLE.FL.32216-4041

Function getState(description As String) As String
    Dim s() As String
    s = Split(description, ".")
    getState = s(UBound(s) - 1)
End Function

Я хочу изменить некоторые столбцы в зависимости от того, возвращает ли он правильное сокращение состояния или нет. Если значение не возвращает действительное состояние, я хочу отметить счет. Так что-то вроде этого ...

UPDATE tblInvoices
SET [Invoice Flag] = True
Where getState(description) <> ValidStates.Abbreviation

Что-то в этом роде. Извините за новичок. Любая помощь приветствуется!

1
user2296381 27 Июн 2013 в 17:12

1 ответ

Лучший ответ

Я бы создал функцию под названием isValidState(), которая возвращает логическое значение

Function isValidState(st As String) As Boolean
    Select Case st
        Case "AL", "FL", "NY" ...
            isValidState = True
        Case Else
            isValidState = False
    End Select
End Function

Другой способ - создать таблицу со всеми кодами состояний (назовем ее MyStateTable)

Function isValidState(st As String) As Boolean
    Dim db As Database
    Dim rs As Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("MyStateTable")
    rs.FindFirst ("StateFieldName = '" & st & "'")
    If rs.NoMatch Then
        isValidState = False
    Else
        isValidState = True
    End If
    rs.Close
End Function

Ваш запрос будет выглядеть примерно так

UPDATE tblInvoices
SET [Invoice Flag] = True
Where isValidState(getState(description)) = True

Редактировать:

Function getState(description As String) As String
    Dim s() As String
    s = Split(description, ".")
    If (UBound(s) > 1) then
        getState = s(UBound(s) - 1)
    Else
        getState = vbNullString 'Or change this to "" or something else that makes sense for your usage'
    End if
End Function
2
ashareef 27 Июн 2013 в 18:36
Извините, но как мне вставить это в SQL-запрос, где мне нужно изменить флаг счета-фактуры на True? Думаю, мой вопрос в том, как совместить выполнение функции внутри SQL-запроса?
 – 
user2296381
27 Июн 2013 в 17:23
Извините, у меня есть последняя проблема: поскольку я не запускал функцию - я не уверен, что нужно цитировать и тому подобное в Access. Я все время получаю сообщение об ошибке: «Ошибка компиляции: ожидаемое выражение» ... Не уверен, где мне нужны кавычки и & CurrentDb.Execute «Обработка ОБНОВЛЕНИЯ» & _ "SET [Комментарии] = 'Просмотреть все строки заказа на поставку. Отправить в состояние невозможно быть определенным. ', [Invoice Flag] = True "& _" WHERE "& isValidState (getState (&" [Inv Description] "&))
 – 
user2296381
27 Июн 2013 в 17:55
Nevermind - Теперь у меня проблема с isValidState. Для rs.FindFirst ("StateFieldName = '" & st & "'") я возвращаю "Операция не поддерживается для этого типа объекта"
 – 
user2296381
27 Июн 2013 в 18:04
Думаю, вам нужен пробел между True и WHERE. Хороший способ проверить свои строки SQL - это установить точку останова на строке кода, которую вы хотите проверить, а затем в окне немедленного выполнения (Ctrl + G) вы можете ввести ?<your expression и увидеть результат. Например. ?1+1 вернет 2, поэтому в вашем случае SQL у вас будет что-то вроде `?" UPDATE ....... "&" ... "и т. Д.
 – 
ashareef
27 Июн 2013 в 18:05
Попробуйте Set rs = db.OpenRecordset("MyStateTable",dbOpenSnapshot), а если это не сработает, попробуйте Set rs = db.OpenRecordset("MyStateTable", dbOpenDynaset)
 – 
ashareef
27 Июн 2013 в 18:08