Работа с отмеченными записями

Возможность отметки записей полезна для выполнения следующих операций:

Отметка пользователем записей реализуется при помощи следующих controls:

MarkButt.gif (842 bytes)

Кроме этого, пользователю могут быть предоставлены еще две функции:

Обычно, доступ пользователю к этим двум функциям предоставляется не при помощи кнопок, а через меню (так как они редко используются).

Конечно, сами отмеченные записи выделяются в listbox-e  при помощи специальных меток и/или цветом.

Список отмеченных записей находится в специальном файле или queue.  Например, файл списка отмеченных товаров:

TLIST     FILE,DRIVER('TOPSPEED'),NAME('TList'),CREATE,PRE(tli)
TCode_key  KEY(+tli:TCode),OPT,NOCASE,PRIMARY
Number_key KEY(+tli:Number),DUP,OPT,NOCASE
RECORD     RECORD
Number       ULONG          ! Порядковый номер в списке отмеченных
TCode        STRING(13)     ! Уникальный код товара

Quant        DECIMAL(13.3)  ! Количество товара
Price        DECIMAL(13.2)  ! Цена товара
           END
         END


Вся поддержка работы с отмеченными записями реализована в виде control-шаблона TListButtons, который размещает в окне нужные control-ы и вставляет соответствующий код.

#!===================================================================
#CONTROL (TListButtons, 'Кнопки Отметки товаров'), PROCEDURE
#!===================================================================
  CONTROLS
    STRING(@n6),AT(155,4),FONT(,,0800000H,),USE(LOC:RecordsTList),LEFT
    BUTTON,AT(,,16,16),MSG('Отметить/сн<255>ть отметку товара'),TIP('Отметить/сн<255>ть отметку'),|
      USE(?Button_Tag),ICON('ROMB.ICO')
    BUTTON,AT(18,0,16,16),MSG('Очистить список отмеченных товаров'),TIP('Очистить список отмеченных'),|
      USE(?Button_ClearTag),ICON('NO_ROMB.ICO')
    BUTTON,AT(18,0,16,16),MSG('Инвертировать отметки товаров документа'),TIP('Инвертировать отметки'),|
      USE(?Button_InvTag),ICON('INVERS.ICO')
    BUTTON,AT(18,0,16,16),MSG('Отметить товары по фильтру'),TIP('Отметить товары по фильтру'),|
      USE(?Button_FiltTag), ICON('FILTER.ICO')
    BUTTON,AT(18,0,16,16),MSG('Импорт из списка отмеченных товаров'),TIP('Импорт отмеченных товаров'),|
      USE(?Button_Import), ICON('IMPORT.ICO')
  END
#!
#! ----- Локальные переменные -----
#LOCALDATA
  LOC:RecordsTList LONG(0)
#ENDLOCALDATA
#!
#DISPLAY ('')
#DISPLAY ('Кнопки отметки товаров.')
#DISPLAY ('')
#DISPLAY ('Название поля кода товара:')
#PROMPT ('Поле товара:', @s20), %TowField, REQ, DEFAULT('tt2:TCode')
#DISPLAY ('')
#DISPLAY ('Название процедуры инвертирования:')
#PROMPT ('Процедура Инвертирования:', PROCEDURE), %InvTagProc, REQ, DEFAULT('InvTag_TTN')
#DISPLAY ('')
#DISPLAY ('Название процедуры фильтрации:')
#PROMPT ('Процедура Фильтрации:', PROCEDURE), %FilterTagProc, DEFAULT('FilterTag_TTN')
#DISPLAY ('')
#DISPLAY ('Название процедуры Импорта:')
#PROMPT ('Процедура Импорта:', PROCEDURE), %ImportTagProc, DEFAULT('ImportTag_TTN')
#DISPLAY ('')
#!
#ATSTART
#DECLARE (%ButtonTag)
#FOR (%Control), WHERE(%ControlInstance = %ActiveTemplateInstance)
  #SET (%ButtonTag, %Control)
#ENDFOR
#DECLARE (%ButtonClearTag)
  #FOR (%Control), WHERE(%ControlInstance = %ActiveTemplateInstance)
