Страница 1 из 1

Browse не по главной логической таблице

Добавлено: 23 дек 2013, 13:58
Zver
В разрабатываемом интерфейсе составляется отчет по списку МЦ.
Этот список МЦ можно задавать различными способами. Один из них - все МЦ из приходной накладной.

Можно просто включить таблицу KatSopr в главную логическую таблицу и по ней строить броуз.

Однако хочу сделать так, чтобы всё, что связано с выбором приходной накладной, находилось в отдельном окне.
И логическая таблица, и функции и обработчики событий.

Для этого создаю вторую логическую таблицу, которая создаётся при запуске окна.
Однако построить броуз по этой таблице не могу. Не выводится ни одна запись.

Вот код для описания окна:

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

Window wnSlcNakl 'Выбор приходной' dialog;
var
  sDogovor_NoDoc : string;
  sPrinakl_nSopr : string;

  create view wv_wnSlcNakl
  var
    vw_cDogovor   : comp;
  select
    KatMc.Name
    (FieldName = flMC_Name)
    ,katmc.Obozn
    (FieldName = flMC_obozn)
  from
    KatMc
  , mtMC_List
  , KatSopr
  , Dogovor
  where
  ((
        mtMC_List.cMc == KatMc.NRec
    and 101           == KatSopr.VidSopr
  ))

  bounds ByDogovor =     vw_cDogovor /== KatSopr.cDogovor
                     and 0           <<= katSopr.dSopr
  ;

  browse brPriNakl 'приходные накладные';
    show at (,,,11);
    table KatSopr;
    fields
      wv_wnSlcNakl.KatSopr.NSopr 'номер накладной'    : [20], protect;
      wv_wnSlcNakl.KatSopr.Descr 'Дескриптор'         : [20], protect;
      wv_wnSlcNakl.KatSopr.dSopr 'Выписана'           : [20], protect;
      wv_wnSlcNakl.KatSopr.dOpr  'Дата оприходования' : [20], protect;
  end;

  browse brmtMC_List 'Спецификация приходной накладной'
    show at (,12,,19);
    table mtMC_List;
    fields
      mtMC_List.Npp           'Номер позиции' : [ 5], protect;
      mtMC_List.MC_BarKod     'Баркод'        : [20], protect;
      wv_wnSlcNakl.flMC_Name  'Наименование'  : [20], protect;
      wv_wnSlcNakl.flMC_obozn 'Обозначение'   : [20], protect;
      mtMC_List.dKol          'Количество'    : [10], protect;
  end;

  screen scFilters;
    show at(,20,,);
    fields
      sPrinakl_nSopr;
      wFilters : noprotect;
      sDogovor_NoDoc: pickButton;
  <<
       Выбрана накладная  .@@@@@@@@@@@@@@@@@@   Фильтры [.] `по договору    .@@@@@@@@@@@@@@@@@@
                                                        [.] `по контрагенту
  >>
  end;

  Procedure Fill_mtMC_List(_cKatSopr: comp);
  var
    iNum: integer;
  {
    mtClear(#mtMC_List, mfNormal);
    iNum := 0;

    vw_cKatSopr := KatSopr.NRec;

    _Loop SpSopr where ((KAtSopr.NRec == SpSopr.cSopr))
    {
      ++iNum;
      vw_cMc := SpSopr.cMCUSL;
      if (GetFirst FastFirstrow KatMc_Get = tsOK) //       == KatMc_Get.Nrec
        insert into mtMC_List set
                    mtMC_List.cKatSopr := KatSopr.NRec
                  , mtMC_List.Npp := SpSopr.Npp
                  , mtMC_List.MC_BarKod := KAtMc_Get.BarKod
                  , mtMC_List.dKol := SpSopr.Kol
                  , mtMC_List.cmc  := SpSopr.cMCUSL;
    }

    ReReadRecord(#mtMC_List);
  }

  windowEvent  wnSlcNakl;
    cmDefault:
    {
      Fill_mtMC_List(KatSopr.NRec);
      set sPrinakl_nSopr := KatSopr.NSopr;
      RereadRecord(tnmtMC_List);
    }

    cmDone:
    {
      set flMC_Indent := 'Выбрана накладная ' + KatSopr.NSopr;
      vw_cSklad := KatSopr.cPodrTo;
    }

    cmPick:
      case curfield of

        #sDogovor_NoDoc:
        {
          if( (wFilters & 1) > 0 )
          {
            RunInterface( 'L_DOGOVOR::GetSomeDogovor', 0, 0, 0, 1, false, wv_wnSlcNakl.vw_cDogovor, false, 0 );
            if (wv_wnSlcNakl.GetFirst FastFirstRow Dogovor where (( wv_wnSlcNakl.vw_cDogovor == Dogovor.NRec )) = tsOk )
              sDogovor_NoDoc := wv_wnSlcNakl.DOGOVOR.NoDoc;
            wv_wnSlcNakl.PushBounds(wv_wnSlcNakl.tbByDogovor);
            RereadRecord(wv_wnSlcNakl.tnKatSopr);
          }
        }
      end;
  end;

end;

Re: Browse не по главной логической таблице

Добавлено: 23 дек 2013, 14:18
Den
Это принципиально как то что по именнованной вью хотите делать визуальный формат ?
Все это реализуется в основной вью через синонимы.

Re: Browse не по главной логической таблице

Добавлено: 23 дек 2013, 14:43
Zver
Обычно так и делаю, через синоним.

Однако хотелось бы в этот раз:
1) узнать лучше как всё работает
2) избежать усложнения основной логической таблицы, сделать её меньше и проще для дальнейшего развития.
В дальнейшем планируется добавлять и другие механизмы выбора списка МЦ, и хотелось бы локализовывать их в пределах соответствующих окон.
3) загружать список приходных накладных необходимо не всегда. А если поместить в основную логическую таблицу - то эти данные будут выгружаться
при каждом запуске интерфейса, а необходимости в этом нет.

