2010-03-02 6 views
1

В одной из таблиц доступа ms, с которыми мы работаем, у нас есть текстовое поле с заданным размером. В конце этого поля есть дополнительный код, который изменяется в зависимости от ситуации. Я ищу способ удалить один из этих кодов, но даже если последняя часть усечена максимальным размером поля.MS-Access: Заменить «кронштейн»

Давайте назовем поле «поле» и код, который я ищу, чтобы удалить «abc-longcode».

Если я использую замену SQL-функции с помощью строки abc-longcode, запрос будет работать только тогда, когда код будет завершен.

Если я также хочу, чтобы мой запрос на обновление (который ничего не делал, кроме как удалить этот код в конце моего поля) работал над неполными кодами, как это перевести в ms-SQL?

Было бы необходимо удалить (или заменить «», чтобы быть точным) все из следующих (например, конечно, а не реальные коды):

abc-longcode 
abc-longcod 
abc-longco 
abc-longc 
abc-long 
abc-lon 
abc-lo 
abc-l 

Очевидно, что я мог бы сделать это с несколькими запросами. Каждый из них заменяет один из ожидаемых усеченных кодов ... но он не кажется оптимальным.

Кроме того, когда поле достаточно велико, чтобы получить весь код, в конце может появиться дополнительная информация, которую я также хочу сохранить, поэтому я не могу просто искать «abc-l» и удалять все, что следует: \

Этот запрос (или запросы, если я не могу найти лучший способ) будет храниться непосредственно в базе данных .mdb.

Так что, хотя я могу придумать несколько способов сделать это за пределами запроса ms-sql, это не помогает мне.

Любая помощь? Спасибо.

ответ

1

Вы можете написать собственный метод замены VBA, который заменит любой из данных случаев {"abc-longcode", ... "abc-l"}. Это по существу то же самое, что и идея «нескольких запросов», за исключением того, что это будет только один запрос. Мой VBA ржавый, но что-то вроде:

public function ReplaceCodes(str as string) as string 
    dim returnString as string 

    returnString = str 
    returnString = replace(returnString,"abc-longcode","") 
    // ... etc... 

    ReplaceCodes = returnString 
end function 

Я, возможно, получил заказ параметра неправильно на замену :)

+0

я предпочел бы чисто SQL путь к сделайте это, но я не думаю, что это можно сделать. Мне нравится этот ответ, так как он также позволяет мне вводить другие коды в ту же функцию, что и я буду искать. пример: def-longcode, def-longcod и т. д. Спасибо за помощь! –

+0

чисто альтернатива SQL - это длинная последовательность функций замены в запросе, которую трудно читать, трудно поддерживать и уродливо.Доступ уже довольно уродлив :) –

0

Я хотел бы использовать свою собственную функцию, чтобы сделать это с помощью функции split, чтобы получить первый часть строки. Затем вы можете использовать это значение в запросе обновления.

Public Function FirstPart(thetext As String) As String 
    Dim ret As String 
    Dim arrSplitText As Variant 

    arrSplitText = Split(thetext, "-") 
    ret = arrSplitText(0) 

    FirstPart = ret 
End Function 
0

Вы можете использовать:

Left(FieldX,InStr(FieldX,"abc-")-1) 

EDIT снова Комментарий

Если есть пробел или другой стандартный разделитель:

IIf(InStr(InStr(FieldX, "abc-"), FieldX, " ") = 0, Left(FieldX, InStr(FieldX, "abc-") - 1), Replace(FieldX, Mid(FieldX, InStr(FieldX, "abc-"), InStr(InStr(FieldX, "abc-"), FieldX, " ") - InStr(FieldX, "abc-")), "")) 
+0

Мне нравится этот ответ для его чисто сущности SQL, но проблема с этим кодом заключается в том, что если мой длинный код завершен в поле и есть дополнительные данные в конце поля, это не будет поддерживать это дополнительные детали. Другими словами, он удаляет все, начиная с того, что я ищу вместо «просто», что я ищу. –

+0

Я не думаю, что вы действительно правильно определили вопрос, поскольку я понятия не имею, к чему вы хотите превратить ваши образцы данных. И, насколько я вижу, ваши образцы данных не включают данные после материала, который вы хотите удалить, поэтому довольно заявить, что вы придумаете решение. –

+0

@ David W Fenton а? :) – Fionnuala

Смежные вопросы