Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
1 / 1 / 2
Регистрация: 18.12.2013
Сообщений: 239

Оптимизировать код с условием на значение

23.01.2014, 13:28. Показов 719. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть таблица с результатами инвентаризаций.
На основании результата инвентаризации у каждого магазина за каждую инвентаризацию выставлена оценка (5, 3 или 2). Отличником является магазин, если у него по трем инвентаризациям оценка 5, при этом обязательно одна инвентаризация с участием ревизора ("САМ" самостоятельная. остальные все с ревизором).
Соответсвенно если 5 и 3 в любом сочетании Удовлетворительный , а Если есть хоть одна 2, то Двоечник.
Я напиал код, но пока писал чуть мозг не сломал и потом умом догадываюсь, что можно как то короче (массив или условие на несколько значений) сделать.
Код рабочий, но хотелось бы оптимизировать. Заодно может и массивы пойму.
Заранее спасибо.
Visual Basic
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
Private Sub Оценить_Click()
Dim kolinv
Dim s1, s2, s3 As String
Dim r1, r2, r3 As String
Dim ocenka As String
kolinv = DMax("n", "q")
If IsNull(kolinv) Then 'Проверка на наличие инвентаризаций
MsgBox "Нет инвентаризаций"
Exit Sub
End If
    If kolinv < 3 Then 'Для оценки магазина необходимо больше трех инвентаризаций
    MsgBox "Нельзя отнести ни к одной группе" _
    & vbCr & "Меньше трех инвентаризаций"
    Exit Sub
    End If
s1 = DLookup("[Оценка Розница]", "q", "n=" & (kolinv))
r1 = DLookup("[Присутствие ревизора]", "q", "n=" & (kolinv))
s2 = DLookup("[Оценка Розница]", "q", "n=" & (kolinv - 1))
r2 = DLookup("[Присутствие ревизора]", "q", "n=" & (kolinv - 1))
s3 = DLookup("[Оценка Розница]", "q", "n=" & (kolinv - 2))
r3 = DLookup("[Присутствие ревизора]", "q", "n=" & (kolinv - 2))
        If r1 = "САМ" Then 'Для оценки одна из трех ревизий должна быть с ревизором или ДГМ - не "САМ"
            If r2 = "САМ" Then
                If r3 = "САМ" Then
                MsgBox "По регламенту одна из трех ревизий" _
                & vbCr & "должна быть с участием ревизора или ДГМ" _
                & vbCr & "Последнии 3 ревизии были без ревизора"
                Exit Sub
                End If
            End If
        End If
Select Case s1
Case 5
    Select Case s2
    Case 5
        Select Case s3
        Case 5
        ocenka = "Отличник"
        Case 3
        ocenka = "Удовлетворительный"
        Case 2
        ocenka = "Двоечник"
        End Select
    Case 3
        Select Case s3
        Case 5
        ocenka = "Удовлетворительный"
        Case 3
        ocenka = "Удовлетворительный"
        Case 2
        ocenka = "Двоечник"
        End Select
    Case 2
    ocenka = "Двоечник"
    End Select
Case 3
    Select Case s2
    Case 5
        Select Case s3
        Case 5
        ocenka = "Удовлетворительно"
        Case 3
        ocenka = "Удовлетворительный"
        Case 2
        ocenka = "Двоечник"
        End Select
    Case 3
        Select Case s3
        Case 5
        ocenka = "Удовлетворительно"
        Case 3
        ocenka = "Удовлетворительный"
        Case 2
        ocenka = "Двоечник"
        End Select
    Case 2
    ocenka = "Двоечник"
    End Select
Case 2
ocenka = "Двоечник"
End Select
MsgBox (ocenka)
End Sub
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.01.2014, 13:28
Ответы с готовыми решениями:

Оптимизировать код
Как можно оптимизировать этот код, чтобы время выполнения было меньше? Во входном файле 'input.txt' первая строка - цифра, означающая...

Оптимизировать код
Написал программу, которая считывает данные из файла(вещественные числа), записывает данные в массив, находит минимальное, среднее и...

Оптимизировать код
Всем привет. Подскажите пожалуйста как можно изменить программный код, что бы программа не зависала при его выполнении. if events...

7
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
23.01.2014, 14:23
Один возможных вариантов это сделать таблицу с полями s1, s2, s3 и полем ocenka, где бы записывались все комбинации s1, s2, s3 и оценки по ним. А потом, вместо всех кейзов, просто считать необходимую строку из таблицы
Visual Basic
1
2
ocenka=Dlookup("ocenka", "ТаблицаОценок", "s1=" & s1 & " and s2=" & s2 & " and s3=" & s3)
msgbox ocenka
1
1 / 1 / 2
Регистрация: 18.12.2013
Сообщений: 239
23.01.2014, 15:15  [ТС]
А нельзя присвоить данные полученные рекордсетом в массив и перебрать его?

Добавлено через 9 минут
от 222 до 555 я правильно понимаю? А как можно таблицу заполнить формулой или функцией ? Есть такая? Что бы руками не прописывать все комбинации?

