Неудобная проблема с манипуляцией строками DAO

StackOverflow https://stackoverflow.com/questions/921281

  •  06-09-2019
  •  | 
  •  

Вопрос

Я работаю с устаревшим продуктом 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, а затем исправить это там?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top