powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как останвить выполнение процедуры из функции, используемой в этой процедуре
31 сообщений из 31, показаны все 2 страниц
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32767670
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub aa()
call Yo(param)
end sub

function Yo(param as integer)
if param =  1  then
lalala
else
ЗАВЕРШЕНИЕ ВЫПОЛНЕНИЯ aa()
end if
end function
Как такое сделать?
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32767677
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как обычно не подходит?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub aa()
if Yo(param)=false then 
exit sub
end if
end sub

function Yo(param as integer) as boolean
if param =  1  then
lalala
Yo=true
else
Yo=false
end if
end function
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32767683
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>а как обычно не подходит?
нет :)
Вот реальная ситуация (вкратце):
По нажатии на кнопку вызывается функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function aa()
SQLStr = "INSERT INTO __TEMP_ОПЕРАТОР_Характеристики_заказа ( operid_2, tbl_id, [Реф №], " _
        & "Наименование, Дата1, Дата2, валюта, [КА+]) " _
        & "SELECT operid, 'bill_arrival', [Реф №], " _ 
        & "'Заявка подписана', Дата1, дата2, валюта, " _
        & "iif(валюта <> '" & [Forms]![заказ]!cur & "', round(эквивалент1*yeratedate(yetype(1), " _
        & "дата1)/yeratedate('" & [Forms]![заказ]!cur & "',дата1), 2), round(приход,2)) " _
        & "FROM __TEMP_Характеристики_заказа_bill_arrival " _
        & "WHERE ((([operid_3])=" & [Forms]![заказ]![OperID] & ") and расход is null)"
CurrentDb.Execute SQLStr
end function

Здесь есть функция yeratedate, вычисляющая курс валюты на определенную дату. Если курс не введен, то необходимо остановить выполнение функции aa()
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32767688
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не понял, что мешает проверить наличие введенного курса перед запуском функции. Я всегда проверяю :)
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32767694
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Gне понял, что мешает проверить наличие введенного курса перед запуском функции. Я всегда проверяю :)
Grrrrrrrrrrrrrrrrrrrr :)
Попробую ограничиться ответом "Так надо" :)
Хотя ладно - немного поясню.
Обрабатывается большой массив данных, где участвует масса дат с разными курсами валют соответственно, и предварительная проверка снизит скорость работы программы. Да и работа это лишняя :)
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32767695
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем это... Меня интересует ответ по существу вопроса :)
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32767700
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vsevolod V Да и работа это лишняя :)А-а-а.... :)
Vsevolod V
В общем это... Меня интересует ответ по существу вопроса :)без обработки возвращаемого функцией значения- никак :)
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32767826
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно в функции вызвать ошибку (например деление на 0)
а в процедуре ее обработать
правда на VB никогда не делал тока на C#
там для этого есть удобные инструменты обработки исключений.
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32767875
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно в дочернюю функцию передать байреф параметр и его проверять из материнской

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Sub aa()
dim er as integer
call Yo(param , er )
if er <>  0  then exit sub



end sub

function Yo(param as integer , byref er as integer)
if param =  1  then
lalala
else
er =  1 
end if
end function
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32767914
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему это не будет работать, т.к. функция вызывается из строки SQL
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32767935
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Vsevolod V
Сделать запрос, который джойнит нужную нам табличку с датами с табличкой с курсами по полю с датами - сделать группировку в этом запросе и посмотреть количество записей - если оно равно количеству дат в искомой табличке - то выполнять запрос.
Данная проверка будет достаточно бысто работать.
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32767940
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vsevolod VПо-моему это не будет работать, т.к. функция вызывается из строки SQL
т.е. вы хотите остановить выполнение запроса в зависимости от результата работы функции?

тогда впросы:
1. функция возвращает одинаковое значение для всего надора записей?
Если да - то вычисляем функцию до выполнения запроса, а в запрос уже значение вставляем.
Если нет:
2. Что делать, когда (например) из 3 вариантов функция 2 раза отработала корректно и 1 раз не корректно:
- остановить весь запрос?
- пропустить только не корректную запись?

