Вызов глобальной процедуры (функции)
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Вызов глобальной процедуры (функции)
Добрый день Всем!
Подскажите пожалуйста как сделать:
1)Глобальную процедуру(функцию), а так же глобальный routines.(Как сделать в принципе знаю, главный вопрос во втором пункте.)
2) Как из любого модуля вызвать глобальную процедуру(функцию) чтобы она вернула какое нибудь значение или запустить routines.
Сейчас использую С9. Пользуюсь в основном шаблонами ABC.
Заранее благодарен.
Подскажите пожалуйста как сделать:
1)Глобальную процедуру(функцию), а так же глобальный routines.(Как сделать в принципе знаю, главный вопрос во втором пункте.)
2) Как из любого модуля вызвать глобальную процедуру(функцию) чтобы она вернула какое нибудь значение или запустить routines.
Сейчас использую С9. Пользуюсь в основном шаблонами ABC.
Заранее благодарен.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7379
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Вызов глобальной процедуры (функции)
Привет !
Routine по определению действует внутри процедуры, в которой описана. Смотрим справку:
"Оператор ROUTINE объявляет начало локальной подпрограммы.
Она локальна по отношению к процедуре, в которой написана, и должна находиться в конце ее программной секции."
Т.е. "глобальной" (доступной из всех модулей программы) Routine не может быть в принципе, даже если ты знаешь как ее сделать.
С процедурой намного проще. Здесь просто вообще ничего делать не надо, просто укажи процедуру в списке "Procedures" модуля и вызывай.
Можно в APP включить для процедуры опцию Declare Globally и тогда процедуру можно будет вызывать из внешнего модуля (предварительно добавив ее описание в MAP модуля).
Routine по определению действует внутри процедуры, в которой описана. Смотрим справку:
"Оператор ROUTINE объявляет начало локальной подпрограммы.
Она локальна по отношению к процедуре, в которой написана, и должна находиться в конце ее программной секции."
Т.е. "глобальной" (доступной из всех модулей программы) Routine не может быть в принципе, даже если ты знаешь как ее сделать.
С процедурой намного проще. Здесь просто вообще ничего делать не надо, просто укажи процедуру в списке "Procedures" модуля и вызывай.
Можно в APP включить для процедуры опцию Declare Globally и тогда процедуру можно будет вызывать из внешнего модуля (предварительно добавив ее описание в MAP модуля).
За теми кто отстал - не возвращаться. (С) Кодекс
Вызов глобальной процедуры (функции)
Хочу сделать функцию SetDateForUser(IdUser) возвращает 1 если получилось 0 если нет. ( в в самой функции идет запись в таблицу Users).С процедурой намного проще. Здесь просто вообще ничего делать не надо, просто укажи процедуру в списке "Procedures" модуля и вызывай.
Попробовал сделать: кнопка New Procedura > Вкладка Templete> Выбрал пункт Source-Source Procedure.
Там нет возвращаемой переменной.
Пожалуйста, если можно поподробнее.
-
- ✯ Ветеран ✯
- Сообщения: 4984
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Вызов глобальной процедуры (функции)
Source на то и source, там всё руками пишется. Описал прототип с возвращаемой переменной, а в тексте пишешь:
Реальный пример:
Код: Выделить всё
return LOC:ReturnValue
Код: Выделить всё
AABImageRotateFlip PROCEDURE (String LOC:FileIn,String LOC:FileOut,Long LOC:RotateFlipType) ! Declare Procedure
oHH &tagHTMLHelp
CODE
LOC:Error = RapRunExt.ImageRotateFlip(LOC:FileIn, LOC:FileOut, LOC:RotateFlipType)
return LOC:Error
We are hard at work… for you.
Вызов глобальной процедуры (функции)
Я извиняюсь, но прошу для чайников расставите что где должно стоять.
Надо получить процедурой PAR:IdUser и вернуть RET:Error.
Вот Source процедуры:
Надо получить процедурой PAR:IdUser и вернуть RET:Error.
Вот Source процедуры:
Код: Выделить всё
SetDateForUser PROCEDURE ! Declare Procedure
! Start of "Data Section"
! [Priority 1300]
! End of "Data Section"
! Start of "Local Data After Object Declarations"
! [Priority 5000]
! End of "Local Data After Object Declarations"
CODE
! Start of "Processed Code"
! [Priority 4000]
CLEAR(UserList)
Use:IdUserList=PAR:IdUser
SET(Use:PK_UserList,Use:PK_UserList)
NEXT(UserList)
If ERRORCODE() THEN RET:Error=1.
If Use:IdUserList=PAR:IdUser THEN
Use:DataFrom_DATE=LOC:DateSvodki
Use:DataFrom_TIME='00:00:00'
Use:DateTo_DATE=LOC:DateSvodki
Use:DateTo_TIME=144000
RET:Error=0
ELSE
RET:Error=1
END
PUT(UserList)
! End of "Processed Code"
! Start of "Procedure Routines"
! [Priority 3500]
! End of "Procedure Routines"
! Start of "Local Procedures"
! [Priority 5000]
! End of "Local Procedures"
-
- ✯ Ветеран ✯
- Сообщения: 4984
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Вызов глобальной процедуры (функции)
Пишешь в конце:
и всё.
Только не понятно зачем здесь PUT(UserList) ? Это, наверно, надо написать после RET:Error=0.
Код: Выделить всё
return RET:Error
Только не понятно зачем здесь PUT(UserList) ? Это, наверно, надо написать после RET:Error=0.
We are hard at work… for you.
-
- ✯ Ветеран ✯
- Сообщения: 4984
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Вызов глобальной процедуры (функции)
Подумал я. Вообще код неправильный. В ABC так не пишут. Вот так:
Типа того.
Код: Выделить всё
RET:Error=1
Use:IdUserList=PAR:IdUser
if ~Access:UserList.Fetch(Use:PK_UserList)
Use:DataFrom_DATE=LOC:DateSvodki
Use:DataFrom_TIME='00:00:00'
Use:DateTo_DATE=LOC:DateSvodki
Use:DateTo_TIME=144000
if ~Access:UserList.Update()
RET:Error=0
end
end
return RET:Error
We are hard at work… for you.
Вызов глобальной процедуры (функции)
Да PUT не там стоял.
Но после добавления return RET:Error выдает ошибку - Cannot RETURN value from procedure
так же выдает ошибку на входной параметр PAR:IdUser и выходной RET:Error - Unknown identifier: PAR:IDUSER
Прошу дальше разобрать полет...
Но после добавления return RET:Error выдает ошибку - Cannot RETURN value from procedure
так же выдает ошибку на входной параметр PAR:IdUser и выходной RET:Error - Unknown identifier: PAR:IDUSER
Код: Выделить всё
SetDateForUser PROCEDURE ! Declare Procedure
! Start of "Data Section"
! [Priority 1300]
! End of "Data Section"
! Start of "Local Data After Object Declarations"
! [Priority 5000]
! End of "Local Data After Object Declarations"
CODE
! Start of "Processed Code"
! [Priority 4000]
RET:Error=0
CLEAR(UserList)
Use:IdUserList=PAR:IdUser
SET(Use:PK_UserList,Use:PK_UserList)
NEXT(UserList)
If ERRORCODE() THEN RET:Error=1.
If Use:IdUserList=PAR:IdUser THEN
Use:DataFrom_DATE=TODAY()
Use:DataFrom_TIME='00:00:00'
Use:DateTo_DATE=TODAY()
Use:DateTo_TIME=144000
PUT(UserList)
ELSE
RET:Error=1
END
return RET:Error
! End of "Processed Code"
! Start of "Procedure Routines"
! [Priority 3500]
! End of "Procedure Routines"
! Start of "Local Procedures"
! [Priority 5000]
! End of "Local Procedures"
- Игорь Столяров
- Ветеран движения
- Сообщения: 7379
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Вызов глобальной процедуры (функции)
1. Ты в прототипе процедуры SetDateForUser указал, что будет возвращаться значение ? Например: (),byte
2. Замени "return RET:Error" на "Return(RET:Error)"
За теми кто отстал - не возвращаться. (С) Кодекс
Вызов глобальной процедуры (функции)
Этого мне и не хватило.1. Ты в прототипе процедуры SetDateForUser указал, что будет возвращаться значение ? Например: (),byte
После расстановки прототипов и параметров заработало и "return RET:Error" и "Return(RET:Error)".2. Замени "return RET:Error" на "Return(RET:Error)"
Спасибо всем. Большое дело для меня сделали.
Вставлю окончательный код.
Код: Выделить всё
SetDateForUser PROCEDURE (Long PAR:IdUser,Date PAR:ToDay1) ! Declare Procedure
! Start of "Data Section"
! [Priority 1300]
! [Priority 4000]
RET:Error Long
! [Priority 8500]
! End of "Data Section"
! Start of "Local Data After Object Declarations"
! [Priority 5000]
! End of "Local Data After Object Declarations"
CODE
! Start of "Processed Code"
! [Priority 4000]
RET:Error=0
CLEAR(UserList)
Use:IdUserList=PAR:IdUser
SET(Use:PK_UserList,Use:PK_UserList)
NEXT(UserList)
If ERRORCODE() THEN RET:Error=1.
If Use:IdUserList=PAR:IdUser THEN
Use:DataFrom_DATE=PAR:ToDay1
Use:DataFrom_TIME='00:00:00'
Use:DateTo_DATE=PAR:ToDay1
Use:DateTo_TIME=144000
PUT(UserList)
ELSE
RET:Error=1
END
return(RET:Error)
! End of "Processed Code"
! Start of "Procedure Routines"
! [Priority 3500]
! End of "Procedure Routines"
! Start of "Local Procedures"
! [Priority 5000]
! End of "Local Procedures"
- Игорь Столяров
- Ветеран движения
- Сообщения: 7379
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Вызов глобальной процедуры (функции)
Ты просто невнимательно читал ...
За теми кто отстал - не возвращаться. (С) Кодекс
Вызов глобальной процедуры (функции)
Окончательным код станет только после замены Next и Put на методы ABC
Код: Выделить всё
!-- NEXT(UserList)
IF Access:UserList.Next()
Ret:Error = 1
Return
END
! Кстати, здесь неверно - если записи нет, надо сразу уходить
!If ERRORCODE() THEN RET:Error=1.
If Use:IdUserList=PAR:IdUser
....
!PUT(UserList)
Access:UserList.Update()
ELSE
RET:Error=1
END
Вызов глобальной процедуры (функции)
Ну да точно
, смотриш в книгу видиш фигу .
Это принципиально? Я просто для себя хочу понять. Чем методы ABC лучше Next и Put? Они быстрей или это будущее Clariona? Или еще какая то причина?
-
- ✯ Ветеран ✯
- Сообщения: 4984
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Вызов глобальной процедуры (функции)
Теоретически, после put нужно написать ещё обработку ошибок. Сейчас непонятно прошёл put или не прошёл. а метод update сам выдаст проблему. Ну и вообще красиво и правильно.pansoft писал(а):Это принципиально? Я просто для себя хочу понять. Чем методы ABC лучше Next и Put? Они быстрей или это будущее Clariona? Или еще какая то причина?
We are hard at work… for you.
Вызов глобальной процедуры (функции)
Еще раз, спасибо, всем, за помощь и разъяснение по поводу ABC (буду пробовать)!