Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как преобразовать текст в выражение / 14 сообщений из 14, страница 1 из 1
24.03.2016, 13:45
    #39199680
l-evgene
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать текст в выражение
Добрый день.
Есть функция:
Код: 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.
Public Function fncПроверка(strВидПроверки As String) As Boolean
    Select Case fncКодПроверки(strВидПроверки)
        Case 1                                                                  'Некорректный символ
            If InStr(1, strКлавиатура, strНекорректныйСимвол) <> 0 Then
                fncПроверка = True
            End If
        Case 4                                                                  'Серийные уже есть
            strЗапрос = "SELECT u.СерийныйНомер FROM u WHERE u.КодТовара =" _
                & frmФорма!ПолеАртикул                                        
            Set rst = dbТекущая.OpenRecordset(strЗапрос, dbOpenDynaset)
                If rst.EOF = False Then
                    fncПроверка = True
                    ВставитьКоммент 7
                End If
        Case 10                                                              
                If strКлавиатура = "00001" Then                              
                    fncПроверка = True
                    ВставитьКоммент 14
                End If
        Case 11                                                                 'Разная длина штрих-кодов
                If Len(frmФорма!ПолеFrom) <> Len(frmФорма!ПолеTo) Then
                    fncПроверка = True
                    ВставитьКоммент 15
                End If


Функция выполняет одну из проверок и возвращает ИСТИНА/ЛОЖЬ. Но вариантов проверки предполагается несколько сотен, в итоге текст самой функции станет не читаемым.
ХОЧЕТСЯ, чтобы функция получила условие проверки в виде текстовой строки, поняла, что это логическое выражение и выполнила его.Что-то вроде этого:
Код: vbnet
1.
2.
3.
4.
5.
                a="Len(frmФорма!ПолеFrom) <> Len(frmФорма!ПолеTo)"
If  Then
                    fncПроверка = True
                    ВставитьКоммент 15
                End If
...
Рейтинг: 0 / 0
24.03.2016, 13:52
    #39199695
l-evgene
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать текст в выражение
Прошу прощение, отправил не доделанный текст
Есть функция:
Код: 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.
Public Function fncПроверка(strВидПроверки As String) As Boolean
    Select Case fncКодПроверки(strВидПроверки)
        Case 1                                                                  'Некорректный символ
            If InStr(1, strКлавиатура, strНекорректныйСимвол) <> 0 Then
                fncПроверка = True
            End If
        Case 4                                                                  'Серийные уже есть
            strЗапрос = "SELECT u.СерийныйНомер FROM u WHERE u.КодТовара =" _
                & frmФорма!ПолеАртикул                                        
            Set rst = dbТекущая.OpenRecordset(strЗапрос, dbOpenDynaset)
                If rst.EOF = False Then
                    fncПроверка = True
                    ВставитьКоммент 7
                End If
        Case 10                                                              
                If strКлавиатура = "00001" Then                              
                    fncПроверка = True
                    ВставитьКоммент 14
                End If
        Case 11                                                                 'Разная длина штрих-кодов
                If Len(frmФорма!ПолеFrom) <> Len(frmФорма!ПолеTo) Then
                    fncПроверка = True
                    ВставитьКоммент 15
                End If


Функция выполняет одну из проверок и возвращает ИСТИНА/ЛОЖЬ. Но вариантов проверки предполагается несколько сотен, в итоге текст самой функции станет не читаемым.
ХОЧЕТСЯ, чтобы функция получила условие проверки в виде текстовой строки, поняла, что это логическое выражение и выполнила его.Что-то вроде этого:
Код: vbnet
1.
2.
3.
4.
5.
                a="Len(frmФорма!ПолеFrom) <> Len(frmФорма!ПолеTo)"
               If какаяТоФункция(а) Then
                    fncПроверка = True
                    ВставитьКоммент 15
                End If


Это возможно?
...
Рейтинг: 0 / 0
24.03.2016, 14:10
    #39199734
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать текст в выражение
Eval попробуйте. Она, правда, не все выражения поддерживает.
...
Рейтинг: 0 / 0
24.03.2016, 14:16
    #39199745
Как преобразовать текст в выражение
l-evgeneХОЧЕТСЯ, чтобы функция получила условие проверки в виде текстовой строки, поняла, что это логическое выражение и выполнила его.Что-то вроде этого:
Код: vbnet
1.
2.
3.
4.
5.
                a="Len(frmФорма!ПолеFrom) <> Len(frmФорма!ПолеTo)"
               If какаяТоФункция(а) Then
                    fncПроверка = True
                    ВставитьКоммент 15
                End If


Это возможно? В Аксе есть функция EVal. Как раз она и возвращает результат выражения в строке. Например:
Код: vbnet
1.
2.
3.
4.
?EVal("Len(""ABC"") <> Len(""ABCD"")")
-1 
?EVal("Len(""ABC"") <> Len(""ABC"")")
 0 

