FILL R473 TD

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

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

Заполнить справочник R473 для ТД ( Цены материалов на дату )

FILL_R473_TD()

Текст

// Для планировщика написать следующую процедуру

// Анализируется MTUN за 3 предыдущих месяца
// Для всей номенклатуры с группой "отдел закупок" необходимо найти последнюю цену поставщика
// Цену поставщика умножаем на 1% и записываем в R473

// После этого анализируем R473
// Если цена номенклатуры не изменилась, с предыдущего раза, удаляем свежую запись в R473

local t, fld, msg, sql, i, t2, t3, r, r2, t4

// t
// t_KOD   - код ТМЦ
// t_GROUP - группа

fld := 't_KOD,N,5;t_GROUP,C,10'

try
  msg := WaitMsg( 'Подготовка данных' )
  t := CreateTmpFile( fld, 't', ~IsFreeDel:=true )

  for i := 0 to 3
    // MTUN
    sql := [ Select DISTINCT KOD ;
      From MTUN]+Ret_f_ext( Date(),, -i )+[ ;
      Where REFL = 'R08 ' ]
    if Is_File( 'MTUN',TimeBack( Date(), -i ) )
      SimpleSql( [ Insert into ]+TmpFilePath( t )+[( t_KOD ) ]+sql, OpdataPath )
    endif
  next

  // r08
  sql := [ Update t ;
    Set t_GROUP = CODEGROUP ;
  From  ]+TmpFilePath( t )+[ t ;
    left outer join R08 ON t_KOD = KOD ]
  SimpleSql( sql, ReflisPath )

  // t -> x
  sql := [ Delete ;
    From ]+TmpFilePath( t )+[ ;
    Where t_GROUP not like '16%' ]
  SimpleSql( sql, TempPath )

  // t2
  // t2_KOD  - код
  // t2_DATE - дата
  // t2_MAXD - максимальная ли дата ? ( 1 - максимальная )
  // t2_1    - цена без НДС
  // t2_2    - цена с НДС
  fld := 't2_KOD,N,5;t2_DATE,D,8;t2_MAXD,N,1;t2_1,N,14,4;t2_2,N,14,4'
  t2 := CreateTmpFile( fld, 't2', ~IsFreeDel:=true )

  for i := 0 to 3
    sql := [ Select DANAL2, DATDOC, ]+SqlField('PRICE1')+[, ;
      ]+SqlField('ALLPRICE')+[ ;
      From DOCS]+Ret_f_ext( Date(),, -i )+[ ;
      Where KINDDOC = 'UTH' and LVLNUM = '2' and AMNT<>0 and "SUM"<>0 and ;
        DREFL1='R10 ' and DANAL1>0 and DREFL2='R08 ' ]
    if Is_File( 'DOCS',TimeBack( Date(), -i ) )
      SimpleSql( [ Insert into ]+TmpFilePath( t2 )+[( t2_KOD, t2_DATE, t2_1, t2_2 ) ;
        ]+sql, OpdataPath )
    endif
  next

  sql := [ Update t2 ;
    Set t2_KOD = 0 ;
    From ]+TmpFilePath( t2 )+[ t2 ;
      left outer join ]+TmpFilePath( t )+[ ON t2_KOD = t_KOD ;
    Where t_KOD is null  ]
  SimpleSql( sql, TempPath )

  sql := [ Delete ;
    From ]+TmpFilePath( t2 )+[ ;
    Where t2_KOD = 0 ]
  SimpleSql( sql, TempPath )

  // тут надо найти максимальные даты по каждой номенклатуре

  // t3
  // t3_DATE - дата
  // t3_KOD  - код
  fld := 't3_DATE,D,8;t3_KOD,N,5'
  t3 := CreateTmpFile( fld, 't3', ~IsFreeDel:=true )

  sql := [ Select t2_KOD, Max( t2_DATE ) ;
    From ]+TmpFilePath( t2 )+[ ;
    Group by t2_KOD ]
  SimpleSql( [ Insert into ]+TmpFilePath( t3 )+[( t3_KOD, t3_DATE ) ]+sql, OpdataPath )

  sql := [ Update t2 ;
    Set t2_MAXD = 1 ;
    From ]+TmpFilePath( t2 )+[ t2 ;
      left outer join ]+TmpFilePath( t3 )+[ ON t2_DATE = t3_DATE and t2_KOD = t3_KOD ;
    Where t3_KOD is not null ]
  SimpleSql( sql, TempPath )

  sql := [ Delete ;
    From ]+TmpFilePath( t2 )+[ ;
    Where t2_MAXD is null ]
  SimpleSql( sql, TempPath )

  // Цену поставщика умножаем на 1%
  sql := [ Update t2 ;
    Set t2_1 = Round( t2_1 * 101 / 100, 4 ), ;
      t2_2 = Round( t2_2 * 101 / 100, 4 ) ;
    From ]+TmpFilePath( t2 )+[ t2 ]
  SimpleSql( sql, TempPath )

  // максимальные даты найдены, цены увеличены
  // сравним эти цены с существующими в справочнике R473

  // r
  // r_KOD   - код
  // r_GROUP - группа
  // r_DATE  - дата
  // r_MAXD  - максимальная ли дата ? ( 1 - максимальная )
  // r_1     - цена без НДС
  // r_2     - цена с НДС
  fld := 'r_KOD,N,5;r_GROUP,C,10;r_DATE,D,8;r_MAXD,N,1;r_1,N,14,4;r_2,N,14,4'
  r  := CreateTmpFile( fld, 'r' , ~IsFreeDel:=true )
  r2 := CreateTmpFile( fld, 'r2', ~IsFreeDel:=true )

  // r473 -> r
  sql := [ Select KOD, VAR_DATE, PRICE1, OTP_PRICE ;
    From R473 ;
    Where VAR_DATE < ']+SqlDate( Bom( Date() ) )+[']
  SimpleSql( [ Insert into ]+TmpFilePath( r )+[( r_KOD, r_DATE, r_1, r_2 ) ;
    ]+sql, ReflisPath )

  // t3 -> x
  sql := [ Delete ;
    From ]+TmpFilePath( t3 )
  SimpleSql( sql, TempPath )

  // --- ПОИСК ПОСЛЕДНИХ ЦЕН В СПРАВОЧНИКЕ R473 ---
  sql := [ Select r_KOD, Max( r_DATE ) ;
    From ]+TmpFilePath( r )+[ ;
    Group by r_KOD ]
  SimpleSql( [ Insert into ]+TmpFilePath( t3 )+[( t3_KOD, t3_DATE ) ]+sql, OpdataPath )

  sql := [ Update r ;
    Set r_MAXD = 1 ;
    From ]+TmpFilePath( r )+[ r ;
      left outer join ]+TmpFilePath( t3 )+[ ON r_DATE = t3_DATE and r_KOD = t3_KOD ;
    Where t3_KOD is not null ]
  SimpleSql( sql, TempPath )

  // очищаю таблицу r от старых цен
  sql := [ Delete ;
    From ]+TmpFilePath( r )+[ ;
    Where r_MAXD is null ]
  SimpleSql( sql, TempPath )
  // *** ПОИСК ПОСЛЕДНИХ ЦЕН В СПРАВОЧНИКЕ R473 ***

  // ищем в таблице t2 такие цены, которые абсолютно совпадают с ценами в R473
  // и удаляем их

  sql := [ Update t2 ;
    Set t2_MAXD = 2 ;
    From ]+TmpFilePath( t2 )+[ t2 ;
      left outer join ]+TmpFilePath( r )+[ ON t2_KOD = r_KOD and t2_1 = r_1 and t2_2 = r_2 ;
    Where r_KOD is not null ]
  SimpleSql( sql, TempPath )

  sql := [ Delete ;
    From ]+TmpFilePath( t2 )+[ ;
    Where t2_MAXD = 2 ]
  SimpleSql( sql, TempPath )

  // добавить все наименования r473 с максимальной датой ( группы "отдел закупок" ) в t2
  // но только те, которых нет в t2

  // r08
  sql := [ Update r ;
    Set r_GROUP = CODEGROUP ;
  From  ]+TmpFilePath( r )+[ r ;
    left outer join R08 ON r_KOD = KOD ]
  SimpleSql( sql, ReflisPath )

  sql := [ Update r ;
    Set r_GROUP = 'no' ;
  From  ]+TmpFilePath( r )+[ r ;
    left outer join ]+TmpFilePath( t2 )+[ ON r_KOD = t2_KOD ;
  Where t2_KOD is not null  ]
  SimpleSql( sql, ReflisPath )

  // r -> x
  sql := [ Delete ;
    From ]+TmpFilePath( r )+[ ;
    Where r_GROUP not like '16%' or ( r_1 = 0 and r_2 = 0 ) ]
  SimpleSql( sql, TempPath )

  // t2 -> r
  sql := [ Select t2_KOD, t2_1, t2_2 ;
    From ]+TmpFilePath( t2 )
  SimpleSql( [ Insert into ]+TmpFilePath( r )+[( r_KOD, r_1, r_2 ) ;
    ]+sql, OpdataPath )

  // r -> r2
  sql := [ Select DISTINCT r_KOD, r_1, r_2 ;
    From ]+TmpFilePath( r )
  SimpleSql( [ Insert into ]+TmpFilePath( r2 )+[( r_KOD, r_1, r_2 ) ;
    ]+sql, TempPath )

  // t4
  // t4_KOD - код
  // t4_2   - цена с НДС
  fld := ' t4_KOD,N,5; t4_2,N,14,4 '
  t4 := CreateTmpFile( fld, 't4', ~IsFreeDel:=true )

  // t2
  // t2_KOD  - код
  // t2_DATE - дата
  // t2_MAXD - максимальная ли дата ? ( 1 - максимальная )
  // t2_1    - цена без НДС
  // t2_2    - цена с НДС

  // r
  // r_KOD   - код
  // r_GROUP - группа
  // r_DATE  - дата
  // r_MAXD  - максимальная ли дата ? ( 1 - максимальная )
  // r_1     - цена без НДС
  // r_2     - цена с НДС

  // --- ПОИСК МАКСИМАЛЬНЫХ ЦЕН В СПРАВОЧНИКЕ R473 ***
  sql := [ Select r_KOD, Max( r_2 ) ;
    From ]+TmpFilePath( r2 )+[ ;
    Group by r_KOD ]
  SimpleSql( [ Insert into ]+TmpFilePath( t4 )+[( t4_KOD, t4_2 ) ]+sql, OpdataPath )

  sql := [ Update r2 ;
    Set r_MAXD = 1 ;
    From ]+TmpFilePath( r2 )+[ r2 ;
      left outer join ]+TmpFilePath( t4 )+[ ON r_2 = t4_2 and r_KOD = t4_KOD ;
    Where t4_KOD is not null ]
  SimpleSql( sql, TempPath )

  // очищаю таблицу r от старых цен
  sql := [ Delete ;
    From ]+TmpFilePath( r2 )+[ ;
    Where r_MAXD is null ]
  SimpleSql( sql, TempPath )
  // *** ПОИСК МАКСИМАЛЬНЫХ ЦЕН В СПРАВОЧНИКЕ R473 ***

  // r
  // r_KOD   - код
  // r_GROUP - группа
  // r_DATE  - дата
  // r_MAXD  - максимальная ли дата ? ( 1 - максимальная )
  // r_1     - цена без НДС
  // r_2     - цена с НДС

  // все цены необходимо сохранить с текущей датой
  sql := [ Update r2 ;
    Set r_DATE = ']+SqlDate( Date() )+[' ;
    From ]+TmpFilePath( r2 )+[ r2 ]
  SimpleSql( sql, TempPath )

  // Денис Буров просил удалить все устаревшие записи

  sql := [ Update r2 ;
    Set r_MAXD = 9 ;
    From ]+TmpFilePath( r2 )+[ r2 ;
      left outer join R08 ON r_KOD = KOD ;
    Where SHADOW = true  ]
  SimpleSql( sql, ReflisPath )

  sql := [ Delete ;
    From ]+TmpFilePath( r2 )+[ ;
    Where r_MAXD = 9 ]
  SimpleSql( sql, TempPath )

  // r2 -> r473
  sql := [ Select r_KOD, r_DATE, r_1, r_2 ;
    From ]+TmpFilePath( r2 )
  SimpleSql( [ Insert into R473( KOD, VAR_DATE, PRICE1, OTP_PRICE ) ]+sql, ReflisPath )

finally
  CloseTable( r  )
  CloseTable( r2 )
  CloseTable( t  )
  CloseTable( t2 )
  CloseTable( t3 )
  CloseTable( t4 )
  HideMsg( msg )
end

// t2
// t2_KOD  - код
// t2_DATE - дата
// t2_MAXD - максимальная ли дата ? ( 1 - максимальная )
// t2_1    - цена без НДС
// t2_2    - цена с НДС

// r
// r_KOD  - код
// r_DATE - дата
// r_MAXD - максимальная ли дата ? ( 1 - максимальная )
// r_1    - цена без НДС
// r_2    - цена с НДС

// t
// t_KOD
// t_GROUP

// Для планировщика написать следующую процедуру

// Анализируется MTUN за 3 предыдущих месяца
// Для всей номенклатуры с группой "отдел закупок" необходимо найти последнюю цену поставщика
// Цену поставщика умножаем на 1% и записываем в R473

// После этого анализируем R473
// Если цена номенклатуры не изменилась, с предыдущего раза, удаляем свежую запись в R473

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

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

Функции Delphi