Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Переменная в операторе ветвления. / 25 сообщений из 44, страница 1 из 2
22.11.2018, 19:33
    #39737121
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
В очень многих местах кода используется оператор ветвления с одним и тем же набором условий.
А именно
"Рога", "Справки", "Копыта", "Шапки"

Код: vbnet
1.
2.
 Select Case KOGO_VIBRATb
 Case "Рога", "Справки", "Копыта", "Шапки"



подскажите как можно записав эту строку в коде единожды в переменную или ещё во что,
что бы каждый раз не писать этот набор
Код: vbnet
1.
 "Рога", "Справки", "Копыта", "Шапки"


а подставлять короткую замену типа:
Код: vbnet
1.
2.
3.
4.
 
NABOR =  "Рога", "Справки", "Копыта", "Шапки"
Select Case KOGO_VIBRATb
 Case NABOR 



------------------------------------------------------------------------
Спасибо за ответ.
...
Рейтинг: 0 / 0
22.11.2018, 21:12
    #39737172
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
час58,

Где-то в начале:
Код: vbnet
1.
2.
3.
Dim NABOR As String
Dim KOGO_VIBRAT As String
NABOR = "Рога Справки Копыта Шапки"


Потом процедура:
Код: vbnet
1.
2.
3.
4.
5.
6.
Public CHAS58 Function (NABOR As String, VXOD As String) As Long
CHAS58 = 0
On error GoTo er1
CHAS58 = InStr (NABOR, VXOD)
er1:
End  Function


Как пользоваться:
Код: vbnet
1.
2.
3.
4.
5.
If CHAS58 (NABOR, KOGO_VIBRAT) = 0 Then
MsgBox "Не входит в набор"
Else
MsgBox "Входит"
End If


Ну как бы Case тут наверно не в кассу, наверно нужно If -ы использовать типа...
Код: vbnet
1.
2.
3.
NABOR =  "Рога Справки Копыта Шапки"
KOGO_VIBRAT = "Рога"
If CHAS58 (NABOR, KOGO_VIBRAT) > 0 Then ....


Единственное нужно проанализировать варианты типа не сработает ли слово "правки" из-за "Справки",
если такая вероятность есть, то функцию нужно переделывать (NABOR сделать не строку, а массив или временную табличку со значениями)

Ну или я тебя не понял....
...
Рейтинг: 0 / 0
22.11.2018, 21:26
    #39737183
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
vmagесли такая вероятность есть, то функцию нужно переделывать (NABOR сделать не строку, а массив или временную табличку со значениями)
а если ее нет, то тупо используй
Код: vbnet
1.
If InStr (NABOR, KOGO_VIBRAT) > 0 Then....
...
Рейтинг: 0 / 0
22.11.2018, 21:26
    #39737184
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
vmag,

Да "правки" и "Справки" это конечно - да.
Ты советуешь ИФами пользоваться...
Надо подумать.
Слишком до фига этих case, к тому же там ветвления не одного порядка...
потому хотел придумать изврат именно с case...
в любом случае. спасибо за совет.
Надо подумать.
...
Рейтинг: 0 / 0
22.11.2018, 21:31
    #39737187
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
vmag,

А CASE с Instr() - не дружат?
...
Рейтинг: 0 / 0
22.11.2018, 21:52
    #39737193
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
час58потому хотел придумать изврат именно с case...

Если набор будет не строка а строки или элементы массива строк, то можно так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
s1 = "Рога"
s2 = "Копыта"
'.....
Select Case KOGO_VIBRAT
Case s1, s2
MsgBox "Да"
Case Else
MsgBox "Нет"
End Select
...
Рейтинг: 0 / 0
22.11.2018, 21:53
    #39737195
