Неудобная проблема манипуляции со строкой DAO - PullRequest
3 голосов
/ 28 мая 2009

Я работаю с устаревшим продуктом vb6 и столкнулся с проблемой, из-за которой мне нужно получить часть имени файла полного пути из таблицы базы данных через DAO. У меня нет доступа к функциям VBA, поэтому я специально искал MS Access SQL. У меня нет возможности добавить дополнительный код после запроса. Я не могу изменить / реорганизовать решение за исключением изменения SQL.

Теперь у DAO нет функций instrrev или replace, поэтому я довольно ограничен.

Есть какие-нибудь догадки? Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 28 мая 2009

Вы должны иметь возможность использовать встроенные функции VBA, такие как instr, replace, mid и т. Д.

Существует режим "песочницы", который может их блокировать - см., Как разблокировать их http://support.microsoft.com/kb/294698

2 голосов
/ 28 мая 2009

Предполагая, что вы не можете изменить фактическую базу данных. , .

Единственное, о чем я могу подумать (и я в этом разбит мозгами, извините, приятель), это использовать повторные вызовы instr, вложенные в операторы iif, например. заменить этот вызов inStrRev

SELECT IIf(InStr([FileName],""\"")>0,Mid$([Filename],InStrRev([Filename],""\"")+1),[Filename]) FROM Table1

У тебя был бы совершенно безумный

SELECT IIf(InStr([FileName],""\"")>0,Mid$([Filename],iif(InStr(1, [FileName], ""\"") > 0, iif(InStr(2, [FileName], ""\"") > 0, iif(InStr(3, [FileName], ""\"") > 0, iif(InStr(4, [FileName], ""\"") > 0, iif(InStr(5, [FileName], ""\"") > 0, iif(InStr(6, [FileName], ""\"") > 0, iif(InStr(7, [FileName], ""\"") > 0, iif(InStr(8, [FileName], ""\"") > 0, iif(InStr(9, [FileName], ""\"") > 0, 1, InStr(9, [FileName], ""\"")), InStr(8, [FileName], ""\"")), InStr(7, [FileName], ""\"")), InStr(6, [FileName], ""\"")), InStr(5, [FileName], ""\"")), InStr(4, [FileName], ""\"")), InStr(3, [FileName], ""\"")), InStr(2, [FileName], ""\"")), InStr(1, [FileName], ""\""))),[Filename]) from table1

Это будет работать для пути длиной около 10 подпапок. Если вы думаете, что 10 подпапок - это слишком мало, у меня есть немного vba, чтобы сгенерировать утверждение на любой глубине, которая вам требуется.

Function BuildNestedIIfs(ByVal depth As Integer, byval maxDepth as integer) As String
    Dim locator As String
    If depth < maxDepth Then
        locator = "InStr(" & depth & ", [FileName], """"\"""")"
        Build = "iif(" & locator & " > 0, " & Build(depth + 1, maxDepth) & ", " & locator & ")"
    Else
       Build = "0"
    End If
End Function

Это непристойно, но должно работать

0 голосов
/ 28 мая 2009

Я много занимался программированием на DAO, но это было 10-15 лет назад ...

Можете ли вы изменить DAO для вызова Access QueryDef и затем исправить его там?

...