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

Материал из Фабиус wiki
Перейти к: навигация, поиск
м
м (Содержимое страницы заменено на «FILL_R473_TD - это программа из справочника R266 Заполнить справочник R473…»)
 
Строка 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:06, 14 октября 2019

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

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

FILL_R473_TD()

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

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

Функции Delphi