#string #vba #ms-access #split
#строка #vba #ms-access #разделение
Вопрос:
Я хочу разделить результат из <= 1000 символов на массив размером 255, а затем обновить поле в базе данных с этим.
Строки в VBA поддерживают максимум 255 символов, так как же мне это сделать?
Я использую MS-Access 2007 в качестве своей базы данных, тип поля для обновления — Memo, поэтому он может хранить более 255 символов, я проверил это.
Вот как выглядит мой запрос
Coalsce(""SELECT (parentdesc amp; '/' amp; keyword) FROM All_Keywords_Mapping where item_id=" amp; rs1![item_id] amp; """, "";"")
Coalsce — это функция, которую я написал, и с ее помощью я получаю результат, подобный:
«abc/123;Bcd/123;Bcs/sdasdas;Casad/sdads;Fea/dasd adsad;Fea/Zero; Lo/somer-tet;»
теперь я обновляю этот результат для поля в другой таблице и примечания к типу данных поля. Когда результат превышает 255 символов, я получаю сообщение об ошибке запроса на обновление, поэтому я отладил его и теперь, проверяя, является ли длина результата < 255, только обновляю, он работает отлично, но когда он превышает, я ничего не могу сделать.
Моя функция coalsce
Function Coalsce(strSql As String, strDelim As String, ParamArray NameList() As Variant)
Dim db As Database
Dim rs As DAO.Recordset
Dim strList As String
Set db = CurrentDb
If strSql <> "" Then
Set rs = db.OpenRecordset(strSql)
Do While Not rs.EOF
strList = strList amp; rs.Fields(0) amp; strDelim
rs.MoveNext
Loop
strList = Mid(strList, Len(strDelim))
Else
strList = Join(NameList, strDelim)
End If
Coalsce = strList
End Function
Мой запрос
strSql = Select DISTINCT " amp; rs1![item_id] amp; " as item_id, FindReplace(Coalsce(""SELECT (desc amp; '/' amp; kw) FROM AKM where item_id=" amp; rs1![item_id] amp; """, "";""), ""/"", ""/"") as res
Set rs2 = db.OpenRecordset(strSql, dbOpenDynaset)
DoCmd.RunSQL ("Update data_Query set res=" amp; rs2.Fields("res").Value)
Комментарии:
1. Количество строк в VBA не ограничено 255 символами.
2. Вы пытаетесь поместить строку в текстовое поле? Строковая переменная не должна быть проблемой, если вы не объявили ее как другой тип.
3. Пожалуйста, опубликуйте фрагмент кода, который выдает ошибку, вместе с любыми объявлениями (
Dim
statements). Как уже указывалось несколько раз,String
переменные не ограничены 255 символами.4. Это не «публикация вашего кода», поскольку вы не показали ни одного объявления переменных или кода для чего бы то ни было
Coalsce
(?Coalesce?). Как мы можем определить, что вы делаете неправильно, если вы не хотите показать нам, что вы делаете? (Вы также не показали инструкцию update, которую пытаетесь использовать.)5. @Ken — Я согласен с вашим комментарием и удалю свой ответ, если на него больше нигде не будет ссылок. Спасибо.
Ответ №1:
Для этого есть две возможные причины. Наиболее распространенным является то, что вы делаете это в инструкции SQL с ORDER BY , и в этом случае поля memo усекаются до 255 символов. Однако это маловероятно, поскольку ваша функция возвращает строку длиной более 255 символов, так что это не должно быть проблемой. Действительно, один из способов обойти усечение из 255 символов при заказе BY — это обернуть поле memo в функцию типа Left([MyMemoField], 4096)
.
Другая причина связана с конкатенацией полей memo, в этом случае MemoField1 amp; MemoField2
они будут усечены до 255 символов (и часто заканчиваются тарабарщиной). Вы ничего не говорите о типах данных исходных полей, поэтому это кажется маловероятным.
Итак, я в основном подозреваю вашу Coalsce()
функцию. Мое первое предположение заключается в том, что вы определили возвращаемый тип:
Public Function Coalsce()
…это вернет тип варианта, потому что вы явно не задали возвращаемый тип. Итак, вы должны изменить это на это:
Public Function Coalsce() As String
Однако, возможно, вы решили, что хотите вернуть значение Null, когда все поля равны Null, и в этом случае вам пришлось бы объявить возвращаемый тип как Variant:
Public Function Coalsce() As Variant
Мне это кажется плохой практикой, поскольку с вариантами сложно иметь дело.
Это также может быть проблемой с ByRef / ByVal. Вы действительно хотите, чтобы в таких случаях что-то обрабатывалось с помощью ByVal, поскольку именно ситуация с ByRef приводит к проблеме объединения полей memo (а ByVal этого избегает).
Все это говорит о том, что я задаюсь вопросом, почему в мире вы не можете просто объединить поля в вашей инструкции SQL, вместо того, чтобы использовать функцию для этого.
Кроме того, возвращаемые данные, которые вы сохраняете в поле memo, вызывают у меня нечто вроде дурацкой реакции — похоже, вы храните дублирующиеся данные, причем в формате, который практически невозможно использовать.
Итак, по сути, без дополнительной информации о том, что вы делаете, как вы это делаете и почему вы это делаете, никто не сможет по-настоящему ответить на ваш вопрос.