2015-05-21 8 views
0

Я хочу знать, что именно происходит в следующем бит кода,Что такое ПОСТОЯННЫЕ ПРОЦЕДУРЫ 4GL?

IF THIS-PROCEDURE:PERSISTENT 
THEN 
    DELETE PROCEDURE THIS-PROCEDURE. 

Actullay Я должен исправить ошибку в виде сложной старой кодировкой приложения GUI Progress. Вкратце сценарий, Система содержит различные сведения о членах. Среди них есть поле для отношений, и вы можете переключиться на запись отношения, нажав кнопку переключателя. Таким образом, проблема заключается в том, что после перехода на запись отношения и выхода из системы записей сохраняется блокировка записи отношений, в которую мы включили. Я не могу опубликовать anycode, поскольку он массивный и сложный, чтобы показать проблему с кодом, но если любой мог бы получить голову вокруг этого, вы можете привести меня в правильном направлении, чтобы разобраться в этой проблеме. Я ожидаю ответа, как то, что было бы ключевым моментом для проверки такого рода проблемы? Любая помощь будет высоко оценен.

ответ

3

Персистентная процедура - это та, которая остается в памяти после завершения ее первоначального RUN. (По аналогии с древними «оканчивается резидентными» процедуры в DOS ...)

Ниже приводится более упрощенный, но может помочь:

Тела процедуры можно рассматривать как «конструктор».

Код, который вы показываете, как правило, является частью внутренней процедуры («метод»), которая служит деструктором.

Другие процедуры, которые знают дескриптор постоянной процедуры, могут выполнять свои методы. «RUN xyz IN proc-handle». (Вы можете избежать необходимости знать ручку, установив постоянную процедуру как «процедуру сеанса супер».)

Ошибка вашей блокировки, вероятно, из-за плохой области записи. Вероятно, есть ссылка на запись, которая относится к процедуре в целом. Некоторые методы затем «заимствуют» эту область записи из большей процедуры и изменяют ее, что требует блокировки. Затем блокировка привязана к процедуре, а не к методу.

Один трюк, который я, лично, найти полезным, чтобы написать внутренние процедуры таким образом:

procedure xyz: 

    define parameter cnum as integer no-undo. 
    define parameter cname as character no-undo. 

    define buffer customer for customer. /* this is the "trick" */ 

    find customer exclusive-lock where custNum = cnum. 
    custName = cname. 

end. 

«Определить буфер» ограничивает все ссылки на «клиента» к этой внутренней процедуры (метода). Это предотвращает утечку случайной записи.

3

Том дал вам хорошее описание постоянных, а также указал на наиболее вероятную проблему с кодом (запись в область обзора, а не проблема постоянной процедуры).

Люблю один шаг дальше, чем Том предлагает и использовать сильнодействующие область видимости, потому что:

1) Компилятор будет предупреждать вас о попытках увеличить объем 2) Он работает в обоих внутренних процедур и старой вершине стиля код

define buffer bfCustomer for Customer. 

/*- a bfCustomer reference here gets a compiler error -*/ 

do for bfCustomer transaction: 
    find first bfCustomer exclusive-lock no-error. 
    assign bfCustomer.name = "testme". 
end. 

/*- a bfCustomer reference here gets a compiler error -*/ 
+0

Я бы упомянул об этом, но я решил, что буду начинать с тезисов «progress phd»;) –