ИМХО - надо менять сам подход к решению задачи (алгоритм то есть), а не пытаться скрестить удава с носорогом.
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32767951
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 paparome
Функция вычисляет значение по дате в исходной табличке - т.е. для всех дат разные значения.
yeratedate(yetype(1), дата1) - это из текста запроса. Так что вариант с подстановкой значения в запрос не катит:)
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32768310
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. вы хотите остановить выполнение запроса в зависимости от результата работы функции?
нет-нет. Мне нужно остановить выполнение всей функции.
---
Идея такая: пользователь нажимает кнопку "Проводки" - происходит вычисление проводок - если какой-либо курс не введен, то форма "Проводки" не открывается, а выдается сообщение, что нужно ввести такой-то курс на такую-то дату
Организовано так: на Click весит функция, составляющая проводки. В этойфункции используется YerateDate(CurrencyType, DateType), где и проверяется наличие курса на определенную дату. Если курса нет, то функция выдает соответствующее сообщение. Проблема в том, что если не введено несколько курсов (а их бывает много), то выдается серия сообщений, после чего открывается форма с никчемными данными
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32768323
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может сначала выполнить проверку данных а потом запускать отчет или что еще там ?
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32768346
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vsevolod V Если курса нет, то функция выдает соответствующее сообщение. Проблема в том, что если не введено несколько курсов (а их бывает много), то выдается серия сообщений, после чего открывается форма с никчемными данными

Т.е. задача сводится к тому, чтобы предварительно проверить все ли курсы валют есть? Тогда наилучший вариант, имхо, сделать предварительно запрос который это проверит, а затем уже выполнять основной по результатам проверки... или не выполнять и информировать суммарно где чего не хватает.
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32768464
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ясно, спасибо
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32768472
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Vsevolod V
Ура, то что я сказал больше 2-х часов назад наконец-то осмыслено:)
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32768650
Когда ты уже меня слушать начнеш? Не дело над больными глумиться, ой не дело...
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32768674
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hummer2 Vsevolod V
Ура, то что я сказал больше 2-х часов назад наконец-то осмыслено:)

Иногда хор звучит убедительнее солиста. "А карфаген должен быть разрушен!!!" (с) Пример работы солиста, когда его не слышат с первого раза...
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32768775
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hummer2 Vsevolod V
Ура, то что я сказал больше 2-х часов назад наконец-то осмыслено:)
Если посмотреть выше, я попытался это сказать 12 с лишним часов назад в 4-м посте топика. Сколько же за это время клавиш потоптали....
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32768910
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alexander G
Ага - был не прав:)

2 Совесть Хаммера
Зато у меня ластиков мульон:)
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32769322
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясняю ситуацию спешиал фо Hummer и Ко
Был задан конкретный вопрос - вопрос остался без ответа - Ясно, спасибо.

Решение нашел попроще: поместил на форме с кнопкой галку, галка ставится, если курса нет. Вот и все :)
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32769334
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Vsevolod V
на мой взгляд, вопрос ты задал плохой.

Ответ от Hummer-a и Ко получил почти полный
По существу им и воспользовался.

Выражая благодарность таким специальным образом, можно вообще "без советов" остаться...




(с выражением лица)
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32769338
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Vsevolod V
Блин - ответ выполнить запрос с проверкой - это уже не конкретный ответ?:)
Тест запроса надо написать нашему умному парню?:)

А если пользователь галку забудет поставить?:)
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32769349
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 hummer
если сделано правильно - то галка у него вычислимая...

(с выражением лица)
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32769436
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
плин.
С утра хотел написать, что порвать ф-ю в вашем случае - это порвать запрос. Запрос для этого должен выполняться ассинхронно. (см хелп), т.е. процесс который долже его стопнуть должен мочь крутиться параллельно ему и вызвать его .Cancel . По крайней мере у запроса дожен быть такой метод. Кроме ODBC запросов что-то ничего такое не вспоминается.


поытка трбюков:
__
1. В джет можно переделать ф-ю так, как это делается для подсчета самопальных сумматоров (типа номера строки) - а именно добавить статик переменную и опциональный параметр. Запрос при этом выполняться после ошибки не перестанет, но можно сделать, чтобы после первой ошибки следующие строки не возвращались. (поместив в Where вашу же ф-ю, но с неким значением опционалого параметра, т, чтобы после ошибки она возвращала FALSE), в (или до) открытии отчета можно еще раз вызвать ф-ю, так, чтобы вычислить ее статик переменную. Если она покажет, что в запросе возникала ошибка, отчет можно не открывать.

Но оптимально в вашем случае - взять (Select count(*) From ... Left Join ... ON ... = curs.дата Where curs.дата IS NULL) до запроса (или в запросе - что несколько хуже), и не мучаться.



_____________
2. Есть еще возможность вызвать ошибку в Запросе. Но, к сожалению, если в явном виде err.Rase сделать в ф-ии, она не перехватится обработчиком ошибок вызвавшей исполняемый запрос ф-ии а выдаст вам запрос об отладке. Есть трюк - вызвать ошибку в самом запросе. В случае Insert Into это легко - если заставить запрос вставлять данные не того типа, или большего размера:
'__TEMP_ОПЕРАТОР (id, MyFun) - целые
Код: plaintext
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 tryErr(code)
    tryErr =  1 
    If code =  1000  Then
        'err.Raise 666 'не выталкивается из запроса в обработчик ф-ии
        tryErr = "Фих вам, а не барабан"
    End If
