Форум программистов, компьютерный форум, киберфорум
Наши страницы
MS Access
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Арт_
0 / 0 / 0
Регистрация: 24.05.2017
Сообщений: 123
1

Конструкция If.Then.EndIf

18.05.2019, 11:39. Просмотров 978. Ответов 11
Метки нет (Все метки)

Приветствую дорогие друзья! Это снова Я

Пытаюсь настроить механизм одновременной фильтрации и сортировки посредством условий if, получается пока очень сомнительно.
Даже не знаю, либо логику не понимаю конструкции (скорее всего), либо со свойствами сортировки намудрил.
Уже полдня сижу, вкурить не могу, как мог кодом манипулировал, поэтому сразу выкладываю БД.
Знаю, что наверно будете писать, что даже не пытался думать, извините, только начинаю программировать.
Главная форма ALL, там две кнопки, взаимодействующие с сабформой.

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
Private Sub filterSwitches_AfterUpdate()
 
    'фильтрация записей по текущей дате
 
    If sortingSwitches And filterSwitches Then
        Forms![ALL]![PF_DOKUMENT].Form.OrderBy = "nomer ASC"
        Forms![ALL]![PF_DOKUMENT].Form.OrderByOn = True
        Forms![ALL].Controls![PF_DOKUMENT].Form.RecordSource = "SELECT * FROM DOKUMENT WHERE  DOKUMENT.DATA= " & Format(Date, "\#mm\/dd\/yyyy\#")
        
        
    ElseIf filterSwitches Then
        Forms![ALL].Controls![PF_DOKUMENT].Form.RecordSource = "SELECT * FROM DOKUMENT WHERE  DOKUMENT.DATA= " & Format(Date, "\#mm\/dd\/yyyy\#")
        
    ElseIf filterSwitches = False Then
        Forms![ALL].Controls![PF_DOKUMENT].Form.RecordSource = "SELECT * FROM DOKUMENT"
 
  End If
 
End Sub
 
Private Sub sortingSwitches_AfterUpdate()
 
    'сортировка записей 
    
    If sortingSwitches And filterSwitches Then
        Forms![ALL]![PF_DOKUMENT].Form.OrderBy = "nomer ASC"
        Forms![ALL]![PF_DOKUMENT].Form.OrderByOn = True
        Forms![ALL].Controls![PF_DOKUMENT].Form.RecordSource = "SELECT * FROM DOKUMENT WHERE  DOKUMENT.DATA= " & Format(Date, "\#mm\/dd\/yyyy\#")
    
    
    ElseIf sortingSwitches Then '(1) - включен, (2) - отключен
        Forms![ALL]![PF_DOKUMENT].Form.OrderBy = "nomer ASC"
        Forms![ALL]![PF_DOKUMENT].Form.OrderByOn = True
 
    ElseIf sortingSwitches = False Then
        Forms![ALL]![PF_DOKUMENT].Form.OrderBy = "nomer DESC"
        Forms![ALL]![PF_DOKUMENT].Form.OrderByOn = True
  
    End If
 
End Sub
Еще на сабформе прописал в событии текущей записи значения кнопок.

Заранее, спасибо.
0
Вложения
Тип файла: rar base.rar (32.4 Кб, 7 просмотров)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2019, 11:39
Ответы с готовыми решениями:

Конструкция UPDATE
Есть следующий запрос, который обновляет ячейку в таблице если там стоит "лабораторные",...

Существует ли конструкция over в access
Подскажите есть ли Over в Access, необходимо произвоти суммирование нескольких полей, но так, чтобы...

