Неудобная проблема с манипуляцией строками DAO
Вопрос
Я работаю с устаревшим продуктом vb6 и столкнулся с проблемой, из-за которой мне нужно получить часть имени файла полного пути из таблицы базы данных через DAO.У меня здесь нет доступа к функциям VBA, поэтому я специально ищу MS Access SQL.У меня нет возможности удалить какой-нибудь дополнительный код после запроса.Я НЕ МОГУ измените / реорганизуйте решение, не изменяя SQL.
Теперь у DAO нет никаких instrrev
или replace
функциональность, так что я довольно ограничен.
Есть какие-нибудь догадки?Заранее благодарю.
Решение
Предполагая , что вы не можете изменить фактическую базу данных ...
Единственное, что я могу придумать (и я ломаю голову над этим, извини, приятель), это использовать повторяющиеся вызовы 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
Это непристойно, но должно сработать
Другие советы
Вы должны иметь возможность использовать встроенные функции vba, такие как instr
, replace
, mid
, и т.д.
Существует режим "песочницы", который может блокировать их - смотрите это в разделе о том, как их разблокировать http://support.microsoft.com/kb/294698
Раньше я много занимался программированием на DAO, но это было 10-15 лет назад...
Можете ли вы изменить DAO для вызова Access QueryDef, а затем исправить это там?