Функция также понимает полные ссылки на поля открытой формы. Т.е. в вашем случае вместо frmФорма!ПолеFrom нужно Forms![Имя формы!ПолеFrom
...
Рейтинг: 0 / 0
24.03.2016, 14:18
    #39199749
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать текст в выражение
l-evgeneвариантов проверки предполагается несколько сотен, в итоге текст самой функции станет не читаемым.
Выносите по мере отладки сами варианты проверки в функции. Какие проблемы? А в этой функции останется только объединяющий скелет.
...
Рейтинг: 0 / 0
24.03.2016, 16:58
    #39199954
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать текст в выражение
l-evgene,

Если не секрет - а что это за штрих-код (тип) куда нужно засунуть код товара, его серийный номер, артикул, может ещё чего, ну и естественно - зачем? Может енто всё лишнее, типа масло-масляное... (настораживает несколько раз по 100 проверок)
...
Рейтинг: 0 / 0
24.03.2016, 18:00
    #39200015
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать текст в выражение
l-evgene,

где объявлены
--переменные
strКлавиатура
strНекорректныйСимвол
rst

--функция
ВставитьКоммент 7

как вызывается fncПроверка
...
Рейтинг: 0 / 0
25.03.2016, 11:13
    #39200419
l-evgene
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать текст в выражение
ПЕНСИОНЕРКАl-evgene,

где объявлены
--переменные
strКлавиатура
strНекорректныйСимвол
rst

--функция
ВставитьКоммент 7

как вызывается fncПроверка
Все объявлено на уровне модуля. rst формируется перед каждой проверкой (если нужно) и объявлен на уровне процедуры
Код: 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.
Option Compare Database
Option Explicit

Public frmФорма As Form, strФорма As String
Public strКлавиатура As String, longKeyAscii As Long
Public Const strНекорректныйСимвол = "&@^*"

Public Function fncПроверка(strВидПроверки As String) As Boolean
Dim strЗапрос As String
Dim rst As Recordset

...................
        Case 4                                                                  'Серийные уже есть
            strЗапрос = "SELECT u.СерийныйНомер FROM u WHERE u.КодТовараНаОтгрузку=" _
                & frmФорма!ПолеАртикул                                          
            Set rst = dbТекущая.OpenRecordset(strЗапрос, dbOpenDynaset)
                If rst.EOF = False Then
                    fncПроверка = True
                    ВставитьКоммент 7
                End If
................
End Function

.................

Public Sub ВставитьКоммент(longКодКоммента As Long)
.................
End Sub



Вызов функции:
Код: vbnet
1.
2.
3.
4.
5.
    If fncПроверка("Некорректный символ") Then                             'если в штрих-коде есть НекорректныйСимвол
    ElseIf fncПроверка("Заявка не сохранена") Then                        'если есть не сохраненная заявка, работать можно только с ней
    ...................
     ElseIf fncПроверка("Перевести заявку в редактирование") Then        'если заявка находится в сохраненных, ее надо перевести в режим редактирования
.............



Задачу удалось решить при помощи eval, спасибо MrShin, Анатолий ( Киев ).
Правда, получилось не очень красиво. Если есть варианты, буду признателен.
...
Рейтинг: 0 / 0
25.03.2016, 12:31
    #39200487
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать текст в выражение
l-evgene,

чтобы найти один из нескольких символов
Код: vbnet
1.
Public Const strНекорректныйСимвол = "&@^*"


надо пускать для каждого символа
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
dim j1,j1k
j1k=len(strНекорректныйСимвол)
j1=0
do while j1<j1k
j1=j1+1
If InStr(1, strКлавиатура, mid(strНекорректныйСимвол,j1,1) > 0 Then
msgbox "НекорректныйСимвол"
exit do
endif
loop
...
Рейтинг: 0 / 0
25.03.2016, 13:15
    #39200531
Lockpickup
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать текст в выражение
Для решения таких задач специально придуманы регулярные выражения. См. объект RegExp
...
Рейтинг: 0 / 0
25.03.2016, 13:40
    #39200564
l-evgene
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать текст в выражение
ПЕНСИОНЕРКА,
Здесь другая задача. Переменная strКлавиатура содержит текст, считанный сканером штрих-кода. Сканер последовательно считывает символы штрих-кода и эмулирует нажатие клавиш. Символы последовательно добавляются в переменную. Если попадается недопустимый символ, вместо него добавляется дикий набор, которого в жизни быть не может. По окончании ввода, прога анализирует полученный текст и при наличии недопустимого символа не записывает его в таблицу.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Private Sub ПолеФокус_KeyPress(KeyAscii As Integer)                             'обработка нажатия клавиш
    If KeyAscii < 127 Then                                                      'Разбираем только символы от 0 до 127
        strКлавиатура = strКлавиатура & Chr(KeyAscii)
    Else
        strКлавиатура = strКлавиатура & strНекорректныйСимвол                   'вместо остальных добавляем НекорректныйСимвол
    End If
End Sub
...
Рейтинг: 0 / 0
25.03.2016, 13:41
    #39200565
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать текст в выражение
ПЕНСИОНЕРКАl-evgene,

чтобы найти один из нескольких символов
Код: vbnet
1.
Public Const strНекорректныйСимвол = "&@^*"


надо пускать для каждого символа
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
dim j1,j1k
j1k=len(strНекорректныйСимвол)
j1=0
do while j1<j1k
j1=j1+1
If InStr(1, strКлавиатура, mid(strНекорректныйСимвол,j1,1) > 0 Then
msgbox "НекорректныйСимвол"
exit do
endif
loop

В данном случае было бы достаточно
Код: sql
1.
If strКлавиатура Like "*" & [&@^*] & "*" Then
...
Рейтинг: 0 / 0
25.03.2016, 13:50
    #39200578
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать текст в выражение
Прошу прощения, еще попроще
Код: vbnet
1.
If strКлавиатура Like "*[&@^*]*" Then   

Хотя, если нужно использовать константу strНекорректныйСимвол, то так
Код: vbnet
1.
If strКлавиатура Like "*" strНекорректныйСимвол & "*" Then   
...
Рейтинг: 0 / 0
25.03.2016, 13:53
    #39200587
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как преобразовать текст в выражение
__MichelleПрошу прощения, еще попроще
Код: vbnet
1.
If strКлавиатура Like "*[&@^*]*" Then   

Хотя, если нужно использовать константу strНекорректныйСимвол, то так
Код: vbnet
1.
If strКлавиатура Like "*[" strНекорректныйСимвол & "]*" Then   

Поправила.)))
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как преобразовать текст в выражение / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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