Пока сдача проекта не горит, хочу сделать хорошо.

Re: Browse не по главной логической таблице

Добавлено: 23 дек 2013, 14:49
Ольга
Если мне память не изменяет, визуальные элементы строятся только по главной вью.
Остальные вью ( вторая и далее) могут быть использованы только для выполнения обработки (расчетов и т.п.).

В вашем случае тогда уж проще делать выбор не в доп.окнах, а отдельными интерфейсами. Тогда и с ЛТ никаких проблем не будет.

Re: Browse не по главной логической таблице

Добавлено: 23 дек 2013, 14:57
Den
Zver писал(а): А если поместить в основную логическую таблицу - то эти данные будут выгружаться
при каждом запуске интерфейса,

Ничего там все не будет выгружаться - если бы так все было устроено, то всякие там стандартные документы (ДО ,накладные, ордера и т.п) загружались бы вообще подолгу.
действительно, иногда доп вью нужны для разгрузки основного вью. Но бывает это нечасто совсем и вряд ли это Ваш случай

Re: Browse не по главной логической таблице

Добавлено: 23 дек 2013, 15:09
Zver
Den писал(а):
Zver писал(а): А если поместить в основную логическую таблицу - то эти данные будут выгружаться
при каждом запуске интерфейса,

Ничего там все не будет выгружаться - если бы так все было устроено, то всякие там стандартные документы (ДО ,накладные, ордера и т.п) загружались бы вообще подолгу.
действительно, иногда доп вью нужны для разгрузки основного вью. Но бывает это нечасто совсем и вряд ли это Ваш случай

Хотелось бы до конца прояснить этот вопрос. Означает ли это, что данные из логической таблицы выгружаются только тогда, когда они нужны?
То есть, пока не будет обращения к синониму таблицы KatSopr, созданного для отображения приходных накладных, то и эти данные не выгрузятся.
Как только будет вызван броуз по этой таблице, то данные выгружаются и по ним строится броуз?