Добавлено через 4 минуты
Заполнил в Excele, оказалось очень просто. От 222 до 555 разнес по одной цифре в 3 столбца - это и есть варианты.
0
1 / 1 / 2
Регистрация: 18.12.2013
Сообщений: 239
23.01.2014, 15:18  [ТС]
Вот скрин
Миниатюры
Оптимизировать код с условием на значение  
0
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
23.01.2014, 19:31
Цитата Сообщение от mserg1972 Посмотреть сообщение
хотелось бы оптимизировать.
Если все правильно понял, то
Visual Basic
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
Private Sub Оценить_Click()
Dim sq$, kolinv&, kolsam&, ocenka&
  sq = "SELECT TOP 3 [Оценка Розница], [Присутствие ревизора] FROM q ORDER BY n DESC"
  With CurrentDb.OpenRecordset(sq)
    ocenka = 5
    Do Until .EOF
      kolinv = kolinv + 1
      kolsam = kolsam - (![Присутствие ревизора] = "САМ")
      If ![Оценка Розница] < ocenka Then ocenka = ![Оценка Розница]
      .MoveNext
    Loop
  End With
  If kolinv = 0 Then
    MsgBox "Нет инвентаризаций": Exit Sub
  ElseIf kolinv < 3 Then
    MsgBox "Нельзя отнести ни к одной группе" & vbCrLf & "Меньше трех инвентаризаций"
    Exit Sub
  ElseIf kolsam = 3 Then
    MsgBox "По регламенту одна из трех ревизий" _
            & vbCrLf & "должна быть с участием ревизора или ДГМ" _
            & vbCrLf & "Последнии 3 ревизии были без ревизора"
    Exit Sub
  Else
    MsgBox IIf(ocenka = 5, "Отличник", IIf(ocenka = 3, "Удовлетворительный", "Двоечник"))
  End If
End Sub
Не проверял, т.к. не на чем.

Добавлено через 3 часа 12 минут
Так будет более оптимально
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub Оценить_Click()
Dim sq$
  sq = "SELECT Count(*) As kolinv,  -Sum(r = 'САМ') As kolsam, Min(b) As ocenka " & _
       "FROM (SELECT TOP 3 [Оценка Розница] As b, [Присутствие ревизора] As r " & _
       "FROM q ORDER BY n DESC)"
  With CurrentDb.OpenRecordset(sq)
    If !kolinv = 0 Then
      MsgBox "Нет инвентаризаций"
    ElseIf !kolinv < 3 Then
      MsgBox "Нельзя отнести ни к одной группе" & vbCrLf & "Меньше трех инвентаризаций"
    ElseIf !kolsam = 3 Then
      MsgBox "По регламенту одна из трех ревизий" _
              & vbCrLf & "должна быть с участием ревизора или ДГМ" _
              & vbCrLf & "Последнии 3 ревизии были без ревизора"
    Else
      MsgBox IIf(!ocenka = 5, "Отличник", IIf(!ocenka = 3, "Удовлетворительный", "Двоечник"))
    End If
  End With
End Sub
2
1 / 1 / 2
Регистрация: 18.12.2013
Сообщений: 239
24.01.2014, 06:44  [ТС]
Спасибо за вариант, есть одна проблема она описана в теме
Как сделать проверку на наличие данных в результатах запроса "q" и только если они есть выполнить код , связанная с ошибкой при обращении к запросу q и передачей параметров в запрос,
Но вариант понятен буду изучать.
0
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
24.01.2014, 08:46
Цитата Сообщение от mserg1972 Посмотреть сообщение
Спасибо за вариант, есть одна проблема она описана в теме
Как сделать проверку на наличие данных в результатах запроса "q" и только если они есть выполнить код , связанная с ошибкой при обращении к запросу q и передачей параметров в запрос,
Но вариант понятен буду изучать.
Не вижу проблем. Кстати, Вам уже показывали вариант с динамически формируемой строкой запроса, но Вы почему-то пренебрегли им. А зря.
Попробуем еще раз. Замените в моем последнем варианте
Visual Basic
1
2
3
sq = "SELECT Count(*) As kolinv,  -Sum(r = 'САМ') As kolsam, Min(b) As ocenka " & _
       "FROM (SELECT TOP 3 [Оценка Розница] As b, [Присутствие ревизора] As r " & _
       "FROM q ORDER BY n DESC)"
на
Visual Basic
1
2
3
4
5
6
7
8
9
10
sq = "SELECT Count(*) As kolinv,  -Sum(r = 'САМ') As kolsam, Min(b) As ocenka " & _
       "FROM (SELECT TOP 3 [Оценка Розница] As b, [Присутствие ревизора] As r " & _
       "FROM Инвентаризации " & _
       "WHERE ЦФО = '" & Me!МагазинСписок & _
       "' AND [Товарооборот за межинвентаризационный период] Is Not Null " & _
       " And ([Дата текущей инвентаризации] Between #" & _
       Format(Me!Дата_начало, "mm\/dd\/yyyy") & _
       "# And #" & Format(Me!Дата_конец, "mm\/dd\/yyyy") & _
       "#) And [Решение по инвентаризации]='Принята' " & _
       "ORDER BY laf DESC)"
1
1 / 1 / 2
Регистрация: 18.12.2013
Сообщений: 239
24.01.2014, 10:05  [ТС]
Да, совершенно верно, теперь работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.01.2014, 10:05
Помогаю со студенческими работами здесь

Оптимизировать код
Всем привет, дайте совет, быть может можно как то оптимизироват? Суть того что $slugCheck содержит короткий путь страницы. Если вдруго...

Оптимизировать код
Проверка существования переменной $_POST. Если она есть, то задаем $comm; если $comm пустая или слишком большая, или не существует -...

Оптимизировать код
Помогите пожалуйста грамотно переделать код. Задача: на форме есть 2е кнопки повысить счетчик и понизить. Счетчик начинается с 0, текущее...

Оптимизировать код
Добрый день, форумчане! roundButton1.Enabled = false; roundButton1.BackColor = Color.LightGray; roundButton1.BackColor2 =...

Оптимизировать код
Помогите оптимизировать код Function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') End; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru