Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft Access
Войти
Регистрация
Восстановить пароль
 
Daidred
2 / 2 / 0
Регистрация: 25.03.2016
Сообщений: 33
1

Нужно сделать цикл, вычисляющий, есть ли значения в форме, если нет, выполнить новое условие

06.04.2016, 10:21. Просмотров 239. Ответов 3

Всем привет! В VBA недавно начал работать, и сейчас немного запнулся на одном месте. Бьюсь об стенку, аж кирпич болит. )

Есть цикл, вычисляющий значения в полях, и на основе значений, присваивает SQL запрос к существующему запросу с последующим открытием формы на основе того-же запроса. Вот сам цикл:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Sub Кнопка58_Click()
If IsNull(Код_сотрудник) = True Then
If Код_день_месяца = Да Then
s = s & "SELECT Задачи.Код_задача, Задачи.Задача, Задачи.Текст_задачи, Задачи.Комментарий_исполнителя, Задачи.Срок_задачи, Задачи.Дата_завершения, Задачи.Код_приоритет, Задачи.Код_программа, Задачи.Код_статус_работ, Задачи.Код_тэг, Задачи.Код_день_месяца, Задачи.Код_день_недели, Задачи.День_месяца, Задачи.День_недели, Приказы.Код_сотрудник FROM Задачи INNER JOIN Приказы ON Задачи.Код_задача = Приказы.Код_задача WHERE (((Задачи.Срок_задачи) Between [формы]![Главная_форма_управления]![Поле0] And [Формы]![Главная_форма_управления]![Поле2]) AND ((Задачи.Код_статус_работ)<>5  And (Задачи.Код_статус_работ)<>3));"
CurrentDb.Querydefs("Просмотр_задач").SQL = s
Else
s = s & "SELECT Задачи.Код_задача, Задачи.Задача, Задачи.Текст_задачи, Задачи.Комментарий_исполнителя, Задачи.Срок_задачи, Задачи.Дата_завершения, Задачи.Код_приоритет, Задачи.Код_программа, Задачи.Код_статус_работ, Задачи.Код_тэг, Задачи.Код_день_месяца, Задачи.Код_день_недели, Задачи.День_месяца, Задачи.День_недели, Приказы.Код_сотрудник FROM Задачи INNER JOIN Приказы ON Задачи.Код_задача = Приказы.Код_задача WHERE (((Задачи.Срок_задачи) Between [формы]![Главная_форма_управления]![Поле0] And [Формы]![Главная_форма_управления]![Поле2] Or (Задачи.Срок_задачи) Is Null) AND ((Задачи.Код_статус_работ)<>5  And (Задачи.Код_статус_работ)<>3) AND ((Задачи.День_месяца)=Day(Date()) Or (Задачи.День_месяца) Is Null) AND ((Задачи.День_недели)=[Формы]![Главная_форма_управления]![Поле52] Or (Задачи.День_недели) Is Null));"
CurrentDb.Querydefs("Просмотр_задач").SQL = s
End If
Else
If Код_день_месяца = Да Then
s = s & "SELECT Задачи.Код_задача, Задачи.Задача, Задачи.Текст_задачи, Задачи.Комментарий_исполнителя, Задачи.Срок_задачи, Задачи.Дата_завершения, Задачи.Код_приоритет, Задачи.Код_программа, Задачи.Код_статус_работ, Задачи.Код_тэг, Задачи.Код_день_месяца, Задачи.Код_день_недели, Задачи.День_месяца, Задачи.День_недели, Приказы.Код_сотрудник FROM Задачи INNER JOIN Приказы ON Задачи.Код_задача = Приказы.Код_задача WHERE (((Задачи.Срок_задачи) Between [формы]![Главная_форма_управления]![Поле0] And [Формы]![Главная_форма_управления]![Поле2]) AND ((Задачи.Код_статус_работ)<>5  And (Задачи.Код_статус_работ)<>3) AND ((Приказы.Код_сотрудник)=[Формы]![Главная_форма_управления]![Код_сотрудник]));"
CurrentDb.Querydefs("Просмотр_задач").SQL = s
Else
s = s & "SELECT Задачи.Код_задача, Задачи.Задача, Задачи.Текст_задачи, Задачи.Комментарий_исполнителя, Задачи.Срок_задачи, Задачи.Дата_завершения, Задачи.Код_приоритет, Задачи.Код_программа, Задачи.Код_статус_работ, Задачи.Код_тэг, Задачи.Код_день_месяца, Задачи.Код_день_недели, Задачи.День_месяца, Задачи.День_недели, Приказы.Код_сотрудник FROM Задачи INNER JOIN Приказы ON Задачи.Код_задача = Приказы.Код_задача WHERE (((Задачи.Срок_задачи) Between [формы]![Главная_форма_управления]![Поле0] And [Формы]![Главная_форма_управления]![Поле2] Or (Задачи.Срок_задачи) Is Null) AND ((Задачи.Код_статус_работ)<>5  And (Задачи.Код_статус_работ)<>3) AND ((Задачи.День_месяца)=Day(Date()) Or (Задачи.День_месяца) Is Null) AND ((Задачи.День_недели)=[Формы]![Главная_форма_управления]![Поле52] Or (Задачи.День_недели) Is Null) AND ((Приказы.Код_сотрудник)=[Формы]![Главная_форма_управления]![Код_сотрудник]));"
CurrentDb.Querydefs("Просмотр_задач").SQL = s
End If
End If
    DoCmd.RunMacro "Открыть_форму_завершение_задач"
End Sub
Пояснение:

В главной форме есть 4 поля, одно - выпадающий список, и кнопка.
Поле "Код_сотрудник" - выбираем сотрудника;
Поле "Код_день_месяца" - флажок, уточняющий, показывать ли цикличные дела.
"Поле0" и "Поле2" - диапазон дат для вывода записей.

По нажатию кнопки открывается форма "Открыть_форму_завершение_задач", где на основе указанных значений выводятся нужные записи. В этой форме есть две кнопки (Вправо и Влево), которые позволяют уточнить определенную дату от той, что указана в этой форме, в поле "Срок_задачи". Цикл для кнопок написан, просто убран диапазон дат и подстановка Даты на 1 больше или на 1 меньше в зависимости от кнопки.

Кнопка влево:
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
Private Sub Кнопка54_Click()
Dim zDate As Date
zDate = Forms![Задачи_работа_с_завершением]!Срок_задачи
Forms![Главная_форма_управления]!Поле84 = zDate
If IsNull(Forms![Главная_форма_управления]!Код_сотрудник) = True Then
If Forms![Главная_форма_управления]!Код_день_месяца = Да Then
s = s & "SELECT Задачи.Код_задача, Задачи.Задача, Задачи.Текст_задачи, Задачи.Комментарий_исполнителя, Задачи.Срок_задачи, Задачи.Дата_завершения, Задачи.Код_приоритет, Задачи.Код_программа, Задачи.Код_статус_работ, Задачи.Код_тэг, Задачи.Код_день_месяца, Задачи.Код_день_недели, Задачи.День_месяца, Задачи.День_недели, Приказы.Код_сотрудник FROM Задачи INNER JOIN Приказы ON Задачи.Код_задача = Приказы.Код_задача WHERE (((Задачи.Срок_задачи)=[формы]![Главная_форма_управления]![Поле84]+1) AND ((Задачи.Код_статус_работ)<>5  And (Задачи.Код_статус_работ)<>3));"
CurrentDb.Querydefs("Просмотр_задач").SQL = s
Else
s = s & "SELECT Задачи.Код_задача, Задачи.Задача, Задачи.Текст_задачи, Задачи.Комментарий_исполнителя, Задачи.Срок_задачи, Задачи.Дата_завершения, Задачи.Код_приоритет, Задачи.Код_программа, Задачи.Код_статус_работ, Задачи.Код_тэг, Задачи.Код_день_месяца, Задачи.Код_день_недели, Задачи.День_месяца, Задачи.День_недели, Приказы.Код_сотрудник FROM Задачи INNER JOIN Приказы ON Задачи.Код_задача = Приказы.Код_задача WHERE (((Задачи.Срок_задачи)=[формы]![Главная_форма_управления]![Поле84]+1 Or (Задачи.Срок_задачи) Is Null) AND ((Задачи.Код_статус_работ)<>5  And (Задачи.Код_статус_работ)<>3) AND ((Задачи.День_месяца)=Day(Date()) Or (Задачи.День_месяца) Is Null) AND ((Задачи.День_недели)=[Формы]![Главная_форма_управления]![Поле52] Or (Задачи.День_недели) Is Null));"
CurrentDb.Querydefs("Просмотр_задач").SQL = s
End If
Else
If Forms![Главная_форма_управления]!Код_день_месяца = Да Then
s = s & "SELECT Задачи.Код_задача, Задачи.Задача, Задачи.Текст_задачи, Задачи.Комментарий_исполнителя, Задачи.Срок_задачи, Задачи.Дата_завершения, Задачи.Код_приоритет, Задачи.Код_программа, Задачи.Код_статус_работ, Задачи.Код_тэг, Задачи.Код_день_месяца, Задачи.Код_день_недели, Задачи.День_месяца, Задачи.День_недели, Приказы.Код_сотрудник FROM Задачи INNER JOIN Приказы ON Задачи.Код_задача = Приказы.Код_задача WHERE (((Задачи.Срок_задачи)=[формы]![Главная_форма_управления]![Поле84]+1) AND ((Задачи.Код_статус_работ)<>5  And (Задачи.Код_статус_работ)<>3) AND ((Приказы.Код_сотрудник)=[Формы]![Главная_форма_управления]![Код_сотрудник]));"
CurrentDb.Querydefs("Просмотр_задач").SQL = s
Else
s = s & "SELECT Задачи.Код_задача, Задачи.Задача, Задачи.Текст_задачи, Задачи.Комментарий_исполнителя, Задачи.Срок_задачи, Задачи.Дата_завершения, Задачи.Код_приоритет, Задачи.Код_программа, Задачи.Код_статус_работ, Задачи.Код_тэг, Задачи.Код_день_месяца, Задачи.Код_день_недели, Задачи.День_месяца, Задачи.День_недели, Приказы.Код_сотрудник FROM Задачи INNER JOIN Приказы ON Задачи.Код_задача = Приказы.Код_задача WHERE (((Задачи.Срок_задачи)=[формы]![Главная_форма_управления]![Поле84]+1 Or (Задачи.Срок_задачи) Is Null) AND ((Задачи.Код_статус_работ)<>5  And (Задачи.Код_статус_работ)<>3) AND ((Задачи.День_месяца)=Day(Date()) Or (Задачи.День_месяца) Is Null) AND ((Задачи.День_недели)=[Формы]![Главная_форма_управления]![Поле52] Or (Задачи.День_недели) Is Null) AND ((Приказы.Код_сотрудник)=[Формы]![Главная_форма_управления]![Код_сотрудник]));"
CurrentDb.Querydefs("Просмотр_задач").SQL = s
End If
End If
DoCmd.Close
DoCmd.OpenForm "Задачи_работа_с_завершением", asNormal
End Sub
Кнопка вправо:
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
Private Sub Кнопка55_Click()
Dim zDate As Date
zDate = Forms![Задачи_работа_с_завершением]!Срок_задачи
Forms![Главная_форма_управления]!Поле84 = zDate
If IsNull(Forms![Главная_форма_управления]!Код_сотрудник) = True Then
If Forms![Главная_форма_управления]!Код_день_месяца = Да Then
s = s & "SELECT Задачи.Код_задача, Задачи.Задача, Задачи.Текст_задачи, Задачи.Комментарий_исполнителя, Задачи.Срок_задачи, Задачи.Дата_завершения, Задачи.Код_приоритет, Задачи.Код_программа, Задачи.Код_статус_работ, Задачи.Код_тэг, Задачи.Код_день_месяца, Задачи.Код_день_недели, Задачи.День_месяца, Задачи.День_недели, Приказы.Код_сотрудник FROM Задачи INNER JOIN Приказы ON Задачи.Код_задача = Приказы.Код_задача WHERE (((Задачи.Срок_задачи)=[формы]![Главная_форма_управления]![Поле84]-1) AND ((Задачи.Код_статус_работ)<>5  And (Задачи.Код_статус_работ)<>3));"
CurrentDb.Querydefs("Просмотр_задач").SQL = s
Else
s = s & "SELECT Задачи.Код_задача, Задачи.Задача, Задачи.Текст_задачи, Задачи.Комментарий_исполнителя, Задачи.Срок_задачи, Задачи.Дата_завершения, Задачи.Код_приоритет, Задачи.Код_программа, Задачи.Код_статус_работ, Задачи.Код_тэг, Задачи.Код_день_месяца, Задачи.Код_день_недели, Задачи.День_месяца, Задачи.День_недели, Приказы.Код_сотрудник FROM Задачи INNER JOIN Приказы ON Задачи.Код_задача = Приказы.Код_задача WHERE (((Задачи.Срок_задачи)=[формы]![Главная_форма_управления]![Поле84]-1 Or (Задачи.Срок_задачи) Is Null) AND ((Задачи.Код_статус_работ)<>5  And (Задачи.Код_статус_работ)<>3) AND ((Задачи.День_месяца)=Day(Date()) Or (Задачи.День_месяца) Is Null) AND ((Задачи.День_недели)=[Формы]![Главная_форма_управления]![Поле52] Or (Задачи.День_недели) Is Null));"
CurrentDb.Querydefs("Просмотр_задач").SQL = s
End If
Else
If Forms![Главная_форма_управления]!Код_день_месяца = Да Then
s = s & "SELECT Задачи.Код_задача, Задачи.Задача, Задачи.Текст_задачи, Задачи.Комментарий_исполнителя, Задачи.Срок_задачи, Задачи.Дата_завершения, Задачи.Код_приоритет, Задачи.Код_программа, Задачи.Код_статус_работ, Задачи.Код_тэг, Задачи.Код_день_месяца, Задачи.Код_день_недели, Задачи.День_месяца, Задачи.День_недели, Приказы.Код_сотрудник FROM Задачи INNER JOIN Приказы ON Задачи.Код_задача = Приказы.Код_задача WHERE (((Задачи.Срок_задачи)=[формы]![Главная_форма_управления]![Поле84]-1) AND ((Задачи.Код_статус_работ)<>5  And (Задачи.Код_статус_работ)<>3) AND ((Приказы.Код_сотрудник)=[Формы]![Главная_форма_управления]![Код_сотрудник]));"
CurrentDb.Querydefs("Просмотр_задач").SQL = s
Else
s = s & "SELECT Задачи.Код_задача, Задачи.Задача, Задачи.Текст_задачи, Задачи.Комментарий_исполнителя, Задачи.Срок_задачи, Задачи.Дата_завершения, Задачи.Код_приоритет, Задачи.Код_программа, Задачи.Код_статус_работ, Задачи.Код_тэг, Задачи.Код_день_месяца, Задачи.Код_день_недели, Задачи.День_месяца, Задачи.День_недели, Приказы.Код_сотрудник FROM Задачи INNER JOIN Приказы ON Задачи.Код_задача = Приказы.Код_задача WHERE (((Задачи.Срок_задачи)=[формы]![Главная_форма_управления]![Поле84]-1 Or (Задачи.Срок_задачи) Is Null) AND ((Задачи.Код_статус_работ)<>5  And (Задачи.Код_статус_работ)<>3) AND ((Задачи.День_месяца)=Day(Date()) Or (Задачи.День_месяца) Is Null) AND ((Задачи.День_недели)=[Формы]![Главная_форма_управления]![Поле52] Or (Задачи.День_недели) Is Null) AND ((Приказы.Код_сотрудник)=[Формы]![Главная_форма_управления]![Код_сотрудник]));"
CurrentDb.Querydefs("Просмотр_задач").SQL = s
End If
End If
DoCmd.Close
DoCmd.OpenForm "Задачи_работа_с_завершением", asNormal
End Sub
Проблема в том, что если значений в таблице с вычисленной датой нет, то он выводит пустую форму.

