Страница 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::)