В таблице есть поля, содержащие текст в формате "параметр=значение". Например:
ALTNAME | Параметр1=Значение1 | Параметр2=Значение2 | Параметр3=Значение3 |
|
Я хотел сделать в ACCESS так называемый ЗАПРОС, разбивающий эти списки и возвращающий значения параметров как отдельные поля.
Сделал на VBA функцию:
Public Function ValueFromList(StrList As String, StrParam As String) As String
ValueFromList = ""
Dim P1, P2 As Long
P1 = InStr(1, StrList, StrParam, vbTextCompare)
P2 = InStr(P1 + 1, StrList, vbCrLf, vbTextCompare)
If P1 <= 0 Then Exit Function
ValueFromList = Mid(StrList, P1 + Len(StrParam) + 1, P2 - 1 - P1 - Len(StrParam))
End Function
В ACCESS использовал так:
SELECT
ValueFromList(CERTIFICATS.ALTNAME,"1.2.643.3.61.502710.1.7") AS KPP,
ValueFromList(CERTIFICATS.ALTNAME,"1.2.643.3.61.502710.1.5") AS SPZ,
ValueFromList(CERTIFICATS.ALTNAME,"1.2.643.3.61.502710.1.8") AS GMU
FROM CERTIFICATS
НО ЖЕСТКО ОБЛОМАЛСЯ ((( когда вызвал запрос из программы на Delphi.
Получил ошибку:
Неопределенная функция 'ValueFromList' в выражении. Ясно, что извне не доступен VBA.
Что можно придумать, чтобы не писать для каждого параметра порнуху типа этой:
SELECT
SWITCH(InStr(1, CERTIFICATS.ALTNAME, "1.2.643.3.61.502710.1.7=", 1),
MID(CERTIFICATS.ALTNAME, InStr(1, CERTIFICATS.ALTNAME, "1.2.643.3.61.502710.1.7=", 1)+Len("1.2.643.3.61.502710.1.7="),
InStr(InStr(1, CERTIFICATS.ALTNAME, "1.2.643.3.61.502710.1.7=", 1)+Len("1.2.643.3.61.502710.1.7="),
CERTIFICATS.ALTNAME, Chr(13) + Chr(10), 1)+Len(Chr(13) + Chr(10))-InStr(1, CERTIFICATS.ALTNAME, "1.2.643.3.61.502710.1.7=",1)
+Len("1.2.643.3.61.502710.1.7="))) AS KPP
FROM CERTIFICATS;
http://www.sql.ru/forum/1154928/polzovatelskaya-funkciya-v-baze-access