Страница 1 из 2
Вызов глобальной процедуры (функции)
Добавлено: 19 Август 2015, 9:03
pansoft
Добрый день Всем!
Подскажите пожалуйста как сделать:
1)Глобальную процедуру(функцию), а так же глобальный routines.(Как сделать в принципе знаю, главный вопрос во втором пункте.)
2) Как из любого модуля вызвать глобальную процедуру(функцию) чтобы она вернула какое нибудь значение или запустить routines.
Сейчас использую С9. Пользуюсь в основном шаблонами ABC.
Заранее благодарен.
Вызов глобальной процедуры (функции)
Добавлено: 19 Август 2015, 9:44
Игорь Столяров
Привет !
Routine по определению действует внутри процедуры, в которой описана. Смотрим справку:
"Оператор ROUTINE объявляет начало локальной подпрограммы.
Она локальна по отношению к процедуре, в которой написана, и должна находиться в конце ее программной секции."
Т.е. "глобальной" (доступной из всех модулей программы) Routine не может быть в принципе, даже если ты знаешь как ее сделать.
С процедурой намного проще. Здесь просто вообще ничего делать не надо, просто укажи процедуру в списке "Procedures" модуля и вызывай.
Можно в APP включить для процедуры опцию Declare Globally и тогда процедуру можно будет вызывать из внешнего модуля (предварительно добавив ее описание в MAP модуля).
Вызов глобальной процедуры (функции)
Добавлено: 19 Август 2015, 10:20
pansoft
С процедурой намного проще. Здесь просто вообще ничего делать не надо, просто укажи процедуру в списке "Procedures" модуля и вызывай.
Хочу сделать функцию SetDateForUser(IdUser) возвращает 1 если получилось 0 если нет. ( в в самой функции идет запись в таблицу Users).
Попробовал сделать: кнопка New Procedura > Вкладка Templete> Выбрал пункт Source-Source Procedure.
Там нет возвращаемой переменной.
Пожалуйста, если можно поподробнее.
Вызов глобальной процедуры (функции)
Добавлено: 19 Август 2015, 10:30
kreator
Source на то и source, там всё руками пишется. Описал прототип с возвращаемой переменной, а в тексте пишешь:
Реальный пример:
Код: Выделить всё
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
Вызов глобальной процедуры (функции)
Добавлено: 19 Август 2015, 11:22
pansoft
Я извиняюсь, но прошу для чайников расставите что где должно стоять.
Надо получить процедурой 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"
Вызов глобальной процедуры (функции)
Добавлено: 19 Август 2015, 11:53
kreator
Пишешь в конце:
и всё.
Только не понятно зачем здесь PUT(UserList) ? Это, наверно, надо написать после RET:Error=0.
Вызов глобальной процедуры (функции)
Добавлено: 19 Август 2015, 12:42
kreator
Подумал я. Вообще код неправильный. В 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
Типа того.
Вызов глобальной процедуры (функции)
Добавлено: 19 Август 2015, 13:10
pansoft
Да PUT не там стоял.
Но после добавления 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"
Прошу дальше разобрать полет...
Вызов глобальной процедуры (функции)
Добавлено: 19 Август 2015, 13:18
Игорь Столяров
pansoft писал(а): Cannot RETURN value from procedure
1. Ты в прототипе процедуры SetDateForUser указал, что будет возвращаться значение ? Например: (),byte
2. Замени "return RET:Error" на "Return(RET:Error)"
Вызов глобальной процедуры (функции)
Добавлено: 19 Август 2015, 13:56
pansoft
1. Ты в прототипе процедуры SetDateForUser указал, что будет возвращаться значение ? Например: (),byte
Этого мне и не хватило.
2. Замени "return RET:Error" на "Return(RET:Error)"
После расстановки прототипов и параметров заработало и "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"
Вызов глобальной процедуры (функции)
Добавлено: 19 Август 2015, 14:03
Игорь Столяров
Ты просто невнимательно читал ...
kreator писал(а): Описал прототип с возвращаемой переменной, а в тексте пишешь:
Вызов глобальной процедуры (функции)
Добавлено: 19 Август 2015, 14:09
Yufil
Окончательным код станет только после замены 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
Вызов глобальной процедуры (функции)
Добавлено: 19 Август 2015, 14:17
pansoft
Игорь Столяров писал(а): Ты просто невнимательно читал ...
Ну да точно
Игорь Столяров писал(а): Источник цитаты Описал прототип с возвращаемой переменной, а в тексте пишешь:
, смотриш в книгу видиш фигу

.
Yufil писал(а): замены Next и Put на методы ABC
Это принципиально? Я просто для себя хочу понять. Чем методы ABC лучше Next и Put? Они быстрей или это будущее Clariona? Или еще какая то причина?
Вызов глобальной процедуры (функции)
Добавлено: 19 Август 2015, 14:50
kreator
pansoft писал(а):Это принципиально? Я просто для себя хочу понять. Чем методы ABC лучше Next и Put? Они быстрей или это будущее Clariona? Или еще какая то причина?
Теоретически, после put нужно написать ещё обработку ошибок. Сейчас непонятно прошёл put или не прошёл. а метод update сам выдаст проблему. Ну и вообще красиво и правильно.
Вызов глобальной процедуры (функции)
Добавлено: 20 Август 2015, 10:12
pansoft
Еще раз, спасибо, всем, за помощь и разъяснение по поводу ABC (буду пробовать)!