Я новичок в PeopleCode, и когда я изучаю функции, я заметил, что в PeopleCode мы обычно передавали значение, используя% PATIENT_ID. Друг сказал мне, что вы также можете пройти по ссылке в PeopleCode, но как?Можете ли вы пройти по ссылке в PeopleCode?
ответ
PeopleCode проходит по ссылке для функций.
Function addOne(&num As integer)
&num = &num + 1
End-Function;
Local integer &val = 9;
addOne(&val);
MessageBox(0, "", 0, 0,String(&val));
Результаты в 10
Если вы используете классы App ведет себя по-разному методов:
- Pass по значению для простых типов (строка, INT, числа и т.д.)
- Передать по ссылке для объектов (ряды, записи, классы приложений)
Может проходить по ссылке для простых типов, используя OUT keywo й в списке параметров
method addOne(&num as integer out)
Функции, которые определены в том же контексте в качестве исполняемого кода, например, page/component/record/field PeopleCode, всегда рассматривайте параметры как ссылки.
В классах приложений параметры простых типов методов могут быть определены с помощью ключевого слова «out», чтобы указать, что они являются ссылками. Методы также автоматически передают параметры как ссылки для сложных типов. Подумайте: «Если есть много данных, это ссылка»
Эта документация будет очень полезна для вас. https://docs.oracle.com/cd/E26239_01/pt851h3/eng/psbooks/tpcr/chapter.htm?File=tpcr/htm/tpcr07.htm
Попутный Параметры с типами данных Object
параметров с типами данных объекта всегда передаются по ссылке:
/* argument passed by reference */ method storeInfo(&f as File);
Если указать из модификатора для параметра метода с объект тип данных, он становится ссылочным параметром. Это означает, что переменная параметра передается по ссылке вместо объекта, который указывает на момент передачи.
Например, если вы передать параметр объекта с выхода модификатора:
method myMethod(&arg as MyObjectClass); Local MyObjectClass &o1 = create MyObjectClass("A"); Local MyOtherObjectClass &o2 = create MyOtherObjectClass(); &o2.myMethod(&o1); And inside myMethod this occurs: Method myMethod &arg = create MyObjectClass("B"); end-method;
Поскольку метод аргумент переназначен в теле MyMethod, & o1 не указывает на новый экземпляр MyObjectClass (инициализируется с «B») после завершения вызова метода. Это потому, что & o1 еще ссылается на исходный экземпляр MyObjectClass.
Однако, если & o1 был принят с модификатором из, после завершения вызова метода, & o1 точки на то, что параметр был последним назначен; в этом случае новый экземпляр MyObjectClass.Параметр , а не объект, передается по ссылке. Использование Исходная спецификация для параметра
В следующем примере класс AddStuff имеет один общедоступный метод , DoAdd. Это добавляет два числа вместе, затем назначает их как разных номеров. В сигнатуре декларации метода первый параметр не объявлен с выводом out, а второй - .
class AddStuff method DoAdd(&P1 as number, &P2 as number out); end-class; method DoAdd &X = &P1 + &P2; &P1 = 1; &P2 = 2; end-method;
В следующем примере PeopleCode, объект с именем & Ареф является экземпляр из класса AddStuff. Два параметра, & I и & J - также определены.
local AddStuff &Aref = Create AddStuff(); local number &I = 10; local number &J = 20;
Приведенный ниже пример кода. & J изменяется, из-за завышенности в сигнатуре метода, и потому что значение передано по ссылке. Значение & I не обновляется.
&Aref.DoAdd(&I, &J); /* changes &J but not &I */
Следующий пример кода вызывает ошибку времени проектирования. Второй параметр должен передаваться по ссылке, а не по значению.
&Aref.DoAdd(10, 20); /* error - second argument not variable */