#SET (%ButtonClearTag, %Control)
#ENDFOR
#DECLARE (%ButtonInvTag)
#FOR (%Control), WHERE(%ControlInstance = %ActiveTemplateInstance)
  #SET (%ButtonInvTag, %Control)
#ENDFOR
#DECLARE (%ButtonFiltTag)
#FOR (%Control), WHERE(%ControlInstance = %ActiveTemplateInstance)
  #SET (%ButtonFiltTag, %Control)
#ENDFOR
#ENDAT
#!
#! ----- Beginning of Procedure, After Opening Files
#AT (%AfterFileOpen)
  LOC:RecordsTList = RECORDS( TList )
#ENDAT
#!
#! ---- Кнопка Button_Tag -----
#AT (%ControlPostEventHandling, '?Button_Tag', 'Accepted')
  tli:TCode = %TowField
  get( TList, tli:TCode_key )
  if errorcode()
    clear( tli:Record, 1 )
    set( tli:Number_key, tli:Number_key )
    previous( TList )
    if errorcode()
      Num# = 1
    else
      Num# = tli:Number + 1
    .

    clear( tli:Record )
    tli:Number = Num#
    tli:TCode = %TowField
    add( TList )
  else
    delete( TList )
  .
  LOC:RecordsTList = RECORDS( TList )
  ForceRefresh = True
  do RefreshWindow
  POST( EVENT:ScrollDown, ?Browse:1 )
#ENDAT
#!
#! ---- Кнопка Button_ClearTag ----
#AT (%ControlPostEventHandling, '?Button_ClearTag', 'Accepted')
  setCursor( cursor:Wait )
  empty( TList )
  setCursor()
  LOC:RecordsTlist = RECORDS( TList )
  ForceRefresh = True
  do RefreshWindow
  SELECT( ?Browse:1 )
#ENDAT
#!
#! ----- Кнопка Button_InvTag ----
#AT (%ControlPostEventHandling, '?Button_InvTag', 'Accepted')
  %InvTagProc
  LOC:RecordsTlist = RECORDS( TList )
  ForceRefresh = True
  do RefreshWindow
  SELECT( ?Browse:1 )
#ENDAT
#!
#! ----- Кнопка Button_FiltTag -----
#AT (%ControlPostEventHandling, '?Button_FiltTag', 'Accepted')
#IF(%FilterTagProc <> '')
  %FilterTagProc
  LOC:RecordsTlist = RECORDS( TList )
  ForceRefresh = True
  do RefreshWindow
  SELECT( ?Browse:1 )
#ENDIF
#ENDAT
#!
#! ----- Кнопка Button_Import -----
#AT (%ControlPostEventHandling, '?Button_Import', 'Accepted')
#IF(%ImportTagProc <> '')
  %ImportTagProc
  LOC:RecordsTlist = RECORDS( TList )
  ForceRefresh = True
  do RefreshWindow
  SELECT( ?Browse:1 )
#ENDIF
#ENDAT
#!

Кнопка "Инвертировать отметки" B_InvMar.gif (341 bytes)   вызывает процедуру %InvTagProc, которая инвертирует отметки записей в данной таблице:

InvMark.gif (2869 bytes)

После нажатия на кнопку "ОК" , процедура инвертирования выполняет инвертирование отметок товаров (выводя при этом progressbar), причем если установлен признак "Копировать Количество" то в список отмеченных товаров записывается также Количество и Цена отмеченных товаров.

Кнопка "Импорт из списка отмеченных" B_Export.gif (419 bytes)   вызывает процедуру %ImportTagProc, которая вставляет список отмеченных товаров в данную таблицу:

ImpoMark.gif (3147 bytes)


Кнопка "Отметить по фильтру"  B_FilMar.gif (353 bytes)   вызывает процедуру %FilterTagProc, которая выполняе отметку товаров в соответствии с заданными условиями отбора записей.  Напимер по условиям, показанным на этом примере, быдут отмечены товары в названии которых имеется подстрока "Canon" с положительным остатком на участке номер 1:

FiltMark.gif (7375 bytes)

Hosted by uCoz