Что делает данная конструкция
конструкция CurrentDb.Execute ("Create UNIQUE index 'Код товара' on Товар (Код товара);"...

Как в VB записывается конструкция isnull(a,b)
Ну в принципе вопрос понятен? если нет поясняю! В транзакт-sql есть такая функция, isnull(a,b) т.е...

If.ENDIF
в самом конце программа выдает ошибку с End if. подскажите, пожалуйста, в чем здесь проблема?...

11
Capi
Модератор
Эксперт MS Access
2195 / 1143 / 263
Регистрация: 12.06.2016
Сообщений: 2,711
18.05.2019, 13:24 2
Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub filterSwitches_AfterUpdate()
 Forms![ALL].PF_DOKUMENT.Form.RecordSource = "SELECT * FROM DOKUMENT "  & _
                                             IIf(filterSwitches, "WHERE DATA=Date()", "")
 Call sortingSwitches_AfterUpdate
End Sub
 
Private Sub sortingSwitches_AfterUpdate()
 Forms![ALL]!PF_DOKUMENT.Form.OrderBy = "nomer " & IIf(sortingSwitches, "ASC", "DESC")
 Forms![ALL]!PF_DOKUMENT.Form.OrderByOn = True
End Sub
[ALL] - не очень удачное название, это служебное слово.

Базу не смотрела.
1
shanemac51
Модератор
Эксперт MS Access
8653 / 3343 / 518
Регистрация: 07.08.2010
Сообщений: 9,309
Записей в блоге: 2
18.05.2019, 13:31 3
и конечно вставьте во все модули форм строку Option Explicit
и разберитесь с именами переменных или флажков, похожих на кнопки
1
Арт_
0 / 0 / 0
Регистрация: 24.05.2017
Сообщений: 123
18.05.2019, 14:27  [ТС] 4
Цитата Сообщение от Capi Посмотреть сообщение
[ALL] - не очень удачное название, это служебное слово.
учту
Цитата Сообщение от shanemac51 Посмотреть сообщение
и конечно вставьте во все модули форм строку Option Explicit
думал Option Compare Database достаточно, ошибся

Можно еще вопросы:

1.зачем делать вызов процедуры
Цитата Сообщение от Capi Посмотреть сообщение
Call sortingSwitches_AfterUpdate
Разве значение sortingSwitches меняется?
2. Вставил
Цитата Сообщение от Capi Посмотреть сообщение
Forms![ALL].PF_DOKUMENT.Form.RecordSource = "SELECT * FROM DOKUMENT " *& _
* * * * * * * * * * * * * * * * * * * * * * *IIf(filterSwitches, "WHERE DATA=Date()", "")
Forms![ALL]!PF_DOKUMENT.Form.OrderBy = "nomer " & IIf(sortingSwitches, "ASC", "DESC")
*Forms![ALL]!PF_DOKUMENT.Form.OrderByOn = True

в событие текущая запись главной формы все заработало как надо и без Call?
3. Почему строки кода из п.2 надо было вставить в глав. форму, а не подчиненную?
0
18.05.2019, 14:27
Capi
Модератор
Эксперт MS Access
2195 / 1143 / 263
Регистрация: 12.06.2016
Сообщений: 2,711
18.05.2019, 15:30 5
Арт_,

Для нормального цитирования кода есть кнопка "Выделить код" справа над кодом.

Цитата Сообщение от Арт_ Посмотреть сообщение
думал Option Compare Database достаточно, ошибся
Установите курсор на Option, нажмите F1 и прочтите в справке, что все это значит.
1
Eugene-LS
4013 / 2341 / 452
Регистрация: 05.10.2016
Сообщений: 6,501
18.05.2019, 17:10 6
Лучший ответ Сообщение было отмечено Арт_ как решение

Решение

Арт_, если я правильно понял вашу задачку ...
Все хотелки решаются одной, не длинной процедурой в главной форме
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
Private Sub FilterAndSort()
'фильтрация и сортировка по контролам
'--------------------------------------------------------------------------
Dim sFilter$, sSort$
'--------------------------------------------------------------------------
On Error GoTo FilterAndSort_Err
 
 
'Не знаю зачем это но ...
    Me![PF_DOKUMENT].Form.AllowAdditions = False
    Me![PF_DOKUMENT].Form.AllowDeletions = False
    Me![PF_DOKUMENT].Form.AllowEdits = False
 
 
'фильтрация записей по текущей дате
    If Me!filterSwitches = True Then
        sFilter = "DATA = " & Format(Date, "\#mm\/dd\/yyyy\#")
    
        Me![PF_DOKUMENT].Form.Filter = sFilter
        Me![PF_DOKUMENT].Form.FilterOn = True
    Else
        Me![PF_DOKUMENT].Form.Filter = sFilter
        Me![PF_DOKUMENT].Form.FilterOn = False
    End If
 
'сортировка
    If Me!sortingSwitches = False Then '(1) - включен, (2) - отключен
        sSort = "nomer DESC"
    Else
        sSort = "nomer ASC"
    End If
   
    Me![PF_DOKUMENT].Form.OrderBy = sSort
    Me![PF_DOKUMENT].Form.OrderByOn = True
 
 
FilterAndSort_End:
    On Error Resume Next
    Err.Clear
    Exit Sub
 
FilterAndSort_Err:
    MsgBox "Error: " & Err.Number & vbCrLf & Err.Description & vbCrLf & _
    "in Sub: FilterAndSort in module: Form_ALL", vbCritical, "Error in Application"
    Err.Clear
    Resume FilterAndSort_End
 
End Sub
1
Вложения
Тип файла: rar base_v02.rar (39.0 Кб, 2 просмотров)
Арт_
0 / 0 / 0
Регистрация: 24.05.2017
Сообщений: 123
Вчера, 02:17  [ТС] 7
Eugene-LS, все работает
зачем $ при объявлении переменной, для определения как variant?
Если не сложно кто может объяснить, где я ошибся, знаю, что код избыточный.
0
Eugene-LS
4013 / 2341 / 452
Регистрация: 05.10.2016
Сообщений: 6,501
Вчера, 06:49 8
Цитата Сообщение от Арт_ Посмотреть сообщение
зачем $ при объявлении переменной, для определения как variant?
$ - Означает что переменная будет объявлена как String.

кто может объяснить, где я ошибся
Думаю, это попытка применения .RecordSource вместо .Filter.
0
Арт_
0 / 0 / 0
Регистрация: 24.05.2017
Сообщений: 123
Вчера, 07:36  [ТС] 9
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Думаю, это попытка применения .RecordSource вместо .Filter.
Впервые пишу на vba да и вообще,
как только не пробовал.
Еще раз спасибо!
0
Capi
Модератор
Эксперт MS Access
2195 / 1143 / 263
Регистрация: 12.06.2016
Сообщений: 2,711
Вчера, 09:48 10
Цитата Сообщение от Eugene-LS
Цитата Сообщение от Арт_
кто может объяснить, где я ошибся
Думаю, это попытка применения .RecordSource вместо .Filter.
Это не ошибка.
Обновление RecordSource часто бывает лучше фильтра.
0
Арт_
0 / 0 / 0
Регистрация: 24.05.2017
Сообщений: 123
Сегодня, 00:26  [ТС] 11
Цитата Сообщение от Capi Посмотреть сообщение
Это не ошибка.
Обновление RecordSource часто бывает лучше фильтра.
Не ошибка, но не работает - парадокс.
0
Capi
Модератор
Эксперт MS Access
2195 / 1143 / 263
Регистрация: 12.06.2016
Сообщений: 2,711
Сегодня, 01:43 12
Цитата Сообщение от Арт_ Посмотреть сообщение
Не ошибка, но не работает - парадокс.
У кого как - парадокс.
0
Сегодня, 01:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
Сегодня, 01:43

Ifndef-define-endif
Qt Creator по умолчанию создаёт хэдер любого класса с подобной шапкой: #ifndef MYCLASS_H //...

Синтаксическая ошибка EndIf
Добрый день! Использую wordpress для интернет-магазина, выяснилось, что есть конфликт между 2-мя...

Оптимизировать конструкцию IF-ELSE-ENDIF
Уважаемые форумчане, возможно вопрос глупый, но я всё равно его задам. Совсем не радует мой глаз...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru