FILL R473 TD
Материал из Фабиус wiki
Версия от 09:12, 26 мая 2017; Hisava (обсуждение | вклад)
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