FILL R473 TD — различия между версиями

Материал из Фабиус wiki
Перейти к: навигация, поиск
м
м
Строка 2: Строка 2:
 
  Заполнить справочник [[R473]] для ТД ( Цены материалов на дату )
 
  Заполнить справочник [[R473]] для ТД ( Цены материалов на дату )
 
[[FILL_R473_TD]]()
 
[[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]]
 
[[Функции Delphi]]

Версия 09:12, 26 мая 2017

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