Predeclared
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
    Dim dct As Object
    Dim KOGO_VIBRATb As String
    Dim Worlds(0 To 2)
    Dim i As Integer, j As Integer
    
    KOGO_VIBRATb = "Усы"
    Worlds(0) = Array("Рога", "Справки", "Копыта", "Шапки")
    Worlds(1) = Array("Усы", "Лапы", "Хвост")
    Worlds(2) = Array("Капуста", "Картошка", "Морковь")
    
    Set dct = CreateObject("Scripting.Dictionary")
    For j = LBound(Worlds) To UBound(Worlds)
        For i = LBound(Worlds(j)) To UBound(Worlds(j))
            dct.Add Worlds(j)(i), j
        Next i
    Next j
    
    If dct.Exists(KOGO_VIBRATb) Then
        Select Case dct.Item(KOGO_VIBRATb)
            Case Is = 0
            Debug.Print 0
        Case Is = 1
            Debug.Print 1
        Case Is = 2
            Debug.Print 2
        End Select
    Else
        Debug.Print "Нету такового!"
    End If
...
Рейтинг: 0 / 0
22.11.2018, 21:55
    #39737196
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
час58А CASE с Instr() - не дружат?

выход из Instr ноль или число, подумай...
...
Рейтинг: 0 / 0
22.11.2018, 21:57
    #39737197
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
Если набор будет не строка а строки или элементы массива строк, то можно так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
s1 = "Рога"
s2 = "Копыта"
'.....
Select Case KOGO_VIBRAT
Case s1, s2
MsgBox "Да"
Case Else
MsgBox "Нет"
End Select



Но тада это тоже самое

Код: vbnet
1.
2.
Select Case KOGO_VIBRAT
Case "Рога", "Справки", "Копыта", "Шапки"
...
Рейтинг: 0 / 0
22.11.2018, 22:00
    #39737198
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
vmagчас58А CASE с Instr() - не дружат?

выход из Instr ноль или число, подумай...
чёт башка совсем не варит.
Уже полночь близится.
Надо отложить это до завтра.
...
Рейтинг: 0 / 0
22.11.2018, 22:02
    #39737199
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
Predeclared,

чуть мозг не сгорел...
:)
...
Рейтинг: 0 / 0
22.11.2018, 22:04
    #39737200
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
Predeclared,

Scripting.Dictionary....
Вон как ?!
Высший пилотаж аж.
Надо будет завтра поюзать.
...
Рейтинг: 0 / 0
22.11.2018, 22:10
    #39737203
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
час58,
создал таблицу "tblSpravka", упрощенно
ID_Check Parent Naim1 0 Константы 2 1 Общий, Частный3 1 Рога, Справки, Копыта, Шапки
создал функцию типа
Код: vbnet
1.
2.
3.
4.
5.
6.
Public function FromSprav(Vid&) as string
Dim prov,  str$
prov=Dlookup("[Naim]","tblSpravka", "[ID_Check]=" & Vid)
If isnull(prov) then str=vbnullstring else str=Cstr(prov)
FromSprav=str
exit function


Вызывается так FromSprav(3)
Родитель для создания самообъединения и редактирования.
...
Рейтинг: 0 / 0
22.11.2018, 22:11
    #39737204
Predeclared
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
vmagPredeclared,

чуть мозг не сгорел...
:)
Надо регулярно периодически охлаждать.
Есть вкусный хладогент: Beluga
:)
...
Рейтинг: 0 / 0
22.11.2018, 22:18
    #39737205
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
alecko,

Спасибо.
А где тут ветвление CASE ?

мне бы
Код: vbnet
1.
2.
 Select Case KOGO_VIBRATb
 Case "Рога", "Справки", "Копыта", "Шапки"



вместо строки
Код: vbnet
1.
 "Рога", "Справки", "Копыта", "Шапки"



подставлять переменную(функцию), содержащую эту строку

типа
Код: vbnet
1.
2.
3.
NABOR =  "Рога", "Справки", "Копыта", "Шапки"
Select Case KOGO_VIBRATb
 Case NABOR 
...
Рейтинг: 0 / 0
22.11.2018, 22:27
    #39737208
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
Код: vbnet
1.
2.
3.
4.
5.
Select case KOGO_VIBRATb
case fromsprav(3)
case fromSprav(2)
...
end select
...
Рейтинг: 0 / 0
22.11.2018, 22:38
    #39737211
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
alecko,

