PROTOCOL

Материал из Фабиус wiki
Перейти к: навигация, поиск

PROTOCOL - это программа из справочника R266

Протокол изменения реквизита за период

Текст

local r169_kod, r166_lvl, r165_ident, gg, sql, aa, msg, flt, i, xx, fld, _, _2, ii, regs_path, ip, my, end_data, tbl, key, str_blk

// путь к логам
regs_path := RegsPath
if Empty( regs_path )
  regs_path := OpdataPath
endif

// запрос периода
ip := InputPeriod( true )
if Empty( ip )
  return
endif

// выбор документа
r169_kod := ChoiceRefr( 'R169', 'KOD', { 'KOD', 'PNAME' }, ~Title := 'Выберите один документ' )
if Empty( r169_kod )
  return
endif

// выбор уровня
r166_lvl := ChoiceRefr( 'R166', 'LVLNUM', { 'LVLNUM', 'PNAME' }, [ KINDDOC = '] + r169_kod + [' ], ~Title := 'Выберите уровень' )
if Empty( r166_lvl )
  return
endif

// выбор реквизита
r165_ident := ChoiceRefr( 'R165', 'IDENT', { 'IDENT', 'PNAME' }, [ KINDDOC = '] + r169_kod + [' and LVLNUM = '] + r166_lvl + [' ], ~Title := 'Выберите один реквизит' )
r165_ident := Atr( r165_ident )

try
  try
    WaitMsg( 'Подготовка данных', msg )

    // таблица RGNUM-ов
    fld := 'gg,C,8; '
    gg := CreateTmpFile( fld, 'gg' , ~IsFreeDel := true )

    // таблица для результата
    fld := ' _0,D,4; _1,C,10; _2,C,8; _3,D,4; _4,C,12; _5,C,10; _6,C,10; _7,C,30; _8,N,5; _9,C,50; '
    _  := CreateTmpFile( fld, '_' , ~IsFreeDel := true )
    _2 := CreateTmpFile( fld, '_2', ~IsFreeDel := true )

    my := StoD( ip[1] )
    end_data := StoD( ip[2] ) + 1

    // цикл, который выполняется для каждого дня
    while my <> end_data
      WaitMsg( 'Подготовка данных за ' + my, msg )

      // очищаем таблицу RGNUM-ов gg
      sql := [ Delete From ] + TmpFilePath( gg )
      SimpleSql( sql, TempPath )

      // наполнение таблицы RGNUM-ов gg
      sql := [ Select RGNUM From ] + RetDbName( r169_kod ) + Ret_f_ext( my ) + [ Where KINDDOC = '] + r169_kod + [' and LVLNUM = '] + r166_lvl + [' and DATDOC = '] + SqlDate( my ) + [' ]
      SimpleSql( [ Insert into ] + TmpFilePath( gg ) + [( gg ) ] + sql, OpdataPath )
      aa := '1'
      ii := 0
      while !Empty( aa )
        WaitMsg( 'Подготовка данных за ' + my + ' ( ' + ii + ' ) ', msg )
        sql := [ Select TOP 1 START AT ] + ii * 1000 + [ gg From ] + TmpFilePath( gg )
        aa := SqlToArr( sql )
        sql := [ Select TOP 999 START AT ] + ii * 1000 + [ gg From ] + TmpFilePath( gg )
        xx := SelectSqlToArr( sql, { 'gg' }, OpdataPath, false )
        if !Empty( xx )
          xx := PrepareArr( xx, 1 )
          flt := 
          for i := 1 to len( xx )
            flt := flt + iif( Empty( flt ), [], [ or ] ) + [KINDDOC = '] + r169_kod + [' and LVLNUM = '] + r166_lvl + [' and RGNUM = '] + xx[i] + [' and FLDNAME = '] + r165_ident + [']
          next
          sql := [ Select RGNUM, DATE, TIME, Left( OLDVALUE, 10 ), Left( NEWVALUE, 10 ), STACK, USERKOD From REGS] + Ret_f_ext( my ) + [ Where ] + flt
          SimpleSql( [ Insert into ] + TmpFilePath( _2 ) + [( _2, _3, _4, _5, _6, _7, _8 ) ] + sql, regs_path )
        endif
        ii := ii + 1
      end

      sql := [ Update _2 Set _0 = DATDOC, _1 = NUMDOC From ] + TmpFilePath( _2 )+ [ _2 left outer join ] + RetDbName( r169_kod ) + Ret_f_ext( my ) + [ ;
        ON _2 = RGNUM Where KINDDOC = '] + r169_kod + [' and LVLNUM = '] + r166_lvl + [' ]
      SimpleSql( sql, OpdataPath )

      my := my + 1
    end

    // _2 -> _
    sql := [ Select TOP 100 PERCENT * From ] + TmpFilePath( _2 )+ [ Order by _3, _4 ]
    SimpleSql( [ Insert into ] + TmpFilePath( _ )+ [ ] + sql, TempPath )

    // r126
    sql := [ Update _ Set _9 = PNAME From ] + TmpFilePath( _ ) + [ _ left outer join R126 ON _8 = KOD ]
    SimpleSql( sql, ReflisPath )
  finally
    HideMsg( msg )
  end

  ( _ )->( DbGoTop() )

  tbl := { { 'Title', 'Протокол изменения реквизита ' + r165_ident + ' документа ' + r169_kod + ' ( уровень ' + r166_lvl + ' ) ' }, { 'ShowType', 2 } }

  fld := { ;
    { { 'Fldname', '_0'  }, { 'FldTitl', 'Дата;документа' }, { 'PreBlk', false } }, ;
    { { 'Fldname', '_1'  }, { 'FldTitl', 'Номер;документа' }, { 'PreBlk', false } }, ;
    { { 'Fldname', '_2'  }, { 'FldTitl', 'RGNUM;документа' }, { 'PreBlk', false } }, ;
    { { 'Fldname', '_3'  }, { 'FldTitl', 'Дата;изменения' }, { 'PreBlk', false } }, ;
    { { 'Fldname', '_4'  }, { 'FldTitl', 'Время;изменения' }, { 'PreBlk', false } }, ;
    { { 'Fldname', '_5'  }, { 'FldTitl', 'Старое;значение' }, { 'PreBlk', false } }, ;
    { { 'Fldname', '_6'  }, { 'FldTitl', 'Новое;значение' }, { 'PreBlk', false } }, ;
    { { 'Fldname', '_7'  }, { 'FldTitl', 'Тип вызова ( стек )' }, { 'PreBlk', false } }, ;
    { { 'Fldname', '_8'  }, { 'FldTitl', 'Код' }, { 'PreBlk', false } }, ;
    { { 'Fldname', '_9'  }, { 'FldTitl', 'Фамилия пользователя' }, { 'PreBlk', false } } ;
  }

  str_blk := [ SeekAndBrowse( '] + r169_kod + [', _2, Year( _0 ), Month( _0 ) ) ]

  key := { ;
    { { 'KeyName', 'F6' } }, ;
    { { 'KeyName', 'F7' }, { 'TEXT', 'Докумт' }, { 'BLK', str_blk } } ;
  }

  // вывод таблицы _ на экран
  MyGrid( _, tbl, fld, key, ~isCloseTbl := true )

finally
  CloseTable( gg )
  // CloseTable( _ )
  CloseTable( _2 )
end

// _0 - дата документа
// _1 - номер документа
// _2 - RGNUM
// _3 - дата
// _4 - время
// _5 - старое значение
// _6 - новое значение
// _7 - тип вызова
// _8 - код пользователя
// _9 - фамилия

Смотрите также

Полезные функции

Функции Delphi