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

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
pansoft
Бывалый
Сообщения: 76
Зарегистрирован: 08 Август 2011, 11:37

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

Сообщение pansoft »

Добрый день Всем!
Подскажите пожалуйста как сделать:
1)Глобальную процедуру(функцию), а так же глобальный routines.(Как сделать в принципе знаю, главный вопрос во втором пункте.)
2) Как из любого модуля вызвать глобальную процедуру(функцию) чтобы она вернула какое нибудь значение или запустить routines.
Сейчас использую С9. Пользуюсь в основном шаблонами ABC.
Заранее благодарен.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7378
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

Привет !

Routine по определению действует внутри процедуры, в которой описана. Смотрим справку:
"Оператор ROUTINE объявляет начало локальной подпрограммы.
Она локальна по отношению к процедуре, в которой написана, и должна находиться в конце ее программной секции."
Т.е. "глобальной" (доступной из всех модулей программы) Routine не может быть в принципе, даже если ты знаешь как ее сделать. ;)

С процедурой намного проще. Здесь просто вообще ничего делать не надо, просто укажи процедуру в списке "Procedures" модуля и вызывай.
Можно в APP включить для процедуры опцию Declare Globally и тогда процедуру можно будет вызывать из внешнего модуля (предварительно добавив ее описание в MAP модуля).
За теми кто отстал - не возвращаться. (С) Кодекс
pansoft
Бывалый
Сообщения: 76
Зарегистрирован: 08 Август 2011, 11:37

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

Сообщение pansoft »

С процедурой намного проще. Здесь просто вообще ничего делать не надо, просто укажи процедуру в списке "Procedures" модуля и вызывай.
Хочу сделать функцию SetDateForUser(IdUser) возвращает 1 если получилось 0 если нет. ( в в самой функции идет запись в таблицу Users).
Попробовал сделать: кнопка New Procedura > Вкладка Templete> Выбрал пункт Source-Source Procedure.
Там нет возвращаемой переменной.
Пожалуйста, если можно поподробнее.
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

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

Сообщение 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
We are hard at work… for you. :)
pansoft
Бывалый
Сообщения: 76
Зарегистрирован: 08 Август 2011, 11:37

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

Сообщение 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"
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

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

Сообщение kreator »

Пишешь в конце:

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

return RET:Error
и всё.
Только не понятно зачем здесь PUT(UserList) ? Это, наверно, надо написать после RET:Error=0.
We are hard at work… for you. :)
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

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

Сообщение 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   
Типа того.
We are hard at work… for you. :)
pansoft
Бывалый
Сообщения: 76
Зарегистрирован: 08 Август 2011, 11:37

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

Сообщение 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"
Прошу дальше разобрать полет...
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7378
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

pansoft писал(а): Cannot RETURN value from procedure
1. Ты в прототипе процедуры SetDateForUser указал, что будет возвращаться значение ? Например: (),byte
2. Замени "return RET:Error" на "Return(RET:Error)"
За теми кто отстал - не возвращаться. (С) Кодекс
pansoft
Бывалый
Сообщения: 76
Зарегистрирован: 08 Август 2011, 11:37

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

Сообщение 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"
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7378
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

Ты просто невнимательно читал ... ;)
kreator писал(а): Описал прототип с возвращаемой переменной, а в тексте пишешь:
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение 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        
pansoft
Бывалый
Сообщения: 76
Зарегистрирован: 08 Август 2011, 11:37

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

Сообщение pansoft »

Игорь Столяров писал(а): Ты просто невнимательно читал ...
Ну да точно
Игорь Столяров писал(а): Источник цитаты Описал прототип с возвращаемой переменной, а в тексте пишешь:
, смотриш в книгу видиш фигу :) .
Yufil писал(а): замены Next и Put на методы ABC
Это принципиально? Я просто для себя хочу понять. Чем методы ABC лучше Next и Put? Они быстрей или это будущее Clariona? Или еще какая то причина?
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

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

Сообщение kreator »

pansoft писал(а):Это принципиально? Я просто для себя хочу понять. Чем методы ABC лучше Next и Put? Они быстрей или это будущее Clariona? Или еще какая то причина?
Теоретически, после put нужно написать ещё обработку ошибок. Сейчас непонятно прошёл put или не прошёл. а метод update сам выдаст проблему. Ну и вообще красиво и правильно.
We are hard at work… for you. :)
pansoft
Бывалый
Сообщения: 76
Зарегистрирован: 08 Август 2011, 11:37

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

Сообщение pansoft »

Еще раз, спасибо, всем, за помощь и разъяснение по поводу ABC (буду пробовать)!
Ответить