Сравнение двух Variant

  • Автор темы IsAvailable
  • Дата начала
I

IsAvailable

#1
Есть две переменные типа Variant: v1, v2
В них записываются значения, полей типа DialogList, которые иногда просто строки, иногда - список строк. Необходимо производить сравнение на равенство этих элементов. Если оба элемента однострочные, то всё ок, а когда один элемент строка, а другой - список, то вываливается ошибка Type mismatch : (
И что-то никак не соображу, как в этой ситуации лучше обойти эту ошибку.
 

LuMee

Well-known member
02.05.2006
477
0
#2
Думаю, для начала следует определиться, каким образом следует сравнивать, скажем, строку со списком. Сравнивать ее с каждым элементом, а потом выдумывать "сводный" результат? Или собрать список в одну строку с определенным разделителем (например Tab), и уже сравнивать две строки?
 
I

IsAvailable

#4
Сравнивать нужно таким образом: одно и то же это или нет : )

"а1":"с1" и "а1" ==> false
"а1" и "а1" ==> true
"а1" и "а1":"с1" ==> false
"а1":"с1" и "а1":"с1" ==> true
"с1":"а1" и "а1":"с1" ==> false

Вроде, все варианты разобрал : )
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#5
Можно так:
f = Evaluate({поле1 = поле2}, doc)
if f(0) = "1" then ...
Или так: if join(doc.поле1) = join(doc.поле2) then ...
 
I

IsAvailable

#6
Для: Morpheus
Ага. Прочитал. Спасибо за линк. И хэлп за одно по второму разу перечитал те главы )
В принципе мне нужно эквивалентное сравнение.
По идее подходить должно обычное "=", но в этом случае вываливается Type mismatch, когда один Variant список, а другой - строка
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#7
<!--QuoteBegin-Medevic+13:03:2007, 11:00 -->
<span class="vbquote">(Medevic @ 13:03:2007, 11:00 )</span><!--QuoteEBegin-->f = Evaluate({поле1 = поле2}, doc)
[snapback]58869" rel="nofollow" target="_blank[/snapback]​
[/quote]
Хотя это не совсем верно. :)
Нужно еще сравнить количество элементов в списке.
 
I

IsAvailable

#8
Для: Medevic
Значения в переменные типа Variant не непосредственно из дока берутся, а через вьюху с помощью AllEntries и потом через Columnvalues(x).
Соответственно Evaluate и не пробовал, а Join выдает всё тот же Type mismatch :-о
 
30.05.2006
1 345
11
#9
Для: Medevic
Значения в переменные типа Variant не непосредственно из дока берутся, а через вьюху с помощью AllEntries и потом через Columnvalues(x).
Соответственно Evaluate и не пробовал, а Join выдает всё тот же Type mismatch :-о
Да, Evaluate - это для полей, а не переменных.
Для переменных в 6-ке появились замечТательные функции Implode/Join и Split - аналоги "собачьих" @Implode и @Explode.

Так что превращайте массивы в строки и сравнивайте их! Impode декларирует всеядность к типам...
 
I

IsAvailable

#10
Сделал так:

Код:
If Isarray(v1) Then s1$ = Implode(v1,",") Else s1$ = Cstr(v)
If Isarray(v2) Then s2$ = Implode(v2,",") Else s2$ = Cstr(v2)
И потом уже сравниваю s1$ и s2$

Если без проверки на array делать Implode, то ругается на тип уже при обычных строках...
Ну а так работает, вроде : )
 

Shandrik

Lotus team
30.12.2010
268
12
#11
Только учтите, что использование Implode подразумевает, что вам при сравнении важен порядок.

Т.е. если v1="1":"2", а v2="2":"1", но после Implode они будут НЕ равны.
 
06.12.2011
468
134
#12
ОФФТОП
Я шизею от постановки вопроса и : "Есть две переменные типа Variant: v1, v2"
Сравнивать Variant ... это круто.
Мой наглый совет, вот откуда вы этот вариант/значения получали, вот там сравнивайте
 

anna

Lotus team
03.06.2014
400
7
#13
ОФФТОП
Я шизею от постановки вопроса и : "Есть две переменные типа Variant: v1, v2"
Сравнивать Variant ... это круто.
Мой наглый совет, вот откуда вы этот вариант/значения получали, вот там сравнивайте
В общем-то, конечно, но не всегда годится: таких мест, откуда вызывается функция, слишком много, и не править же везде, если нужно один какой-то вариант параметра обработать иначе.
 

savl

Lotus team
28.10.2011
2 131
102
#14
Насколько я помню, разных типов в Variant массиве быть не может, там будет единый, но variant (с максимально подходящим типом).
Если преобразовать оба параметра в массив, то задача сведется к сравнению массивов...