Страница 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, там всё руками пишется. Описал прототип с возвращаемой переменной, а в тексте пишешь:

Код: Выделить всё

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

Вызов глобальной процедуры (функции)

Добавлено: 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
Пишешь в конце:

Код: Выделить всё

return RET:Error
и всё.
Только не понятно зачем здесь 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 (буду пробовать)!