Подскажите пожалуйста, как написать цикл, чтобы он выводил следующее значение, если предыдущее пустое. Причем, допустим, нет 6 дат, То после 06.04.2016 он выводит 12.06.2016.

И, возможно, упростить код в плане закрытия - открытия формы. Recordset попробовал, но как-то не получается. может неправильно выводил.


Фрагмент боевой базы прилагаю.
0
Вложения
Тип файла: rar Боевая.rar (74.9 Кб, 3 просмотров)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2016, 10:21
Ответы с готовыми решениями:

Если в вызове метода нет ошибок то выполнить условие
Допустим есть метод, делаю вызов в try-catch try { GM(); } catch{} if (//Нет ошибок...

Двойной цикл: нужно получить первое значение если выполнится условие
есть двойной цикл и нужно получить первое значение если выполнится это условие if (!field-&gt;IsWin())...

Нужно проверить существует ли определенный объект, и после этого выполнить действие, если он есть
Доброе время суток! Возникла у меня потребность проверить существует ли объект определенный и...

Нужно сделать цикл суммы значения ячеек
Нужно сделать цикл суммы значения ячеек, при этом ячейки имеют свой id вида id_0, id_1, id_2

В поиске добавить код если нет такого значения в стринггрид то вывести ошибку такого значения нет, если находит то вывод
procedure TForm1.Button5Click(Sender: TObject); var i,j,k:integer;S:string; begin for i:=1 to...

3
shanemac51
Модератор
Эксперт MS Access
9079 / 3474 / 551
Регистрация: 07.08.2010
Сообщений: 9,722
Записей в блоге: 2
06.04.2016, 10:47 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
Private Sub Кнопка58_Click()
Dim s
s = ""
s = s & "SELECT Задачи.Код_задача, Задачи.Задача, Задачи.Текст_задачи, Задачи.Комментарий_исполнителя,"
    s = s & " Задачи.Срок_задачи, Задачи.Дата_завершения, Задачи.Код_приоритет, Задачи.Код_программа,"
    s = s & " Задачи.Код_статус_работ, Задачи.Код_тэг, Задачи.Код_день_месяца, Задачи.Код_день_недели,"
    s = s & " Задачи.День_месяца, Задачи.День_недели, Приказы.Код_сотрудник"
    s = s & " FROM Задачи INNER JOIN Приказы ON Задачи.Код_задача = Приказы.Код_задача"
 
 
If IsNull(Код_сотрудник) = True Then
    If Код_день_месяца = Да Then
    s = s & " WHERE (((Задачи.Срок_задачи) Between"
    s = s & " FORMAT([формы]![Главная_форма_управления]![Поле0],'\#MM\/DD\/YYYY\#"
    s = s & " And FORMAT([Формы]![Главная_форма_управления]![Поле2],'\#MM\/DD\/YYYY\#)"
    s = s & " AND ((Задачи.Код_статус_работ)<>5 "
    s = s & " And (Задачи.Код_статус_работ)<>3));"
    CurrentDb.Querydefs("Просмотр_задач").SQL = s
    Else
    s = s & " WHERE (((Задачи.Срок_задачи) Between [формы]![Главная_форма_управления]![Поле0]"
    s = s & " And [Формы]![Главная_форма_управления]![Поле2] Or (Задачи.Срок_задачи) Is Null)"
    s = s & " AND ((Задачи.Код_статус_работ)<>5  And (Задачи.Код_статус_работ)<>3)"
    s = s & " AND ((Задачи.День_месяца)=Day(Date()) Or (Задачи.День_месяца) Is Null)"
    s = s & " AND ((Задачи.День_недели)=[Формы]![Главная_форма_управления]![Поле52]"
    s = s & " Or (Задачи.День_недели) Is Null));"
    CurrentDb.Querydefs("Просмотр_задач").SQL = s
    End If
0
Daidred
2 / 2 / 0
Регистрация: 25.03.2016
Сообщений: 33
06.04.2016, 11:14  [ТС] 3
shanemac51, исправить то можно, только зачем? Он работает и без указания формата. Выводит в правильном диапазоне. Задача состоит в том, чтобы сделать выбор даты так, чтобы он не выбивал пустую форму.

Причем не на первый код, а на второй и третий.
0
alvk
Эксперт MS Access
5953 / 3830 / 212
Регистрация: 12.08.2011
Сообщений: 10,369
07.04.2016, 02:59 4
Цитата Сообщение от Daidred Посмотреть сообщение
s = s & "SELECT Задачи.Код_задача
где описывается первоначальная s ? зачем вообще менять код SQL запроса - источника, если можно менять сразу источник в коде? -->
T-SQL
1
2
3
dim sql1 as string
sql1 = "select * from таблица where чётотам"
me.recordsource = sql1
0
07.04.2016, 02:59
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2016, 02:59

Почему если условие входа в цикл не выполняется, функция заново входит в цикл
Сам код: private void traverse_node(TreeControlItem node) { TreeControlItem...

Как сделать условие "если на панели нет компонента TImage"?
if (Sender as TImage).Parent&lt;&gt;Panel1 then Panel1.Cursor:=crHandPoint; Я сделал такое условие, но...

Тригер, проверяющ. есть ли такой ID и если есть обновляющий его, если нет - добавляющий
Сабж. В MSSQL нуб. Есть ситуация. Добавляю товар из каталога поставщика в каталог магазина....


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

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

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