End Function

Public Function TestErrQry()
Dim sSQl As String
On Error Resume Next
    sSQl = "INSERt  INTO __TEMP_ОПЕРАТОР  ( id, MyFun ) SELECT tabl.id, tryErr([id])  AS MyFun FROM tabl ;"
    CurrentDb.Execute sSQl, dbFailOnError
    If err <>  0  Then
        MsgBox err.Description
    End If
    err.Clear
    sSQl = "INSERt  INTO __TEMP_ОПЕРАТОР  ( id, MyFun ) SELECT tabl.id, tryErr([id])  AS MyFun FROM tabl WHERE id<>1000;"
    CurrentDb.Execute sSQl, dbFailOnError
    If err <>  0  Then
        MsgBox err.Description
    Else
        MsgBox "Ok!"
    End If
End Function
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32769727
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victosha2 Vsevolod V
на мой взгляд, вопрос ты задал плохой.

Ответ от Hummer-a и Ко получил почти полный
По существу им и воспользовался.

Выражая благодарность таким специальным образом, можно вообще "без советов" остаться...

Hummer2 Vsevolod V
Блин - ответ выполнить запрос с проверкой - это уже не конкретный ответ?:)
Тест запроса надо написать нашему умному парню?:)

А если пользователь галку забудет поставить?:)

Господа, вопрос поставлен в названии темы, а его раскрытие в первом мессаге. Дальше идет полет мысли "на отвлеченную тему". И такие мессаги типа "Ура, то что я сказал больше 2-х часов назад наконец-то осмыслено:)" (учитывая, что их несколько) мне совсем не нравятся.
Далее. На данный момент решение проблемы выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub aa()
call Yo(param)
if not me!fld_galka = true then
docmd.openform "provodki"
end if
end sub

function Yo(param as integer)
if param =  1  then
lalala
else
Forms!Forma!fld_Galka = true
end if
end function
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32790077
Отвечая на поставленный изначально вопрос.

Так сделать можно, и очень даже просто, если пожертвовать возможностью локальной обработки ошибок в процедурах.

Вот работающий (если я правильно понял суть вопроса, конечно) пример:

Код: plaintext
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.
Sub start()
    
    On Error Resume Next
    
    Debug.Print "До вызова процедуры аа"
    
    call aa( 0 )
    
    Debug.Print "после вызова процедуры аа"
    
    Err.Clear

End Sub

Sub aa(param As Integer)

    'никаких On error здесь быть не должно

    Debug.Print "До вызова процедуры Yo"

    Call Yo(param)

    Debug.Print "После вызова процедуры Yo"

End Sub

Function Yo(param As Integer)
    
    'никаких On error здесь быть не должно
    
    If param =  1  Then
        Debug.Print "Не прерываем"
    Else
        Debug.Print "Прерываем"
        Err.Raise vbObjectError +  1 
    End If

End Function
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32790108
Roma R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
function Yo(param as integer)
if param = 1 then
lalala
else
'ЗАВЕРШЕНИЕ ВЫПОЛНЕНИЯ aa()
END
end if
end function
...
Рейтинг: 0 / 0
Как останвить выполнение процедуры из функции, используемой в этой процедуре
    #32790193
AlTis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vsevolod V Victosha2 Vsevolod V
на мой взгляд, вопрос ты задал плохой.

Ответ от Hummer-a и Ко получил почти полный
По существу им и воспользовался.

Выражая благодарность таким специальным образом, можно вообще "без советов" остаться...

Hummer2 Vsevolod V
Блин - ответ выполнить запрос с проверкой - это уже не конкретный ответ?:)
Тест запроса надо написать нашему умному парню?:)

А если пользователь галку забудет поставить?:)

Господа, вопрос поставлен в названии темы, а его раскрытие в первом мессаге. Дальше идет полет мысли "на отвлеченную тему". И такие мессаги типа "Ура, то что я сказал больше 2-х часов назад наконец-то осмыслено:)" (учитывая, что их несколько) мне совсем не нравятся.
Далее. На данный момент решение проблемы выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub aa()
call Yo(param)
if not me!fld_galka = true then
docmd.openform "provodki"
end if
end sub

function Yo(param as integer)
if param =  1  then
lalala
else
Forms!Forma!fld_Galka = true
end if
end function


мда. Я думаю вы изобретаете велосипед.
Чем Ваша галочка отличается от

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub aa()

if not Yo(param) then
docmd.openform "provodki"
end if
end sub

function Yo(param as integer) as boolean
if param =  1  then
lalala
else
Yo= true
end if
end function
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как останвить выполнение процедуры из функции, используемой в этой процедуре
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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