Страница 1 из 1
GetFirst не возвращает статус tsOk
Добавлено: 22 авг 2024, 09:09
Bodybomber
Доброго времени суток.
Вот фрагмент кода.
...
Create View
As Select *
From
tblActReconcil ( Normal )
, tmpSaldo1 ( Normal )
, KatOrg ( ReadOnly )
Where
((
tblActReconcil.cMC == tmpSaldo1.cMC And
tblActReconcil.cParty == tmpSaldo1.cParty And
tblActReconcil.cMOL == tmpSaldo1.cMOL And
tblActReconcil.cParty == tmpSaldo1.cPodr
))
;
...
HandlerEvent
...
cmPick:
{
Case CurField Of
#sOrg:
{
If RunInterFace( 'L_Katorg::GetKator', cOrg ) <> cmCancel
{
If ( GetFirst KatOrg Where (( cOrg == KatOrg.nRec )) ) = tsOk Then
Set sOrg := KatOrg.Name;
ReReadRecord();
}
}
End; //Case CurField Of
...
End.
Вызов интерфейса 'L_Katorg::GetKator' возвратил в cOrg nRec выбранной записи в каталоге организации.
Последующая инструкция GetFirst не возвращает tsOk по заданному ограничению. cOrg <> 0 и валидна. Переменная sOrg не инициализируется. Помогите, пожалуйста, разобраться: почему я не могу спозиционироваться на конкретной записи в каталоги контрагентов?
Re: GetFirst не возвращает статус tsOk
Добавлено: 22 авг 2024, 11:54
Irina_
Здравствуйте.
Во View похоже, что условие некорректное: справа ссылка на подразделение, слева на партию.
В таблице tblActReconcil точно есть записи?
Еще как-то сталкивалась, что тоже не могла спозиционироваться на запись в таблице. Добавила еще одно View с этой таблицей, движение сделала по этой View, и проблема решилась.
Re: GetFirst не возвращает статус tsOk
Добавлено: 22 авг 2024, 11:57
Bodybomber
Упс. Мда. Что касается view, то здесь однозначный баг. А вот что касается KatOrg?
Re: GetFirst не возвращает статус tsOk
Добавлено: 22 авг 2024, 13:36
Bodybomber
Очень странно, но получилось через пень-колоду решить проблему путем присвоения значения cOrg другой глобальной переменной cRec, и уже через нее спозиционироваться на нужной записи в KatOrg.
Код: Выделить всё
Var
cOrg, cRec :Comp;
...
Create view
AS Select *
From
...
KatOrg
Where
((
cRec == KatOrg.nRec And
...
));
...
HandleEvent
...
cmPick:
{
Case CurField Of
#sOrg:
{
If RunInterFace( 'L_Katorg::GetKator', cOrg ) <> cmCancel
{
cRec := cOrg;
If GetFirst KatOrg = tsOk Then
Set sOrg := KatOrg.Name;
ReReadRecord();
}
}
End;
}
End;
P.S.
Спасибо за участие.
Re: GetFirst не возвращает статус tsOk
Добавлено: 23 авг 2024, 11:58
spark
Может дело не во второй переменной, а в том, что во втором примере вы переменные и условие перенесли во view?
Re: GetFirst не возвращает статус tsOk
Добавлено: 27 авг 2024, 16:17
edward_K
обычно такое бывает когда имя переменной объявлено несколько раз.
Например в var перед create view и в create view(или там есть таблица с таким полем и она одна) - тогда в коде вы видите первое, а getfirst возьмет второе.
Я рекомендую стараться делать более длинные названия, отделять локальные от глобальных (я использую префикс _) и избегать совпадений с именами полей в таблицах.
Можно так объявить непосредственно перед вызовом
var _cOrg : comp =0;
Re: GetFirst не возвращает статус tsOk
Добавлено: 27 авг 2024, 17:39
Bodybomber
edward_K писал(а): ↑27 авг 2024, 16:17
обычно такое бывает когда имя переменной объявлено несколько раз.
Например в var перед create view и в create view(или там есть таблица с таким полем и она одна) - тогда в коде вы видите первое, а getfirst возьмет второе.
Я рекомендую стараться делать более длинные названия, отделять локальные от глобальных (я использую префикс _) и избегать совпадений с именами полей в таблицах.
Можно так объявить непосредственно перед вызовом
var _cOrg : comp =0;
Абсолютно верно. Я сам некоторое время тому назад хотел оставить такой же комментарий. Но поостерегся категорически утверждать сие предположение. И спасибо Вам за подтверждение моих догадок.
Re: GetFirst не возвращает статус tsOk
Добавлено: 28 авг 2024, 09:01
KVS
Bodybomber писал(а): ↑27 авг 2024, 17:39
Абсолютно верно. Я сам некоторое время тому назад хотел оставить такой же комментарий. Но поостерегся категорически утверждать сие предположение. И спасибо Вам за подтверждение моих догадок.
Вместо префиксов к именам переменных можно использовать несколько иной подход:
Код: Выделить всё
interface a;
Interface A 'A' ('', hcNoContext, sci1Esc);
Show at(,,,);
var i : word;
create view v1 var i : word;;
Screen sc '' ('', hcNoContext, sci1Esc);
Show at(,,,);
noTableNavigation ;
Fields
i : protect;
v1.i : protect;
<<
.@@@@@@@@@@@@@@@@@@@@@@@
.@@@@@@@@@@@@@@@@@@@@@@@
>>
End;
procedure test(i : word);
{
//Т.к. у нас локальная переменная i и глобальная имеют одинаковые имена,
//к глобальной можно обратиться через квалификатор private;
private::i := i;
//Тут в переменную во вьюхе кладём значение из глобальной переменной
//Если у вьюхи нет имени, то можно через A.i
v1.i := private::i;
}
HandleEvent // Interface
cmInit:
{
test(100);
//Или A.i, если у вьюхи не было бы имени.
v1.i -= 50;
}
End;
End.
Итого при пересечении имён переменных:
1. Для обращения к переменной интерфейса можно использовать private::имя_перемнной;
2. Для обращения к переменной вьюхи можно использовать имя_вьюхи.имя_переменной, при этом, если у вьюхи нет имени, но она описана первой в интерфейсе, то обратиться к переменным, таблицам и полям в ней можно через имя_интерфейса.имя_идентификатора;
3. Вопрос о чистоте кода при таком подходе - тема для отдельного обсуждения: на мой взгляд вариант, предложенный edward_K предпочтительнее, его я и сам использую (но иногда прибегаю и к private::)