Но тогда получается - таблица вроде как и не нужна?
Внутри функции
Код: vbnet
1.
 Public function FromSprav()


организовать своё ветвление на CASE
а в программе, просто обращаться к этой функции
Код: vbnet
1.
2.
 Select Case KOGO_VIBRATb
case fromsprav(3)



или я туплю?
...
Рейтинг: 0 / 0
22.11.2018, 22:52
    #39737217
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
можно и в функции в чистом виде хранить
но константы нужно заводить в таблицу (если "Шапки" у клиента станут "Фуражками", количество аргументов уменьшится/увеличится, в код лезть будет необязательно)
...
Рейтинг: 0 / 0
22.11.2018, 22:59
    #39737220
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
если аргументов таки немного то делают так
в шапке модуля где хранится функция записывают
Код: vbnet
1.
2.
3.
4.
5.
Enum V2Sprav
    GolUbors= 3
    Events = 2
End Enum
Public function FromSprav(vid as V2Sprav)


в этом случае при выборе аргумента будет помощь
...
Рейтинг: 0 / 0
22.11.2018, 23:52
    #39737237
zimkon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
час58vmag,

А CASE с Instr() - не дружат?
Подружить надо :)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function cl(virez As String)
vi = "один,два,три"
ggg = Mid(vi, IIf(InStr(1, vi, virez) > 0, InStr(1, vi, virez), 1), Len(virez))
Select Case virez
    Case ggg
        MsgBox "входит"
    Case Else
        MsgBox "не входит"
End Select
End Function
...
Рейтинг: 0 / 0
23.11.2018, 02:10
    #39737260
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
zimkon, привет!

Твой вариант тоже наткнется на такие грабли:
vmagЕдинственное нужно проанализировать варианты типа не сработает ли слово "правки" из-за "Справки",

не смотря на большее количество InStr чем в моем примере + Mid + IIF
:)

Выход проще, в моем примере с одним InStr (как и в твоем нужно только причесать данные):
1. Общий пакет (строку) оформлять например так:
"@Рога@Справки@Копыта@Шапки@"
2. Искать в ней например это
"@Рога@" найдется
"@правки@" не найдется
...
Рейтинг: 0 / 0
23.11.2018, 02:14
    #39737261
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
Короче,
Если причесать данные так как выше, то хватит одной строки
Код: plsql
1.
If InStr (NABOR, KOGO_VIBRAT) > 0 Then....
...
Рейтинг: 0 / 0
23.11.2018, 04:12
    #39737267
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
PredeclaredЕсть вкусный хладогент: BelugaХм... На вкус и цвет... Обычная водяра.
...
Рейтинг: 0 / 0
23.11.2018, 05:25
    #39737270
zimkon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
vmagzimkon, привет!

Твой вариант тоже наткнется на такие грабли:
vmagЕдинственное нужно проанализировать варианты типа не сработает ли слово "правки" из-за "Справки",

не смотря на большее количество InStr чем в моем примере + Mid + IIF
:)

Выход проще, в моем примере с одним InStr (как и в твоем нужно только причесать данные):
1. Общий пакет (строку) оформлять например так:
"@Рога@Справки@Копыта@Шапки@"
2. Искать в ней например это
"@Рога@" найдется
"@правки@" не найдется
Привет! Я подумал об этом через минуту после того, как нажал опубликовать. Лень было пост править.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 Public Function cl(virez As String)
vi = ",один,два,три,"
ggg = Mid(vi, IIf(InStr(1, vi, "," & virez & ",") > 0, InStr(1, vi, "," & virez & ",") - 1, 1), Len(virez))
Select Case virez
    Case ggg
        MsgBox "входит"
    Case Else
        MsgBox "не входит"
End Select
End Function 
...
Рейтинг: 0 / 0
23.11.2018, 05:43
    #39737274
zimkon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменная в операторе ветвления.
Очепятка ...не - 1, а + 1
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Переменная в операторе ветвления. / 25 сообщений из 44, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]