База данных доступа MS не позволяет сравнивать поля с типом данных memo в SQL-запросе. Есть ли способ сделать это в VBA?Как сравнить поля с типом данных «Memo» в vba?
Простое сравнение не работает, если размер памятки> 255 символов
База данных доступа MS не позволяет сравнивать поля с типом данных memo в SQL-запросе. Есть ли способ сделать это в VBA?Как сравнить поля с типом данных «Memo» в vba?
Простое сравнение не работает, если размер памятки> 255 символов
При использовании записей, вы можете сравнить их.
Таблица: Таблица1 (интермедиат, памятка, памятка)
id memo1 memo2 1 A B 2 D C
Сценарий:
Public Sub test()
Dim conn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim strSql As String
Set conn = CurrentProject.Connection
strSql = "select * from Table1"
rst.Open strSql, conn
rst.MoveFirst
While Not rst.EOF
Debug.Print rst("memo1") > rst("memo2")
rst.MoveNext
Wend
rst.Close
conn.Close
End Sub
И выход:
False
True
Это то, что вы имеете в виду?
UPDATE: она отлично работает для меня с полями длиной 4000 символов вверх, просто тестировал, а также функция длины отлично работает (VBA от доступа 2003)
Привет, питер
Это не работает, если размер memo> 255 символов –
просто сделал быстрый тест, и со мной работает fint (я тестировал оператор '=', сравнивая текст из wikipedia, True, когда он идентичен, False при изменении точки в конце страницы) Длина поля 4264, оператор длины также работал. – Peter
Я не уверен, почему вы разместили пример ADO, учитывая, что он находится в VBA в Access. Мне кажется, что DAO станет очевидным выбором для чего-то подобного. –
Вы, наверное, что-то конкретное в виду, но это простой случай хорошо работает без ошибок:
CREATE TABLE TestMemo (memo1 MEMO, memo2 MEMO)
;
INSERT INTO TestMemo (memo1, memo2) VALUES ('Blah', 'Blah')
;
INSERT INTO TestMemo (memo1, memo2) VALUES ('123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A', '123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789A123456789Z')
;
SELECT memo1, memo2
FROM TestMemo
WHERE memo1 = memo2
;
Я знаю, что это отсекает на 255 символов. Это ваша проблема? - Изменить: я тестировал его со значениями, превышающими 255 символов, и он не усекается.
255 символов - проблема –
Мои тесты показывают, что усечение не отображается с сравнением сравнений. Возможно, вы делаете что-то еще, чтобы вызвать усечение, например. Возможно, GROUP BY или UNION? – onedaywhen
Я думаю, что лучший способ - сохранить два поля Memo в 2 файла, а затем выполнить сравнение с файлами.
Можете ли вы предоставить запрос, который вы пытаетесь запустить? Является ли это связанной таблицей с SQL? Я сделал тест и не испытывал никаких проблем с сопоставлением значений memo. – JohnFx
Комментарий Onedayone ниже, где вам нужно начать. Если ваш запрос имеет GROUP BY или UNION (или в некоторых версиях Access, имеет ORDER BY), он обрезает заметки до 255 символов. –