VBA + Расщепление строки - PullRequest
       7

VBA + Расщепление строки

0 голосов
/ 27 апреля 2011

Я хочу разделить результат <= 1000 символов на массив размером 255, а затем обновить поле в БД с этим. </p>

Строки в VBA поддерживают максимум 255 символов, так как мне это сделать?

Я использую MS-Access 2007 в качестве своей БД. Тип поля для обновления - Memo, поэтому он может хранить более 255 символов, я проверил это.

Вот так выглядит мой запрос

Coalsce(""SELECT (parentdesc & '/' & keyword) FROM All_Keywords_Mapping where item_id=" & rs1![item_id] & """, ""\;"")

Coalsce - это функция, которую я написал, и я получаю такой результат:

"а / 123 \; Bcd / 123 \; Bcs / sdasdas \; Casad / sdads \; Двт / DASD adsad \; Двт / Нулевой \; Lo / SOMER-Tet \; "

теперь я обновляю этот результат для поля в другой таблице и типа поля Memo. Когда результат превышает 255 символов, я получаю ошибку запроса на обновление, поэтому я отлаживаю ее и теперь проверяю, обновляется ли длина результата

Моя функция коалси

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 & rs.Fields(0) & strDelim
            rs.MoveNext
        Loop

        strList = Mid(strList, Len(strDelim))
    Else

        strList = Join(NameList, strDelim)
    End If

    Coalsce = strList

End Function

Мой запрос

strSql = Select DISTINCT " & rs1![item_id] & " as item_id, FindReplace(Coalsce(""SELECT (desc & '/' & kw) FROM AKM where item_id=" & rs1![item_id] & """, ""\;""), ""/"", ""\/"") as res
Set rs2 = db.OpenRecordset(strSql, dbOpenDynaset)
DoCmd.RunSQL ("Update data_Query set res=" & rs2.Fields("res").Value)

1 Ответ

2 голосов
/ 29 апреля 2011

Есть две возможные причины для этого.Наиболее распространенным является то, что вы делаете это в операторе SQL с ORDER BY, и в этом случае поля memo усекаются до 255 символов.Однако это маловероятно, поскольку ваша функция возвращает строку длиной более 255 символов, так что это не должно быть проблемой.Действительно, один из способов обойти усечение 255 символов при наличии ORDER BY - это обернуть поле memo в функцию, подобную Left([MyMemoField], 4096).

Другая причина связана с конкатенацией полей memo.в этом случае MemoField1 & MemoField2 будет обрезано до 255 символов (и часто заканчивается тарабарщиной).Вы ничего не говорите о типах данных исходных полей, так что это маловероятно.

Итак, я в основном подозреваю вашу Coalsce() функцию.Мое первое предположение состоит в том, что вы определили тип возвращаемого значения:

  Public Function Coalsce()

..., который будет возвращать тип варианта, поскольку вы явно не указали тип возвращаемого значения.Итак, вы должны изменить это на это:

  Public Function Coalsce() As String

Однако, возможно, вы решили, что хотите вернуть Null, когда все поля имеют значение Null, и в этом случае вам придется объявитьтип возвращаемого значения в качестве Variant:

  Public Function Coalsce() As Variant

Мне кажется, что это плохая практика, поскольку с вариантами сложно иметь дело.

Это также может быть проблемой ByRef / ByVal.Вы действительно хотите, чтобы вещи обрабатывались ByVal в этом случае, поскольку именно ситуация ByRef приводит к проблеме конкатенации памятных полей (а ByVal избегает этого).

Все, что сказано, мне интересно, почему в миреВы не можете просто объединить поля в своем операторе SQL, вместо того, чтобы нуждаться в функции, чтобы сделать это.

Кроме того, возвращенные данные, которые вы храните в поле memo, вызывают у меня что-то вроде реакции WTF- похоже, что вы храните дубликаты данных в формате, который практически невозможно использовать.

Так что, в основном, без более подробной информации о том, что вы делаете, как вы это делаете и почемувы делаете это, никто не может ответить на ваш вопрос.

...