Re: Browse не по главной логической таблице

Добавлено: 23 дек 2013, 15:10
Zver
Ольга писал(а):Если мне память не изменяет, визуальные элементы строятся только по главной вью.
Остальные вью ( вторая и далее) могут быть использованы только для выполнения обработки (расчетов и т.п.).

В вашем случае тогда уж проще делать выбор не в доп.окнах, а отдельными интерфейсами. Тогда и с ЛТ никаких проблем не будет.
У меня уже начало складываться такое подозрение. Спасибо, что подтвердили их.

Re: Browse не по главной логической таблице

Добавлено: 23 дек 2013, 15:36
Screw
Чтобы внести окончательную ясность: визуальные элементы могут связываться только с узлами основной ЛТ и, соответственно, отображать данные только её полей.

Что касается вопроса организации работы Вашего интерфейса, то рекомендую любого рода выбор реализовывать отдельными интерфейсами. Просто потому, что переход между визуальными элементами в пределах одного интерфейса означает смену текущего узла. Если узел, с которого мы переходим, отмечен флагами "вставляется новая запись" и/или "модифицирован", переход автоматически вызовет подпрограмму вставки/обновления записи. Опять же, выделение выбора в отдельный интерфейс облегчает повторное использование его кода.
Den писал(а):
Zver писал(а): А если поместить в основную логическую таблицу - то эти данные будут выгружаться
при каждом запуске интерфейса,

Ничего там все не будет выгружаться - если бы так все было устроено, то всякие там стандартные документы (ДО ,накладные, ордера и т.п) загружались бы вообще подолгу.
действительно, иногда доп вью нужны для разгрузки основного вью. Но бывает это нечасто совсем и вряд ли это Ваш случай
Увы (или к счастью), Атлантис пытается инициализировать позиции корневых узлов основной ЛТ при загрузке интерфейса. То есть, загружает данные из БД. Это легко увидеть с помощью протокольных версий драйверов. Этим кстати, объясняются заметные тормоза при загрузке отдельных интерфейсов: прикладник добавляет в ЛТ узел без ограничений - чисто для того, чтобы в нужный момент выбрать из него данные по условию, а услужливый Атлантис строит и выполняет запрос, возвращающий всё множество записей в БД. Дело усугубляется наличием филиальных или протектных фильтров. Виной всему беспечность программиста.

О терминологии. Данные в ЛТ не выгружаются. ЛТ используется только как источник информации о связях между узлами. Эта информация нужна для построения запросов к БД. В норме порции полученных Атлантис-приложением данных хранятся только в кэшах драйвера БД. С другой стороны, для правильной работы брауза,к примеру, приходится сначала получить полный перечень уникальных идентификаторов записей, которые могут быть отображены, а потом только получать данные по каждой из упомянутых записей в отдельности.

Re: Browse не по главной логической таблице

Добавлено: 23 дек 2013, 16:08
Zver
Вот и борюсь со своей беспечностью :)

Думал о возможности создания отдельного интерфейса для выбора приходной накладной. Идея потом использовать этот фейс в дальнейшем - очень интересна, надо будет так и переделать.
Можно как-нибудь возвращать из вызываемого интерфейса на несколько значений (передаваемых как параметры), а результат выборки?

Например, в вызываемом интерфейсе выбирается приходная накладная, а по ней формируется список различных МЦ. Вот этот список МЦ мне и нужен в основном фейсе.

Пока нашел способ делать через dsk-файлы. Но на мой взгляд
1) брать данные из оперативной памяти
2) записывать их на жесткий диск только для того,
3) что бы потом опять считать
- это несколько противоестественно.

Re: Browse не по главной логической таблице

Добавлено: 23 дек 2013, 17:39
Den
для этого используют
- маркеры
- pick
- временные таблицы в памяти